检索 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)

  1. 使用 Microsoft.Management.Infrastructure 命名空间创建具有指定命名空间和类名称的 CIMInstance 类。

    创建的类将包含所有类信息,但不包含实例数据。

    using Microsoft.Management.Infrastructure;
    ...
    string Namespace = @"root\cimv2";
    string className = "Win32_LogicalDisk";
    
    CimInstance diskDrive = new CimInstance(className, Namespace);
    
  2. 或者,与 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)

  1. 可以将 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 语句

  2. 或者,创建一个新的 ManagementClass 对象(以名称作为路径)来检索类。

    using System.Management;
    ...
    ManagementClass objInst = new ManagementClass("Win32_LogicalDisk");
    

可以采用与检索特定实例类似的方式在 VBScript 中检索类定义。

在 VBScript 中检索类定义

  1. 调用 SWbemServices.Get,但不标识类的对象路径中的特定实例。

  2. 下面的代码示例检索描述计算机上逻辑驱动器的类的类定义。

    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

  3. 还可以指定类或实例,在这种情况下,返回的对象是 WMI 对象(如 Win32_LogicalDisk 的实例),而不是服务对象。 请注意,不能使用 VBScript GetObject 函数创建泛型对象 SWbemObject 的实例。

  4. 在 Microsoft Internet Explorer (IE) 中运行的 HTML 页面中,GetObjectCreateObject 可能会失败,因为 WMI 脚本对象(如 ActiveX 控件)未标记为脚本安全。 一个例外是 SWbemDateTime 对象。 要让这些调用成功,唯一方法是降低 IE 安全设置,但不建议这样做。

在 C++ 中检索类时,请调用 GetObjectIWbemServices 版本。

在 C++ 中检索类定义

  1. 调用 IWbemServices::GetObjectIWbemServices::GetObjectAsync 方法检索现有类的定义。
  2. 一个类可以有多个类定义,将多个类提供程序加载到一个命名空间中时通常会出现这种情况。 当类具有多个类定义时,WMI 返回发现的第一个定义和 WBEM_S_DUPLICATE_OBJECTS 状态代码。

由于 GetObject 返回类定义,因此它通常用作创建实例的第一步。 有关如何使用 GetObject 的详细信息,请参阅使用 C++ 创建和声明实例