#ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0510 #endif #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #endif #define SECURITY_WIN32 #include #include #include #include #include #include #include "globals.h" static HRESULT GetOSProductSuiteMask( LPCTSTR pszRemoteServer, UINT *pdwMask ); HRESULT GetOSProductSuiteMask( LPCTSTR szRemoteServer, UINT *pdwMask ) { HRESULT hr = S_OK; if( IsBadWritePtr( pdwMask, sizeof( UINT ) ) ) { return E_INVALIDARG; } try { DWORD retCount = 0; TCHAR buf[ 512 ] = {0}; LPCTSTR locatorPath = L"//%s/root/cimv2"; CComBSTR objQry = L"SELECT * FROM Win32_OperatingSystem"; CComPtr pWMIOS; CComPtr pWMISvc; CComPtr pWMILocator; CComPtr pWMIEnum; // // First, compose the locator string // if( szRemoteServer ) { _stprintf( buf, locatorPath, szRemoteServer ); } else { _stprintf( buf, locatorPath, _T(".") ); } hr = pWMILocator.CoCreateInstance( CLSID_WbemLocator ); if( FAILED(hr) ) { throw hr; } BSTR bstrBuf = ::SysAllocString( buf ); if( NULL == bstrBuf ) { throw E_OUTOFMEMORY; } hr = pWMILocator->ConnectServer( bstrBuf, NULL, NULL, NULL, WBEM_FLAG_CONNECT_USE_MAX_WAIT, NULL, NULL, &pWMISvc ); ::SysFreeString( bstrBuf ); if( FAILED(hr) ) { throw hr; } hr = CoSetProxyBlanket( pWMISvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE ); if( FAILED(hr) ) { throw hr; } // // Now get the Win32_OperatingSystem instances and check the first one found // hr = pWMISvc->ExecQuery( CComBSTR( L"WQL" ), objQry, WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_ENSURE_LOCATABLE, NULL, &pWMIEnum ); if( FAILED(hr) ) { throw hr; } hr = pWMIEnum->Next( 60000, 1, &pWMIOS, &retCount ); if( WBEM_S_NO_ERROR == hr ) { VARIANT vt; CIMTYPE cimType; long flavor = 0; ZeroMemory( &vt, sizeof( vt ) ); VariantInit( &vt ); hr = pWMIOS->Get( L"SuiteMask", 0, &vt, &cimType, &flavor ); if( FAILED( hr ) ) { VariantClear( &vt ); throw hr; } if( VT_NULL == vt.vt || VT_EMPTY == vt.vt ) { VariantClear( &vt ); throw E_FAIL; } hr = VariantChangeType( &vt, &vt, 0, VT_UINT ); if( FAILED( hr ) ) { VariantClear( &vt ); throw hr; } *pdwMask = vt.uintVal; } } catch( HRESULT hrErr ) { hr = hrErr; } catch(...) { hr = E_UNEXPECTED; } return hr; } HRESULT IsStandardServer( LPCTSTR szRemoteServer, BOOL *pbResult ) { if( IsBadWritePtr( pbResult, sizeof( BOOL ) ) ) { return E_INVALIDARG; } HRESULT hr = E_FAIL; UINT uSuiteMask = 0; hr = GetOSProductSuiteMask( szRemoteServer, &uSuiteMask ); if( FAILED(hr) ) { return hr; } if( ( uSuiteMask & VER_SUITE_DATACENTER ) || ( uSuiteMask & VER_SUITE_ENTERPRISE ) ) { *pbResult = FALSE; } else { *pbResult = TRUE; } return S_OK; }