本文作者:贝多芬不忧伤(Ms08067实验室内网小组成员)
注:这篇帖子需要有一定的c++编程经验的同学来学习和测试。
您可以使用本主题中的过程和代码示例来创建完整的WMI客户端应用程序,该应用程序执行COM初始化,连接到远程计算机上的WMI,半同步获取数据,然后清理。
以下过程显示了如何执行WMI应用程序。步骤1至5包含设置和连接到WMI所需的所有步骤,而步骤6和7是查询和接收数据的位置。
从远程计算机获取WMI数据
- 通过调用CoInitializeEx初始化COM参数。
- 通过调用CoInitializeSecurity初始化COM进程安全性。
- 通过调用CoCreateInstance获得WMI的初始定位器。
- 通过调用IWbemLocator :: ConnectServer获得远程计算机上\\ root \ cimv2命名空间的指向IWbemServices的指针。连接到远程计算机时,您需要知道要连接到的远程计算机的计算机名称,域,用户名和密码。这些属性都传递给IWbemLocator :: ConnectServer方法。另外,请确保尝试连接到远程计算机的计算机上的用户名在远程计算机上具有正确的访问特权。
- 创建一个COAUTHIDENTITY结构,以提供用于设置代理安全性的凭据。
- 设置IWbemServices代理安全性,以便WMI服务可以通过调用CoSetProxyBlanket来模拟客户端。
- 使用IWbemServices指针发出WMI请求。通过调用IWbemServices :: ExecQuery执行查询以获取操作系统的名称和可用物理内存量。
以下WQL查询是方法参数之一。
SELECT * FROM Win32_OperatingSystem
该查询的结果存储在IEnumWbemClassObject指针中。这允许使用IEnumWbemClassObject接口半同步地检索来自查询的数据对象。 - 设置IEnumWbemClassObject枚举器代理安全性。使用完凭据后,请确保从内存中删除它们。
- 从WQL查询获取并显示数据。所述IEnumWbemClassObject指针被链接到的数据对象,该查询返回,并且数据对象可以与该被检索 IEnumWbemClassObject::Next 方法。此方法将数据对象链接到传递给该方法的IWbemClassObject指针。使用IWbemClassObject :: Get方法从数据对象获取所需的信息。
下面的代码示例演示如何从远程计算机半同步获取WMI数据。
下面我给出了一个外链。代码可download下来测试
https://paste.ubuntu.com/p/bMfNwrw98k/