//+-------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1994 - 1997. // // File: rsoputil.cpp // // Contents: helper functions for working with the RSOP databases // // History: 10-18-1999 stevebl Created // //--------------------------------------------------------------------------- #include "main.h" #include "rsoputil.h" #pragma warning(4:4535) // set_se_translator used w/o /EHa from sdkinc\provexce.h #include "wbemtime.h" //+-------------------------------------------------------------------------- // // Function: SetParameter // // Synopsis: sets a paramter's value in a WMI parameter list // // Arguments: [pInst] - instance on which to set the value // [szParam] - the name of the parameter // [xData] - the data // // History: 10-08-1999 stevebl Created // // Notes: There may be several flavors of this procedure, one for // each data type. // //--------------------------------------------------------------------------- HRESULT SetParameter(IWbemClassObject * pInst, TCHAR * szParam, TCHAR * szData) { VARIANT var; HRESULT hr = S_OK; var.vt = VT_BSTR; var.bstrVal = SysAllocString(szData); hr = pInst->Put(szParam, 0, &var, 0); SysFreeString(var.bstrVal); return hr; } HRESULT SetParameter(IWbemClassObject * pInst, TCHAR * szParam, SAFEARRAY * psa) { VARIANT var; HRESULT hr = S_OK; var.vt = VT_BSTR | VT_ARRAY; var.parray = psa; hr = pInst->Put(szParam, 0, &var, 0); return hr; } HRESULT SetParameter(IWbemClassObject * pInst, TCHAR * szParam, UINT uiData) { VARIANT var; HRESULT hr = S_OK; var.vt = VT_I4; var.lVal = uiData; hr = pInst->Put(szParam, 0, &var, 0); return hr; } //+-------------------------------------------------------------------------- // // Function: SetParameterToNull // // Synopsis: sets a paramter's value in a WMI parameter list to null // // Arguments: [pInst] - instance on which to set the value // [szParam] - the name of the parameter // // History: 03-01-2000 ericflo Created // // Notes: // //--------------------------------------------------------------------------- HRESULT SetParameterToNull(IWbemClassObject * pInst, TCHAR * szParam) { VARIANT var; var.vt = VT_NULL; return (pInst->Put(szParam, 0, &var, 0)); } //+-------------------------------------------------------------------------- // // Function: GetParameter // // Synopsis: retrieves a parameter value from a WMI paramter list // // Arguments: [pInst] - instance to get the paramter value from // [szParam] - the name of the paramter // [xData] - [out] data // // History: 10-08-1999 stevebl Created // // Notes: There are several flavors of this procedure, one for each // data type. // //--------------------------------------------------------------------------- HRESULT GetParameter(IWbemClassObject * pInst, TCHAR * szParam, TCHAR * &szData, BOOL bUseLocalAlloc /*=FALSE*/ ) { VARIANT var; HRESULT hr = S_OK; if (!pInst) return E_INVALIDARG; VariantInit(&var); hr = pInst->Get(szParam, 0, &var, 0, 0); if (SUCCEEDED(hr)) { if (var.vt == VT_BSTR) { if ( szData != NULL ) { if ( bUseLocalAlloc ) { LocalFree( szData ); } else { delete [] szData; } szData = NULL; } ULONG ulNoChars; ulNoChars = _tcslen(var.bstrVal)+1; if ( bUseLocalAlloc ) { szData = (TCHAR*)LocalAlloc( LPTR, sizeof(TCHAR) * ulNoChars ); } else { szData = new TCHAR[ulNoChars]; } if ( szData != NULL ) { hr = StringCchCopy(szData, ulNoChars, var.bstrVal); } else { hr = E_OUTOFMEMORY; } } else { hr = E_UNEXPECTED; } } VariantClear(&var); return hr; } HRESULT GetParameterBSTR(IWbemClassObject * pInst, TCHAR * szParam, BSTR &bstrData) { VARIANT var; HRESULT hr = S_OK; if (!pInst) return E_INVALIDARG; VariantInit(&var); hr = pInst->Get(szParam, 0, &var, 0, 0); if (SUCCEEDED(hr)) { if (var.vt == VT_BSTR) { if (bstrData) { SysFreeString(bstrData); } bstrData = SysAllocStringLen(var.bstrVal, SysStringLen(var.bstrVal)); if (NULL == bstrData) { hr = E_OUTOFMEMORY; } } else { hr = E_UNEXPECTED; } } VariantClear(&var); return hr; } HRESULT GetParameter(IWbemClassObject * pInst, TCHAR * szParam, BOOL &fData) { VARIANT var; HRESULT hr = S_OK; if (!pInst) return E_INVALIDARG; VariantInit(&var); hr = pInst->Get(szParam, 0, &var, 0, 0); if (SUCCEEDED(hr)) { if (var.vt == VT_BOOL) { fData = var.bVal; } else { hr = E_UNEXPECTED; } } VariantClear(&var); return hr; } HRESULT GetParameter(IWbemClassObject * pInst, TCHAR * szParam, LPWSTR *&szStringArray, DWORD &dwSize) { VARIANT var; HRESULT hr = S_OK; SAFEARRAY *pArray; long lSafeArrayUBound; long lSafeArrayLBound; long lSafeArrayLen; long lCount = 0; if (!pInst) return E_INVALIDARG; VariantInit(&var); hr = pInst->Get(szParam, 0, &var, 0, 0); if (SUCCEEDED(hr)) { if (var.vt == (VT_ARRAY | VT_BSTR)) { pArray = var.parray; hr = SafeArrayGetUBound(pArray, 1, &lSafeArrayUBound); if (FAILED(hr)) { return hr; } hr = SafeArrayGetLBound(pArray, 1, &lSafeArrayLBound); if (FAILED(hr)) { return hr; } lSafeArrayLen = 1+(lSafeArrayUBound-lSafeArrayLBound); szStringArray = (LPWSTR *)LocalAlloc(LPTR, sizeof(LPWSTR)*lSafeArrayLen); if (!szStringArray) { hr = E_OUTOFMEMORY; return hr; } for (lCount = 0; lCount < lSafeArrayLen; lCount++) { long lIndex = lSafeArrayLBound+lCount; BSTR bstrElement; hr = SafeArrayGetElement(pArray, &lIndex, &bstrElement); if (FAILED(hr)) { break; } ULONG ulNoChars = 1+lstrlen(bstrElement); szStringArray[lCount] = (LPWSTR)LocalAlloc(LPTR, sizeof(WCHAR)*ulNoChars); if (!szStringArray[lCount]) { hr = E_OUTOFMEMORY; SysFreeString(bstrElement); break; } hr = StringCchCopy(szStringArray[lCount], ulNoChars, bstrElement); ASSERT(SUCCEEDED(hr)); SysFreeString(bstrElement); } // if there was an error free the remaining elements if (FAILED(hr)) { for (;lCount > 0; lCount-- ) { LocalFree(szStringArray[lCount]); } szStringArray = NULL; } else { dwSize = lSafeArrayLen; hr = S_OK; } } else { hr = E_UNEXPECTED; } } VariantClear(&var); return hr; } HRESULT GetParameter(IWbemClassObject * pInst, TCHAR * szParam, HRESULT &hrData) { VARIANT var; HRESULT hr = S_OK; if (!pInst) return E_INVALIDARG; VariantInit(&var); hr = pInst->Get(szParam, 0, &var, 0, 0); if (SUCCEEDED(hr)) { if (var.vt == VT_I4) { hrData = (HRESULT) var.lVal; } else { hr = E_UNEXPECTED; } } VariantClear(&var); return hr; } HRESULT GetParameter(IWbemClassObject * pInst, TCHAR * szParam, ULONG &ulData) { VARIANT var; HRESULT hr = S_OK; if (!pInst) return E_INVALIDARG; VariantInit(&var); hr = pInst->Get(szParam, 0, &var, 0, 0); if (SUCCEEDED(hr)) { if ((var.vt == VT_UI4) || (var.vt == VT_I4)) { ulData = var.ulVal; } else { hr = E_UNEXPECTED; } } VariantClear(&var); return hr; } HRESULT GetParameterBytes(IWbemClassObject * pInst, TCHAR * szParam, LPBYTE * lpData, DWORD *dwDataSize) { VARIANT var; HRESULT hr = S_OK; SAFEARRAY * pSafeArray; DWORD dwSrcDataSize; LPBYTE lpSrcData; if (!pInst) return E_INVALIDARG; VariantInit(&var); hr = pInst->Get(szParam, 0, &var, 0, 0); if (SUCCEEDED(hr)) { if (var.vt != VT_NULL) { pSafeArray = var.parray; dwSrcDataSize = pSafeArray->rgsabound[0].cElements; lpSrcData = (LPBYTE) pSafeArray->pvData; *lpData = (LPBYTE)LocalAlloc (LPTR, dwSrcDataSize); if (!(*lpData)) { return HRESULT_FROM_WIN32(GetLastError()); } CopyMemory (*lpData, lpSrcData, dwSrcDataSize); *dwDataSize = dwSrcDataSize; } else { hr = E_UNEXPECTED; } } VariantClear(&var); return hr; } HRESULT WINAPI ImportRSoPData (LPOLESTR lpNameSpace, LPOLESTR lpFileName) { IMofCompiler * pIMofCompiler; HRESULT hr; WBEM_COMPILE_STATUS_INFO info; // // Check args // if (!lpNameSpace) { DebugMsg((DM_WARNING, TEXT("LoadNameSpaceFromFile: Null namespace arg"))); return E_INVALIDARG; } if (!lpFileName) { DebugMsg((DM_WARNING, TEXT("LoadNameSpaceFromFile: Null filename arg"))); return E_INVALIDARG; } // // Create an instance of the mof compiler // hr = CoCreateInstance(CLSID_MofCompiler, NULL, CLSCTX_INPROC_SERVER, IID_IMofCompiler, (LPVOID *) &pIMofCompiler); if (FAILED(hr)) { DebugMsg((DM_WARNING, TEXT("LoadNameSpaceFromFile: CoCreateInstance failed with 0x%x"), hr)); return hr; } // // Compile the file // ZeroMemory (&info, sizeof(info)); hr = pIMofCompiler->CompileFile (lpFileName, lpNameSpace, NULL, NULL, NULL, 0, 0, 0, &info); if (FAILED(hr)) { DebugMsg((DM_WARNING, TEXT("LoadNameSpaceFromFile: CompileFile failed with 0x%x"), hr)); } pIMofCompiler->Release(); return hr; } BOOL WriteMofFile (HANDLE hFile, LPTSTR lpData) { DWORD dwBytesWritten, dwAnsiDataSize, dwByteCount, dwLFCount = 0; LPSTR lpAnsiData; LPTSTR lpTemp, lpRealData, lpDest; // // The lpData argument contains linefeed characters only. We need to convert // these to CR LF characters. Loop through the data to determine how many LFs // need to be converted. // lpTemp = lpData; while (*lpTemp) { if (*lpTemp == 0x0A) { dwLFCount++; } lpTemp++; } // // Allocate a new buffer to hold the string plus CR characters // lpRealData = (LPTSTR) LocalAlloc (LPTR, (lstrlen(lpData) + dwLFCount + 1) * sizeof(TCHAR)); if (!lpRealData) { DebugMsg((DM_WARNING, TEXT("WriteMofFile: LocalAlloc failed with %d"), GetLastError())); return FALSE; } // // Copy the string replacing LF with CRLF as we find them // lpDest = lpRealData; lpTemp = lpData; while (*lpTemp) { if (*lpTemp == 0x0A) { *lpDest = 0x0D; lpDest++; } *lpDest = *lpTemp; lpDest++; lpTemp++; } // // Allocate a buffer to hold the ANSI data // dwAnsiDataSize = lstrlen (lpRealData) * 2; lpAnsiData = (LPSTR) LocalAlloc (LPTR, dwAnsiDataSize); if (!lpAnsiData) { DebugMsg((DM_WARNING, TEXT("WriteMofFile: LocalAlloc failed with %d"), GetLastError())); LocalFree (lpRealData); return FALSE; } // // Convert the buffer // dwByteCount = (DWORD) WideCharToMultiByte (CP_ACP, 0, lpRealData, lstrlen(lpRealData), lpAnsiData, dwAnsiDataSize, NULL, NULL); LocalFree (lpRealData); if (!dwByteCount) { DebugMsg((DM_WARNING, TEXT("WriteMofFile: WriteFile failed with %d"), GetLastError())); LocalFree (lpAnsiData); return FALSE; } // // Write the mof description to the file // if (!WriteFile (hFile, lpAnsiData, dwByteCount, &dwBytesWritten, NULL)) { DebugMsg((DM_WARNING, TEXT("WriteMofFile: WriteFile failed with %d"), GetLastError())); LocalFree (lpAnsiData); return FALSE; } LocalFree (lpAnsiData); // // Make sure it was all written to the file // if (dwByteCount != dwBytesWritten) { DebugMsg((DM_WARNING, TEXT("WriteMofFile: Failed to write the correct amount of data."))); SetLastError(ERROR_INVALID_DATA); return FALSE; } return TRUE; } HRESULT EnumInstances (IWbemServices * pIWbemServices, BSTR pClassName, HANDLE hFile) { IWbemClassObject *pObjects[2], *pObject; IEnumWbemClassObject *pEnum = NULL; ULONG ulCount; HRESULT hr; BSTR bstrClass; DWORD dwError; // // Create the instance enumerator // hr = pIWbemServices->CreateInstanceEnum (pClassName, WBEM_FLAG_DEEP | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnum); if (FAILED(hr)) { DebugMsg((DM_WARNING, TEXT("EnumInstances: CreateInstanceEnum failed with 0x%x"), hr)); return hr; } // // Walk through the list // while (pEnum->Next(WBEM_INFINITE, 1, pObjects, &ulCount) == S_OK) { pObject = pObjects[0]; // // Get the mof description of this class // hr = pObject->GetObjectText (0, &bstrClass); pObject->Release(); if (FAILED(hr)) { DebugMsg((DM_WARNING, TEXT("EnumInstances: GetObjectText failed with 0x%x"), hr)); pEnum->Release(); return hr; } // // Write the mof description to the file // if (!WriteMofFile (hFile, bstrClass)) { dwError = GetLastError(); DebugMsg((DM_WARNING, TEXT("EnumInstances: WriteMofFile failed with %d"), dwError)); SysFreeString (bstrClass); pEnum->Release(); return HRESULT_FROM_WIN32(dwError); } SysFreeString (bstrClass); } pEnum->Release(); return hr; } HRESULT EnumNameSpace (IWbemServices * pIWbemServices, HANDLE hFile) { IWbemClassObject *pObjects[2], *pObject; IEnumWbemClassObject *pEnum = NULL; ULONG ulCount; HRESULT hr; VARIANT var; BSTR bstrClass; DWORD dwError; // // Create the class enumerator // hr = pIWbemServices->CreateClassEnum (NULL, WBEM_FLAG_DEEP | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnum); if (FAILED(hr)) { DebugMsg((DM_WARNING, TEXT("EnumNameSpace: CreateClassEnum failed with 0x%x"), hr)); return hr; } // // Walk through the list // while (pEnum->Next(WBEM_INFINITE, 1, pObjects, &ulCount) == S_OK) { pObject = pObjects[0]; // // Get the class name // hr = pObject->Get (TEXT("__CLASS"), 0, &var, NULL, NULL); if (FAILED(hr)) { DebugMsg((DM_WARNING, TEXT("EnumNameSpace: Failed to get class name with 0x%x"), hr)); pEnum->Release(); return hr; } // // Check if this is a system class. System classes start with "_" // if (var.bstrVal[0] != TEXT('_')) { // // Get the mof description of this class // hr = pObject->GetObjectText (0, &bstrClass); if (FAILED(hr)) { DebugMsg((DM_WARNING, TEXT("EnumNameSpace: GetObjectText failed with 0x%x"), hr)); VariantClear (&var); pEnum->Release(); return hr; } // // Write the mof description to the file // if (!WriteMofFile (hFile, bstrClass)) { dwError = GetLastError(); DebugMsg((DM_WARNING, TEXT("EnumNameSpace: WriteMofFile failed with %d"), dwError)); SysFreeString (bstrClass); VariantClear (&var); pEnum->Release(); return HRESULT_FROM_WIN32(dwError); } SysFreeString (bstrClass); // // Now enumerate the instances of this class // hr = EnumInstances (pIWbemServices, var.bstrVal, hFile); if (FAILED(hr)) { DebugMsg((DM_WARNING, TEXT("EnumNameSpace: EnumInstances failed with 0x%x"), hr)); VariantClear (&var); pEnum->Release(); return hr; } } VariantClear (&var); } pEnum->Release(); return hr; } HRESULT WINAPI ExportRSoPData (LPTSTR lpNameSpace, LPTSTR lpFileName) { IWbemLocator *pIWbemLocator; IWbemServices *pIWbemServices; HANDLE hFile; HRESULT hr; DWORD dwError; // // Open the data file // hFile = CreateFile (lpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { dwError = GetLastError(); DebugMsg((DM_WARNING, TEXT("ExportRSoPData: CreateFile for %s failed with %d"), lpFileName, dwError)); return HRESULT_FROM_WIN32(dwError); } // // Create a locater instance // hr = CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pIWbemLocator); if (FAILED(hr)) { DebugMsg((DM_WARNING, TEXT("ExportRSoPData: CoCreateInstance failed with 0x%x"), hr)); CloseHandle (hFile); return hr; } // // Connect to the server // BSTR bstrNameSpace = SysAllocString( lpNameSpace ); if ( bstrNameSpace == NULL ) { DebugMsg((DM_WARNING, TEXT("ExportRSoPData: Failed to allocate BSTR memory."))); pIWbemLocator->Release(); CloseHandle(hFile); return E_OUTOFMEMORY; } hr = pIWbemLocator->ConnectServer(bstrNameSpace, NULL, NULL, 0, 0, NULL, NULL, &pIWbemServices); SysFreeString( bstrNameSpace ); if (FAILED(hr)) { DebugMsg((DM_WARNING, TEXT("ExportRSoPData: ConnectServer to %s failed with 0x%x"), lpNameSpace, hr)); pIWbemLocator->Release(); CloseHandle (hFile); return hr; } // Set the proper security to encrypt the data hr = CoSetProxyBlanket(pIWbemServices, RPC_C_AUTHN_DEFAULT, RPC_C_AUTHZ_DEFAULT, COLE_DEFAULT_PRINCIPAL, RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, 0); if (FAILED(hr)) { DebugMsg((DM_WARNING, TEXT("ExportRSoPData: CoSetProxyBlanket failed with 0x%x"), hr)); pIWbemServices->Release(); pIWbemLocator->Release(); CloseHandle (hFile); return hr; } // // Enumerate the classes and instances // hr = EnumNameSpace (pIWbemServices, hFile); if (FAILED(hr)) { DebugMsg((DM_WARNING, TEXT("ExportRSoPData: EnumNameSpace failed with 0x%x"), hr)); } CloseHandle (hFile); pIWbemServices->Release(); pIWbemLocator->Release(); return hr; } //****************************************************************************** // // Function: WbemTimeToSystemTime // // Description: // // Parameters: // // Return: // // History: 08-16-2000 stevebl rewrote to use WBEMTime class // //****************************************************************************** HRESULT WbemTimeToSystemTime(XBStr& xbstrWbemTime, SYSTEMTIME& sysTime) { HRESULT hr = E_FAIL; WBEMTime wt(xbstrWbemTime); if (wt.GetSYSTEMTIME(&sysTime)) { hr = S_OK; } return hr; } //------------------------------------------------------- HRESULT ExtractWQLFilters (LPTSTR lpNameSpace, DWORD* pdwCount, LPTSTR** paszNames, LPTSTR** paszFilters, BOOL bReturnIfTrueOnly ) { HRESULT hr; ULONG n; IWbemClassObject * pObjGPO = NULL; IEnumWbemClassObject * pEnum = NULL; BSTR strQueryLanguage = SysAllocString(TEXT("WQL")); BSTR strQuery = SysAllocString(TEXT("SELECT * FROM RSOP_GPO")); BSTR bstrFilterId = NULL; IWbemLocator * pLocator = NULL; IWbemServices * pNamespace = NULL; LPTSTR lpDisplayName; INT iIndex; LONG lCount=0, lCountAllocated = 0, l=0; LPTSTR* aszWQLFilterIds = NULL; // Get a locator instance hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&pLocator); if (FAILED(hr)) { DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::ExtractWQLFilters: CoCreateInstance failed with 0x%x"), hr)); goto cleanup; } // Connect to the namespace BSTR bstrNameSpace = SysAllocString( lpNameSpace ); if ( bstrNameSpace == NULL ) { DebugMsg((DM_WARNING, TEXT("ExportRSoPData: Failed to allocate BSTR memory."))); hr = E_OUTOFMEMORY; goto cleanup; } hr = pLocator->ConnectServer(bstrNameSpace, NULL, NULL, NULL, 0, NULL, NULL, &pNamespace); SysFreeString( bstrNameSpace ); if (FAILED(hr)) { DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::ExtractWQLFilters: ConnectServer failed with 0x%x"), hr)); goto cleanup; } // Set the proper security to encrypt the data hr = CoSetProxyBlanket(pNamespace, RPC_C_AUTHN_DEFAULT, RPC_C_AUTHZ_DEFAULT, COLE_DEFAULT_PRINCIPAL, RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, 0); if (FAILED(hr)) { DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::ExtractWQLFilters: CoSetProxyBlanket failed with 0x%x"), hr)); goto cleanup; } // Query for the RSOP_GPO instances hr = pNamespace->ExecQuery(strQueryLanguage, strQuery, WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY, NULL, &pEnum); if (FAILED(hr)) { DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::ExtractWQLFilters: ExecQuery failed with 0x%x"), hr)); goto cleanup; } // Allocate memory for 10 - should be enough for most cases aszWQLFilterIds = (LPTSTR*)LocalAlloc(LPTR, sizeof(LPTSTR)*(lCountAllocated+10)); if ( aszWQLFilterIds == 0 ) { hr = HRESULT_FROM_WIN32(GetLastError()); DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::ExtractWQLFilters: LocalAlloc failed with 0x%x"), hr)); goto cleanup; } lCountAllocated += 10; // Loop through the results while (TRUE) { // Get one instance of RSOP_GPO hr = pEnum->Next(WBEM_INFINITE, 1, &pObjGPO, &n); if (FAILED(hr) || (n == 0)) { hr = S_OK; break; } // Allocate more memory if necessary if ( lCount == lCountAllocated ) { LPTSTR* aszNewWQLFilterIds = (LPTSTR*)LocalAlloc(LPTR, sizeof(LPTSTR)*(lCountAllocated+10)); if ( aszNewWQLFilterIds == NULL ) { hr = HRESULT_FROM_WIN32(GetLastError()); DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::ExtractWQLFilters: LocalAlloc failed with 0x%x"), hr)); goto cleanup; } lCountAllocated += 10; for (l=0; l < lCount; l++) { aszNewWQLFilterIds[l] = aszWQLFilterIds[l]; } LocalFree(aszWQLFilterIds); aszWQLFilterIds = aszNewWQLFilterIds; } // Get the filter id aszWQLFilterIds[lCount] = NULL; hr = GetParameter(pObjGPO, TEXT("filterId"), aszWQLFilterIds[lCount], TRUE); if (FAILED(hr)) { goto LoopAgain; } // if only successful filters need to be returned, check gilterallowed attribute as well if (bReturnIfTrueOnly) { BOOL bFilterAllowed; hr = GetParameter(pObjGPO, TEXT("filterAllowed"), bFilterAllowed); // if it is not there assume it to be false if (FAILED(hr)) { goto LoopAgain; } if (!bFilterAllowed) { goto LoopAgain; } DebugMsg((DM_VERBOSE, TEXT("CRSOPComponentData::ExtractWQLFilters: Filter <%s> evaluates to true on gpo"), aszWQLFilterIds[lCount])); } if (!aszWQLFilterIds[lCount] || !(*aszWQLFilterIds[lCount]) || (*aszWQLFilterIds[lCount] == TEXT(' '))) { if (aszWQLFilterIds[lCount]) { LocalFree( aszWQLFilterIds[lCount] ); } goto LoopAgain; } #ifdef DBG BSTR bstrGPOName; bstrGPOName = NULL; hr = GetParameterBSTR(pObjGPO, TEXT("name"), bstrGPOName); if ( (SUCCEEDED(hr)) && (bstrGPOName) ) { DebugMsg((DM_VERBOSE, TEXT("CRSOPComponentData::ExtractWQLFilters: Found filter on GPO <%s>"), bstrGPOName)); SysFreeString (bstrGPOName); bstrGPOName = NULL; } hr = S_OK; #endif // Eliminate duplicates for ( l=0; l < lCount; l++ ) { if (lstrcmpi(aszWQLFilterIds[lCount], aszWQLFilterIds[l]) == 0) { break; } } if ((lCount != 0) && (l != lCount)) { DebugMsg((DM_VERBOSE, TEXT("CRSOPComponentData::ExtractWQLFilters: filter = <%s> is a duplicate"), aszWQLFilterIds[lCount])); LocalFree(aszWQLFilterIds[lCount]); goto LoopAgain; } DebugMsg((DM_VERBOSE, TEXT("CRSOPComponentData::ExtractWQLFilters: filter = <%s>"), aszWQLFilterIds[lCount])); lCount++; LoopAgain: pObjGPO->Release(); pObjGPO = NULL; } // Now allocate arrays. if ( lCount == 0 ) { *pdwCount = 0; *paszNames = NULL; *paszFilters = NULL; goto cleanup; } *paszNames = (LPTSTR*)LocalAlloc( LPTR, sizeof(LPTSTR) * lCount ); if ( *paszNames == NULL ) { hr = E_FAIL; goto cleanup; } *paszFilters = (LPTSTR*)LocalAlloc( LPTR, sizeof(LPTSTR) * lCount ); if ( *paszFilters == NULL ) { LocalFree( *paszNames ); *paszNames = NULL; hr = E_FAIL; goto cleanup; } *pdwCount = lCount; for ( l = 0; l < lCount; l++ ) { (*paszFilters)[l] = aszWQLFilterIds[l]; // Get the filter's friendly display name lpDisplayName = GetWMIFilterDisplayName (NULL, aszWQLFilterIds[l], FALSE, TRUE); if ( lpDisplayName == NULL ) { ULONG ulNoChars = _tcslen(aszWQLFilterIds[l])+1; DebugMsg((DM_WARNING, TEXT("CRSOPComponentData::ExtractWQLFilters: Failed to get display name for filter id: %s"), aszWQLFilterIds[l])); (*paszNames)[l] = (LPTSTR)LocalAlloc( LPTR, sizeof(TCHAR) * ulNoChars ); if ( (*paszNames)[l] != NULL ) { hr = StringCchCopy( (*paszNames)[l], ulNoChars, aszWQLFilterIds[l] ); ASSERT(SUCCEEDED(hr)); } } else { ULONG ulNoChars = _tcslen(lpDisplayName)+1; (*paszNames)[l] = (LPTSTR)LocalAlloc( LPTR, sizeof(TCHAR) * ulNoChars ); if ( (*paszNames)[l] != NULL ) { hr = StringCchCopy( (*paszNames)[l], ulNoChars, lpDisplayName ); ASSERT(SUCCEEDED(hr)); } delete lpDisplayName; } } LocalFree( aszWQLFilterIds ); aszWQLFilterIds = NULL; cleanup: if (bstrFilterId) { SysFreeString (bstrFilterId); } if (pObjGPO) { pObjGPO->Release(); } if (pEnum) { pEnum->Release(); } if (pNamespace) { pNamespace->Release(); } if (pLocator) { pLocator->Release(); } if (aszWQLFilterIds) { for (l=0; l < lCount; l++) { if (aszWQLFilterIds[l]) LocalFree(aszWQLFilterIds[l]); } LocalFree(aszWQLFilterIds); } SysFreeString(strQueryLanguage); SysFreeString(strQuery); return hr; } //-------------------------------------------------------