检索 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 是标准 cmdlet PowerShell 用于从 WMI 检索类和实例信息。 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 返回包含架构定义类的 ManagementObjectCollectionmeta_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) 在服务器端脚本中使用 GetObjectCreateObject。 有关详细信息,请参阅为 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++ 创建和声明实例