原文
#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;//已成功完成计划.
}