#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <comdef.h>
#include <WbemIdl.h>
#pragma comment(lib,"wbemuuid.lib")
int main()
{
HRESULT hr;
// initialize com library
hr = CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hr))
{ cout << "Failed to initialize COM library. Error code = 0x"
<< hex << hr << endl;
return hr;
}
// initialize com security
hr = CoInitializeSecurity(
NULL, // Security descriptor
-1, // COM negotiates authentication service
NULL, // Authentication services
NULL, // Reserved
RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication level for proxies
RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation level for proxies
NULL, // Authentication info
EOAC_NONE, // Additional capabilities of the client or server
NULL); // Reserved
if (FAILED(hr))
{
cout << "Failed to initialize security. Error code = 0x"
<< hex << hr << endl;
CoUninitialize();
return hr; // Program has failed.
}
// initialize WMI IWbemLocator interface.
IWbemLocator *pLoc = 0;
hr = CoCreateInstance(CLSID_WbemLocator, 0,
CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc);
if (FAILED(hr))
{
cout << "Failed to create IWbemLocator object. Err code = 0x"
<< hex << hr << endl;
CoUninitialize();
return hr; // Program has failed.
}
//connect to WMI server.
IWbemServices *pSvc = 0;
// Connect to the root\default namespace with the current user.
hr = pLoc->ConnectServer(
BSTR(L"root\\cimv2"),
NULL, NULL, 0, NULL, 0, 0, &pSvc);
if (FAILED(hr))
{
cout << "Could not connect. Error code = 0x"
<< hex << hr << endl;
pLoc->Release();
CoUninitialize();
return hr; // Program has failed.
}
cout << "Connected to WMI" << endl;
// Set the proxy so that impersonation of the client occurs.
hr = CoSetProxyBlanket(pSvc,
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))
{
cout << "Could not set proxy blanket. Error code = 0x"
<< hex << hr << endl;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return hr; // Program has failed.
}
IEnumWbemClassObject* ppEnum;
hr = pSvc->ExecQuery(
bstr_t("WQL"),
bstr_t("SELECT * FROM Win32_BIOS"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&ppEnum
);
if (FAILED(hr))
{
if (pSvc)pSvc->Release();
if (pLoc)pLoc->Release();
CoUninitialize();
return 0;
}
IWbemClassObject* ppObjects=NULL;
ULONG uReturn=0;
while (ppEnum)
{
hr = ppEnum->Next(
WBEM_INFINITE,
1,
&ppObjects,
&uReturn
);
if (0==uReturn) break;
VARIANT vtProp;
hr = ppObjects->Get(L"Name",0,&vtProp,0,0);
wcout<<"Manufacture Name:"<<_com_util::ConvertBSTRToString(vtProp.bstrVal)<<endl;
hr = ppObjects->Get(L"Manufacturer",0,&vtProp,0,0);
wcout<<"Manufacture Name:"<<_com_util::ConvertBSTRToString(vtProp.bstrVal)<<endl;
VariantClear(&vtProp);
}
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 0;
}
WMI 例子
最新推荐文章于 2020-07-05 01:21:11 发布