- 浏览: 79875 次
- 性别:
- 来自: 苏州
文章分类
最新评论
(C++)从本机获取WMI数据.
下面的步骤被用于执行WMI程序. 第1步到第5步包含了建立和连接WMI的所有步骤。第6,7步用于数据查询和获取。
1. 通过调用CoInitialzeEx来初始化COM参数.
2. 通过调用CoInitializeSecurity来初始化COM过程安全.
3. 通过调用CoCreateInstance来实例化。
4. 通过调用IWbemLocator::ConnectServer来获取一个本机root\cimv2命名空间的IWbemServices的指针。
5. 设置IWbemServices代理安全,WMI service可以通过调用CoSetProxyBlanket来模拟客户端。
6. 用IWbmeServices指针来查询WMI. 本例子通过调用IWbemServies::ExecQuery 来查询操作系统名称.
SELEC * FROM Win32_OperatingSystem
7. 获取和现实WQL查询的数据.
VARIANT vtProp; // Get the value of the Name property hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
完整代码:
#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; // Step 1: -------------------------------------------------- // Initialize COM. ------------------------------------------ hres = CoInitializeEx(0, COINIT_MULTITHREADED); if (FAILED(hres)) { cout << "Failed to initialize COM library. Error code = 0x" << hex << hres << endl; return 1; // Program has failed. } // Step 2: -------------------------------------------------- // Set general COM security levels -------------------------- // Note: If you are using Windows 2000, you need to specify - // the default authentication credentials for a user by using // a SOLE_AUTHENTICATION_LIST structure in the pAuthList ---- // parameter of CoInitializeSecurity ------------------------ 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 1; // 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)) { cout << "Failed to create IWbemLocator object." << " Err code = 0x" << hex << hres << endl; CoUninitialize(); return 1; // Program has failed. } // Step 4: ----------------------------------------------------- // Connect to WMI through the IWbemLocator::ConnectServer method IWbemServices *pSvc = NULL; // Connect to the root\cimv2 namespace with // the current user and obtain pointer pSvc // to make IWbemServices calls. hres = pLoc->ConnectServer( _bstr_t(L"ROOT\\CIMV2"), // 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 1; // Program has failed. } cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl; // 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)) { cout << "Could not set proxy blanket. Error code = 0x" << hex << hres << endl; pSvc->Release(); pLoc->Release(); CoUninitialize(); return 1; // 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 Win32_OperatingSystem"), 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; pSvc->Release(); pLoc->Release(); CoUninitialize(); return 1; // 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) { break; } VARIANT vtProp; // Get the value of the Name property hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0); wcout << " OS Name : " << vtProp.bstrVal << endl; VariantClear(&vtProp); pclsObj->Release(); } // Cleanup // ======== pSvc->Release(); pLoc->Release(); pEnumerator->Release(); pclsObj->Release(); CoUninitialize(); return 0; // Program successfully completed. }
原文:http://msdn.microsoft.com/en-us/library/windows/desktop/aa390423(v=vs.85).aspx
最后几行,需要修改一下,否则VS2005编译有错误.
//pclsObj->Release();
}
// Cleanup
// ========
if (pclsObj!=NULL){
pclsObj->Release();
}
if (pEnumerator!=NULL){
pEnumerator->Release();
}
pSvc->Release();
pLoc->Release();
CoUninitialize();
return 0; // Program successfully completed.
发表评论
-
C/C++ 习题 : 链表
2012-11-24 17:32 975反转链表. 解答: 首先要明白链表相关的几个基本的概念. ... -
C/C++习题 - 数组 , 指针,取址
2012-11-24 09:51 933题目: #include <stdio.h>voi ... -
C/C++ 基本概念
2012-11-21 19:19 688整理稿: Question ... -
Return to the basic - 容器类(container),迭代器(Iterator)
2012-11-21 14:34 760标准模板库(STL) 的核心内容是3个基本组件: 容器,算法, ... -
Return to the Basic - 类 (class )
2012-05-24 11:38 728创建一个队列类(Queue, FIFO) 声明: clas ... -
Return to the Basic - 虚函数(virtual)
2012-05-26 10:06 682虚函数是指在基类中使用了vitual申明,并且在一个或多个派生 ... -
Return to the Basic - 纯虚函数(pure virtual)和抽象类(abstract class)
2012-05-26 11:27 761纯虚函数(pure virtual function)是指在基 ... -
Return to the Basic - 模板(template)
2012-05-26 12:24 658使用模板可以创建可重用的代码。模板可以分为两类,一个是函数模板 ... -
Return to the Basic - 限定符: const和volatile.
2012-05-28 10:56 701如果在变量申明语句中使用了限定符const, 那么变量在程序执 ... -
C,C++ 的字符串和操作.
2012-12-21 15:09 783C,C++ 的字符串和操作. 1. 字符基础: ASCII, ...
相关推荐
21.如何从“文件”对话框中获取文件标题名 22.如何从“文件”对话框中获取文件扩展名 23.如何在“文件”对话框中预览位图文件 24.如何创建一个文件“保存”对话框 25.如何在程序启动时弹出“文件”对话框 26.如何从...
这个是IOCP远程控制软件的模型,服务端运行后会自动发送本机信息到客户端,客户端采用IOCP重叠机制。 IOCP封装类(DLL)发布 主要是CIocpSrv"伪类",实际上还是调用的DLL, IOCP完成端口 [1]---选择 - Select [2]异步...
这个是IOCP远程控制软件的模型,服务端运行后会自动发送本机信息到客户端,客户端采用IOCP重叠机制。 IOCP封装类(DLL)发布 主要是CIocpSrv"伪类",实际上还是调用的DLL, IOCP完成端口 IP所在地查询器 jpeglib_demo...
转到“目录安全性”窗口,单击“IP地址及域名限制”下的“编辑”按钮,点选中“授权访问”以能接受客户端从本机之外的地方对IIS进行管理;最后单击“确定”按钮。 3.则在任意计算机的浏览器中输入如...
这个是IOCP远程控制软件的模型,服务端运行后会自动发送本机信息到客户端,客户端采用IOCP重叠机制。 IOCP封装类(DLL)发布 主要是CIocpSrv"伪类",实际上还是调用的DLL, IOCP完成端口 IP所在地查询器 jpeglib_demo...
这个是IOCP远程控制软件的模型,服务端运行后会自动发送本机信息到客户端,客户端采用IOCP重叠机制。 IOCP封装类(DLL)发布 主要是CIocpSrv"伪类",实际上还是调用的DLL, IOCP完成端口 IP所在地查询器 jpeglib_demo...
这个是IOCP远程控制软件的模型,服务端运行后会自动发送本机信息到客户端,客户端采用IOCP重叠机制。 IOCP封装类(DLL)发布 主要是CIocpSrv"伪类",实际上还是调用的DLL, IOCP完成端口 IP所在地查询器 jpeglib_demo...
这个是IOCP远程控制软件的模型,服务端运行后会自动发送本机信息到客户端,客户端采用IOCP重叠机制。 IOCP封装类(DLL)发布 主要是CIocpSrv"伪类",实际上还是调用的DLL, IOCP完成端口 IP所在地查询器 jpeglib_demo...
直接从SQL语句问题贴子数据建表并生成建表语句的存储过程 从SQL中的一个表中导出HTML文件表格 获取數据库表的前N条记录 几段SQL Server语句和存储过程 生成表中的数据的脚本 最详细的SQL注入相关的命令整理 Oracle ...
SysInv使用可能的最低应用程序层(例如SMBIOS而不是WMI)查询系统信息,以收集可能的最原始和最少过滤的数据。 这意味着可以在更短的时间内获得更多详细且有意义的数据。 可配置的输出格式意味着您可以构建一棵...
您还将学习如何阅读和使用Microsoft Access或ActiveX数据对象(ADO)从脚本编写到数据库。书中还介绍了管理员如何从WSH脚本访问Active Directory服务接口(ADSI),以维护用户帐户,服务或股份。您将了解新技术基于...