检索 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) 中检索类定义
使用 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++ 创建和声明实例。