原文
#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;//初化`COM`.hres = CoInitializeEx(0, COINIT_MULTITHREADED);if (FAILED(hres)){cout << "Failed to initialize COM library. "<< "Error code = 0x"<< hex << hres << endl;return 1;//程序失敗.}//初化hres = CoInitializeSecurity(NULL,-1,//`COM`協商服務NULL,//認證服務NULL,//保留RPC_C_AUTHN_LEVEL_DEFAULT,//認證RPC_C_IMP_LEVEL_IMPERSONATE,//模仿NULL,//認證信息EOAC_NONE,//其他`功能`NULL//保留);if (FAILED(hres)){cout << "Failed to initialize security. "<< "Error code = 0x"<< hex << hres << endl;CoUninitialize();return 1;//程序失敗.}//取特定主機上`窗口`管理的初始定位器.IWbemLocator *pLoc = 0;hres = CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,IID_IWbemLocator, (LPVOID *) &pLoc);if (FAILED(hres)){cout << "Failed to create IWbemLocator object. "<< "Error code = 0x"<< hex << hres << endl;CoUninitialize();return 1;//程序失敗.}IWbemServices *pSvc = 0;//使用當前用戶連接到`root\cimv2``名字空間`,并取`pSvc`指針以調用`IWbemServices`.hres = pLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"),//`WMI``名字空間`NULL,//用戶名NULL,//用戶密碼0,//本地NULL,//安全標志0,//柄0,//`環境`對象&pSvc//`IWbemServices`代理);if (FAILED(hres)){cout << "Could not connect. Error code = 0x"<< hex << hres << endl;pLoc->Release();CoUninitialize();return 1;//程序失敗.}cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl;//設置`IWbemServices`代理,這樣模擬用戶(客戶).hres = 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(hres)){cout << "Could not set proxy blanket. Error code = 0x"<< hex << hres << endl;pSvc->Release();pLoc->Release();CoUninitialize();return 1;//程序失敗.}//使用`IWbemServices`指針發出`WMI`請求.在此處發出請求:如,查詢所有運行中的進程IEnumWbemClassObject* pEnumerator = NULL;hres = pSvc->ExecQuery(bstr_t("WQL"),bstr_t("SELECT * FROM Win32_Process"),WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumerator);if (FAILED(hres)){cout << "Query for processes failed. "<< "Error code = 0x"<< hex << hres << endl;pSvc->Release();pLoc->Release();CoUninitialize();return 1;//程序失敗.}else{IWbemClassObject *pclsObj;ULONG uReturn = 0;while (pEnumerator){hres = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);if(0 == uReturn){break;}VARIANT vtProp;//取`名字`屬性的值hres = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);wcout << "Process Name : " << vtProp.bstrVal << endl;VariantClear(&vtProp);pclsObj->Release();pclsObj = NULL;}}//清理`========`pSvc->Release();pLoc->Release();pEnumerator->Release();CoUninitialize();return 0;//已成功完成計劃.
}