none
WMI-C++取杀软信息的问题,熟悉WMI的C++ 高手麻烦帮下忙! RRS feed

  • 问题

  • #define _WIN32_DCOM   
    
    #include <iostream>   
    
    using namespace std;   
    
    #include <comdef.h>   
    
    #include <Wbemidl.h>   
    
    
    # pragma comment(lib, "wbemuuid.lib")   
    
    
    int main(int argc, char **argv)   
    
    {   
    
    	HRESULT hres;   
    
    
    	// Step 1: --------------------------------------------------   
    
    	// Initialize COM. ------------------------------------------   
    
    
    	hres =  CoInitializeEx(0, COINIT_MULTITHREADED);    
    
    	if (FAILED(hres))   
    
    	{   
    
    		cout << "Failed to initialize COM library. Error code = 0x"    
    
    			<< hex << hres << endl;   
    
    		return 1;                  // Program has failed.   
    
    	}   
    
    
    	// Step 2: --------------------------------------------------   
    
    	// Set general COM security levels --------------------------   
    
    
    	hres =  CoInitializeSecurity(   
    
    		NULL,    
    
    		-1,                          // COM authentication   
    
    		NULL,                        // Authentication services   
    
    		NULL,                        // Reserved   
    
    		RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication    
    
    		RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation     
    
    		NULL,                        // Authentication info   
    
    		EOAC_NONE,                   // Additional capabilities    
    
    		NULL                         // Reserved   
    
    		);             
    
    	if (FAILED(hres))   
    
    	{   
    
    		cout << "Failed to initialize security. Error code = 0x"    
    
    			<< hex << hres << endl;   
    
    		CoUninitialize();   
    
    		return 1;                    // Program has failed.   
    
    	}   
    
    
    	// Step 3: ---------------------------------------------------   
    
    	// Obtain the initial locator to WMI -------------------------   
    
    
    	IWbemLocator *pLoc = NULL;   
    
    
    	hres = CoCreateInstance(   
    
    		CLSID_WbemLocator,                
    
    		0,    
    
    		CLSCTX_INPROC_SERVER,    
    
    		IID_IWbemLocator, (LPVOID *) &pLoc);   
    
    
    	if (FAILED(hres))   
    
    	{   
    
    		cout << "Failed to create IWbemLocator object."  
    
    			<< " Err code = 0x"  
    
    			<< hex << hres << endl;   
    
    		CoUninitialize();   
    
    		return 1;                 // Program has failed.   
    
    	}   
    
    
    	// Step 4: -----------------------------------------------------   
    
    	// Connect to WMI through the IWbemLocator::ConnectServer method   
    
    
    	IWbemServices *pSvc = NULL;   
    
    	// Connect to the root\SecurityCenter namespace with   
    
    	// the current user and obtain pointer pSvc   
    
    	// to make IWbemServices calls.   
    
    	hres = pLoc->ConnectServer(   
    
    		_bstr_t(L"ROOT\\SecurityCenter"), // Object path of WMI namespace   
    
    		NULL,                    // User name. NULL = current user   
    
    		NULL,                    // User password. NULL = current   
    
    		0,                       // Locale. NULL indicates current   
    
    		NULL,                    // Security flags.   
    
    		0,                       // Authority (e.g. Kerberos)   
    
    		0,                       // Context object    
    
    		&pSvc                    // pointer to IWbemServices proxy   
    
    		);   
    
    
    	if (FAILED(hres))   
    
    	{   
    
    		cout << "Could not connect. Error code = 0x"    
    
    			<< hex << hres << endl;   
    
    		pLoc->Release();        
    
    		CoUninitialize();   
    
    		return 1;                // Program has failed.   
    
    	}   
    
    
    	cout << "Connected to ROOT\\SecurityCenter WMI namespace" << endl;    
    
    	// Step 5: --------------------------------------------------   
    
    	// Set security levels on the proxy -------------------------   
    
    
    	hres = CoSetProxyBlanket(   
    
    		pSvc,                        // Indicates the proxy to set   
    
    		RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx   
    
    		RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx   
    
    		NULL,                        // Server principal name    
    
    		RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx    
    
    		RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx   
    
    		NULL,                        // client identity   
    
    		EOAC_NONE                    // proxy capabilities    
    
    		);   
    
    
    	if (FAILED(hres))   
    
    	{   
    
    		cout << "Could not set proxy blanket. Error code = 0x"    
    
    			<< hex << hres << endl;   
    
    		pSvc->Release();   
    
    		pLoc->Release();        
    
    		CoUninitialize();   
    
    		return 1;               // Program has failed.   
    
    	}   
    
    
    	// Step 6: --------------------------------------------------   
    
    	// Use the IWbemServices pointer to make requests of WMI ----   
    
    
    	// For example, get the name of the operating system   
    
    	IEnumWbemClassObject* pEnumerator = NULL;   
    
    	hres = pSvc->ExecQuery(   
    
    		bstr_t("WQL"),    
    
    		bstr_t("SELECT * FROM AntiVirusProduct"),   
    
    		WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,    
    
    		NULL,   
    
    		&pEnumerator);   
    
    
    	if (FAILED(hres))   
    
    	{   
    
    		cout << "Query for operating system name failed."  
    
    			<< " Error code = 0x"    
    
    			<< hex << hres << endl;   
    
    		pSvc->Release();   
    
    		pLoc->Release();   
    
    		CoUninitialize();   
    
    		return 1;               // Program has failed.   
    
    	}   
    
    
    	// Step 7: -------------------------------------------------   
    
    	// Get the data from the query in step 6 -------------------   
    
    
    	IWbemClassObject *pclsObj;   
    
    	ULONG uReturn = 0;   
    
    
    	while (pEnumerator)   
    
    	{   
    
    		HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,    
    
    			&pclsObj, &uReturn);   
    
    
    		if(0 == uReturn)   
    
    		{   
    
    			break;   
    
    		}   
    
    
    		VARIANT vtProp;   
    
    
    		// Get the value of the Name property   
    
    		hr = pclsObj->Get(L"displayName", 0, &vtProp, 0, 0);   
    
    		wcout << "AV  Product displayName : " << vtProp.bstrVal << endl;   
    
    		hr = pclsObj->Get(L"companyName", 0, &vtProp, 0, 0);   
    
    		wcout << "AV  Product companyName : " << vtProp.bstrVal << endl;   
    
    		hr = pclsObj->Get(L"pathToSignedProductExe", 0, &vtProp, 0, 0);   
    
    		wcout << "AV  Product pathToSignedProductExe : " << vtProp.bstrVal << endl;            
    
    		hr = pclsObj->Get(L"versionNumber", 0, &vtProp, 0, 0);   
    
    		wcout << "AV  Product versionNumber : " << vtProp.bstrVal << endl;              
    
    		VariantClear(&vtProp);    
    
    		pclsObj->Release();   
    
    	}   
    
    
    	// Cleanup   
    
    	// ========   
    
    
    	pSvc->Release();   
    
    	pLoc->Release();   
    
    	pEnumerator->Release();   
    
    	//pclsObj->Release();   
    
    	CoUninitialize();   
    
    
    	return 0;   // Program successfully completed.   
    
    }  

    全部代码如上,为什么别人能够通过 ,我这里却什么都去不出来 ,VC++2008SP1 VISTA SP2
     hres = pSvc->ExecQuery(  

      bstr_t("WQL"),   

      bstr_t("SELECT * FROM AntiVirusProduct"),  

      WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,   

      NULL,  

      &pEnumerator);  
    这条语句好像有问题 我调试的时候 pEnumerator  这个值一点都取不出来。为什么啊?我把编译好的放在 XP下也一样的问题

    实在不知道代码哪儿有问题!


    …|▌'寔堅蔃の/「≯還寔╪.逞蔃﹖
    2010年1月23日 6:07

答案

全部回复