- #define _WIN32_DCOM
- #include <iostream>
- using namespace std;
- #include <comdef.h>
- #include <Wbemidl.h>
- # pragma comment(lib, "wbemuuid.lib")
- IWbemLocator *pLoc = NULL;
- IWbemServices *pSvc = NULL;
- IEnumWbemClassObject* pEnumerator = NULL;
- IWbemClassObject *pclsObj = NULL;
- //http://msdn.microsoft.com/en-us/library/aa390423(VS.85).aspx
- bool IniWMI()
- {
- HRESULT hres;
- // Initialize COM. ------------------------------------------
- hres = CoInitializeEx(0, COINIT_MULTITHREADED);
- if (FAILED(hres))
- {
- cout << "Failed to initialize COM library. Error code = 0x"
- << hex << hres << endl;
- return NULL;
- }
- // 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 NULL;
- }
- // 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 NULL;
- }
- return true;
- }
- void ReleaseWMI()
- {
- if( NULL!=pSvc) pSvc->Release();
- if( NULL!=pLoc) pLoc->Release();
- if( NULL!=pEnumerator) pEnumerator->Release();
- if( NULL!=pclsObj) pclsObj->Release();
- CoUninitialize();
- }
- //bool GetInfoFromWMI( std::string strPath, std::string strSQL )
- bool GetInfoFromWMI()
- {
- HRESULT hres;
- // Connect to WMI through the IWbemLocator::ConnectServer method
- hres = pLoc->ConnectServer(
- //_bstr_t(L"ROOT//CIMV2"), // Object path of WMI namespace
- _bstr_t(L"root//SecurityCenter"), // Object path of WMI namespace
- //_bstr_t( strPath.c_str() ), // 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 false;
- }
- cout << "Connected to ROOT//CIMV2 WMI namespace" << endl;
- // 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;
- ReleaseWMI();
- return false;
- }
- // Use the IWbemServices pointer to make requests of WMI ----
- hres = pSvc->ExecQuery(
- //bstr_t("WQL"),
- //bstr_t("SELECT * FROM Win32_OperatingSystem"),
- _bstr_t(L"WQL"),
- //_bstr_t(L"Select * From AntiVirusProduct"),
- _bstr_t(L"Select * from FirewallProduct"),
- //bstr_t( strSQL.c_str() ),
- 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;
- ReleaseWMI();
- return false;
- }
- return true;
- }
- int main(int argc, char **argv)
- {
- if ( false == IniWMI() ) return 1;
- //if ( false == GetInfoFromWMI( "root//SecurityCenter",
- // "Select * from FirewallProduct" )
- // ) return 1;
- if ( false == GetInfoFromWMI() ) return 1;
- // Get the data from the query in step 6 -------------------
- 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 << " OS Name : " << vtProp.bstrVal << endl;
- // wcout << " Virus Name : " << vtProp.bstrVal << endl;
- //
- // hr = pclsObj->Get(L"VersionNumber", 0, &vtProp, 0, 0);
- // //wcout << " OS Name : " << vtProp.bstrVal << endl;
- // wcout << " Version Number : " << vtProp.bstrVal << endl;
- //
- // hr = pclsObj->Get(L"CompanyName", 0, &vtProp, 0, 0);
- // //wcout << " OS Name : " << vtProp.bstrVal << endl;
- // wcout << " CompanyName : " << vtProp.bstrVal << endl;
- //
- // //hr = pclsObj->Get(L"ProductUptoDate", 0, &vtProp, 0, 0);
- // wcout << " OS Name : " << vtProp.bstrVal << endl;
- // //wcout << " ProductUptoDate : " << vtProp.bstrVal << endl;
- //
- // //hr = pclsObj->Get(L"pathToUpdateUI", 0, &vtProp, 0, 0);
- // wcout << " OS Name : " << vtProp.bstrVal << endl;
- // //wcout << " pathToUpdateUI : " << vtProp.bstrVal << endl;
- //}
- {
- // Get the value of the Name property
- hr = pclsObj->Get(L"displayName", 0, &vtProp, 0, 0);
- //wcout << " OS Name : " << vtProp.bstrVal << endl;
- wcout << " Virus Name : " << vtProp.bstrVal << endl;
- }
- VariantClear(&vtProp);
- }
- // Cleanup
- //pEnumerator->Release();
- //pclsObj->Release();
- //pSvc->Release();
- //pLoc->Release();
- //CoUninitialize();
- ReleaseWMI();
- return 0; // Program successfully completed.
- }
参考:
MSDN Sample
http://msdn.microsoft.com/en-us/library/aa390423(VS.85).aspx
http://msdn.microsoft.com/en-us/library/aa390423(VS.85).aspx
学习笔记 -- 使用WMI获得系统信息
http://blog.csdn.net/flood1984/archive/2007/12/03/1913904.aspx
WMI Administrative Tools
http://www.pczone.com.tw/vbb3/thread/28/139363/
C#