本帖最后由 tp1623 于 2011-08-24 10:57:19 编辑

解决方案 »

  1.   

    BOOL CAntivirusDetection::__AskSecurityCenter()
    {
    // Step 0: --------------------------------------------------
    // 查看SecurityCenter服务是否存在 ---------------------------
    if (!__IsExistService(_T("wscsvc")))
    {
    return FALSE;
    } HRESULT hres;    // Step 1: --------------------------------------------------   
    // Initialize COM. ------------------------------------------   
    hres =  CoInitializeEx(0, COINIT_MULTITHREADED);    
    if (FAILED(hres))   
    {   
    return FALSE;                 // 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))   
    {   
    return FALSE;                // 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))   
    {   
    return FALSE;              // 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))   
    {          
    CoUninitialize();   
    return FALSE;                // Program has failed.   
    }    // 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))   
    {   
    pSvc->Release();   
    pLoc->Release();        
    CoUninitialize();   
    return FALSE;               // 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))   
    {   
    pSvc->Release();   
    pLoc->Release();   
    CoUninitialize();   
    return FALSE;               // 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)   
    {   
    // Cleanup   
    // ========  
    pclsObj->Release();   
    pSvc->Release();   
    pLoc->Release();   
    pEnumerator->Release();   
    CoUninitialize();   
    return FALSE;
    }    VARIANT vtProp;   
    // Get the value of the Name property   
    hr = pclsObj->Get(L"displayName", 0, &vtProp, 0, 0);   
    hr = pclsObj->Get(L"companyName", 0, &vtProp, 0, 0);    
    hr = pclsObj->Get(L"pathToSignedProductExe", 0, &vtProp, 0, 0);            
    hr = pclsObj->Get(L"versionNumber", 0, &vtProp, 0, 0);               
    VariantClear(&vtProp);    
    pclsObj->Release();   
    }    // Cleanup   
    // ========   
    pSvc->Release();   
    pLoc->Release();   
    pEnumerator->Release();    //pclsObj->Release();   
    CoUninitialize();    return TRUE;
    }
      

  2.   

    windows 2003下没有ROOT\\SecurityCenter命名空间,走WMI走不通。