检索 WMI 类
可以检索的第一种类型的对象是 WMI 类。 检索 WMI 类时,实际上会检索一个类定义,该定义是完整描述该类的属性、限定符和方法的列表。 但是,类定义基本上是类本身。
PowerShell 使用标准查询通过 meta_class 类来检索类定义。
在 PowerShell 中检索类定义
将 Get-WmiObject 与针对 meta_class 的查询一起使用,WHERE 子句包含要检索的类的名称。
Get-WmiObject -query "SELECT * FROM meta_class WHERE __class = 'Win32_LogicalDisk'"
Get-WmiObject 是 PowerShell 用于从 WMI 检索类和实例信息的标准 cmdlet。 meta_class 类将查询定义为架构查询。 如果没有 meta_class 类,此查询将返回 Win32_LogicalDisk 的所有实例。 有关查询 WMI 的详细信息,请参阅用于架构查询的 SELECT 语句。
用 C# 检索 WMI 定义的当前过程是使用 CIMInstance 类。
用 C# 检索类定义 (Microsoft.Management.Infrastructure)
使用 Microsoft.Management.Infrastructure 命名空间创建具有指定命名空间和类名称的 CIMInstance 类。
创建的类将包含所有类信息,但不包含实例数据。
using Microsoft.Management.Infrastructure; ... string Namespace = @"root\cimv2"; string className = "Win32_LogicalDisk"; CimInstance diskDrive = new CimInstance(className, Namespace);
或者,与 PowerShell 一样,还可以通过在查询中使用 meta_class 标记来执行查询。
using Microsoft.Management.Infrastructure; ... string Namespace = @"root\cimv2"; string diskDriveQuery = "SELECT * FROM meta_class WHERE __class = 'Win32_LogicalDisk'"; CimSession mySession = CimSession.Create("localhost"); IEnumerable<CimInstance> queryInstance = mySession.QueryInstances(Namespace, "WQL", diskDriveQuery);
与 PowerShell 一样,C# 使用 meta_class 查询来检索类定义。 或者,可以创建 ManagementClass 对象来直接访问类定义。
注意
System.Management 是用于访问 WMI 的原始 .NET 命名空间;但是,此命名空间中的 API 通常运行较慢,并且相对于其更新式的 Microsoft.Management.Infrastructure 对应项,它们无法缩放。
用 C# 检索类定义 (System.Management)
可以将 ManagementObjectSerarcher 与查询一起使用以 meta_class,其中的 WHERE 子句包含要检索的类的名称。
using System.Management; ... ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM meta_class WHERE __class = 'Win32_LogicalDisk'"); ManagementObjectCollection myDiskCollection = searcher.Get();
ManagementObjectSerarcher 是 .NET 用于从 WMI 检索类和实例信息的标准类。 ManagementObjectSerarcher.Get 返回包含架构定义类的 ManagementObjectCollection。 meta_class 类将查询定义为架构查询。 如果没有 meta_class 类,此查询将返回 Win32_LogicalDisk 的所有实例。 有关查询 WMI 的详细信息,请参阅用于架构查询的 SELECT 语句。
或者,创建一个新的 ManagementClass 对象(以名称作为路径)来检索类。
using System.Management; ... ManagementClass objInst = new ManagementClass("Win32_LogicalDisk");
可以采用与检索特定实例类似的方式在 VBScript 中检索类定义。
在 VBScript 中检索类定义
调用 SWbemServices.Get,但不标识类的对象路径中的特定实例。
下面的代码示例检索描述计算机上逻辑驱动器的类的类定义。
Set objinst = GetObject("WinMgmts:Win32_LogicalDisk")
Windows 脚本宿主 (WSH) 也支持以下内容。
<OBJECT id="myLocator" progid="WbemScripting.SWbemLocator"></OBJECT>
在 Active Server Pages (ASP) 服务器端脚本中使用 GetObject 或 CreateObject。 有关详细信息,请参阅为 WMI 创建 Active Server Pages。
还可以指定类或实例,在这种情况下,返回的对象是 WMI 对象(如 Win32_LogicalDisk 的实例),而不是服务对象。 请注意,不能使用 VBScript GetObject 函数创建泛型对象 SWbemObject 的实例。
在 Microsoft Internet Explorer (IE) 中运行的 HTML 页面中,GetObject 和 CreateObject 可能会失败,因为 WMI 脚本对象(如 ActiveX 控件)未标记为脚本安全。 一个例外是 SWbemDateTime 对象。 要让这些调用成功,唯一方法是降低 IE 安全设置,但不建议这样做。
在 C++ 中检索类时,请调用 GetObject 的 IWbemServices 版本。
在 C++ 中检索类定义
- 调用 IWbemServices::GetObject 或 IWbemServices::GetObjectAsync 方法检索现有类的定义。
- 一个类可以有多个类定义,将多个类提供程序加载到一个命名空间中时通常会出现这种情况。 当类具有多个类定义时,WMI 返回发现的第一个定义和 WBEM_S_DUPLICATE_OBJECTS 状态代码。
由于 GetObject 返回类定义,因此它通常用作创建实例的第一步。 有关如何使用 GetObject 的详细信息,请参阅使用 C++ 创建和声明实例。