Windows 远程管理和 WMI
Windows 远程管理可用于检索 Windows Management Instrumentation (WMI 和 MI) 公开的数据。 可以使用使用 WinRM 脚本 API 的脚本或应用程序或通过 Winrm 命令行工具获取 WMI 数据。
WinRM 支持大多数熟悉的 WMI 类和操作,包括嵌入的对象。 WinRM 可以利用 WMI 收集有关 资源 的数据,或管理基于 Windows 的操作系统上的资源。 这意味着,可以通过一组现有的 WMI 类获取有关企业中磁盘、网络适配器、服务或进程等对象的数据。 还可以访问标准 WMI IPMI 提供程序提供的硬件数据。
标识 WMI 资源
可以在 WinRM 和 WS-Management 协议中引用 WMI 类作为 资源 :一种托管实体,如服务或磁盘。
WMI 类或方法由 URI 标识,就像使用 WS-Management 协议时的任何其他资源一样。 URI 可以指定 WMI 资源 (类) 、WMI 操作 (方法) ,或者在通过网络发送 的消息 中标识类的特定实例。 有关详细信息,请参阅 资源 URI。
构造 WMI 类的 URI 前缀
URI 前缀包含固定部分和 WMI 命名空间。 例如,Windows Server 中包含前缀的固定部分的 URI 前缀为: http://schemas.microsoft.com/wbem/wsman/1/wmi/<WmiNamespace>
。 这允许为任何 WMI 命名空间生成 URI 前缀。 例如,若要访问 root\default WMI 命名空间,请使用以下 URI 前缀: http://schemas.microsoft.com/wbem/wsman/1/wmi/root/default/
。
大多数用于管理的 WMI 类都位于 root\cimv2 命名空间中。 若要访问 root\cimv2 命名空间中的类和实例,请使用 URI 前缀: http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/
。 有关详细信息,请参阅 资源 URI。
生成 WMI 类的完整 URI
提供给 Winrm 命令行工具或脚本的 URI 由前缀和资源规范组成。
以下过程介绍如何生成资源 URI 以获取 WMI 类或在枚举操作中使用。
为 WMI 类生成资源 URI
从前缀开始,指示应使用 WS-Management 协议架构。
https://schemas.microsoft.com/wbem/wsman/1
WMI 类的资源 URI 前缀始终相同。 有关详细信息,请参阅 URI 前缀。
将 WMI 命名空间添加到前缀。
http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/
添加类名。
http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/Win32_Service
若要设置属性的值或调用特定方法,请为 类添加所需的键值。
http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/Win32_Service?Name=Winmgmt
如果将键值留空,则不会更改原始属性值。
注意
将键值留空会将属性值设置为 NULL。
使用 WinRM 查找 WMI 资源
可以通过命令行工具 Winrm 或使用 WinRM 脚本 API 的 Visual Basic 脚本获取 WMI 数据。 不使用 WMI 路径 来查找资源。 而是将 WMI 命名空间和层次结构转换为 URI。
WMI 类的 WinRM URI 包含两个部分: URI 前缀 和要访问的类。
例如,可以将以下 URI 提供给 Session.Enumerate 方法,以列出计算机上的所有服务。 URI 前缀为 http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/
,类 Win32_Service。
strResourceUri = "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/Win32_CurrentTime"
在 WMI 中,以多种方式列出资源或类的所有实例的数据:
该资源的所有实例的查询。
Set colServices = objWMIService.ExecQuery("Select * from Win32_Service")
调用 SWbemServices.InstancesOf 或 SWbemObject.Instances_。
Set colServices = InstancesOf("Win32_Service")
在 WinRM 中,有一种方法可以列出资源的所有实例: Session.Enumerate。
strResource = "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/Win32_Service"
Set colServices = objSession.Enumerate( strResource )
查找 WMI 资源的特定实例
在 WMI 中,可以通过指定键属性的值或查询与属性值列表匹配的实例来指定类的特定实例。 键属性具有 WMI 密钥限定符。
可以通过多种方式获取类的特定实例:
使用筛选器和方言参数调用 Session.Enumerate 以创建查询。
RemoteComputer = "servername.domain.com" strDialect = "http://schemas.microsoft.com/wbem/wsman/1/WQL" strResource = "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/*" Set objWsman = CreateObject("Wsman.Automation") Set objSession = objWsman.CreateSession("https://" & RemoteComputer) strFilter = "SELECT * FROM Win32_Share WHERE Name='Admin$'" Set objResultSet = objSession.Enumerate(strResource, strFilter, strDialect)
调用 SWbemServices.Get。 对于 Session.Get,必须提供一个或多个特定键值,前面有问号 (?) 。
特定实例的 URI 格式为
http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/WMI_Class?Key1=Value
。strResourceUri = "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/Win32_Service?Name=winmgmt"
WMI 类可能有多个键。 键名称-值对由“+”号分隔。 在这种情况下,格式为:
http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/Win32_Service?Key1=Value1+Key2=Value2
。用于获取单一实例 WMI 对象的 WinRM 语法不同于 WMI。 单一实例是定义的 WMI 类,因此只允许一个实例。 Win32_CurrentTime 或 Win32_WMISetting 是 WMI 单一实例类的示例。
以下 VBScript 代码示例中显示了单一实例的 WMI 语法。
Set TimeObject = objWMIService.Get("Win32_CurrentTime=@")
以下示例演示不使用“@”的 WinRM 单一实例语法。
strResourceUri = "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/Win32_CurrentTime"
将 选择器 添加到 ResourceLocator 或 IWSManResourceLocator 对象。
以下 VBScript 代码示例演示如何使用选择器获取 Win32_Processor的特定实例。
strUri = "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/Win32_Processor" Set objWsman = CreateObject("Wsman.Automation") Set Session = objWsman.CreateSession Set Locator = objWsman.CreateResourceLocator(strUri) Locator.AddSelector "DeviceID", "CPU0"