WMI – Windows Management Instrumentation – 提供一组工具来监控系统资源,例如设备和应用程序。WMI 由您在 .NET 项目中设置引用的 System.Management 库表示。
我们将快速了解如何枚举网络中计算机上的所有本地驱动器。您可能需要以管理员身份运行 Visual Studio:
ConnectionOptions connectionOptions = new ConnectionOptions();
connectionOptions.Username = "andras.nemes";
connectionOptions.Password = "p@ssw0rd";
ManagementPath managementPath = new ManagementPath();
managementPath.Path = "\\\\machinename\\root\\cimv2";
ManagementScope managementScope = new ManagementScope(managementPath, connectionOptions);
ObjectQuery objectQuery = new ObjectQuery("SELECT Size, Name FROM Win32_LogicalDisk where DriveType=3");
ManagementObjectSearcher objectSearcher = new ManagementObjectSearcher(managementScope, objectQuery);
ManagementObjectCollection objectCollection = objectSearcher.Get();
foreach (ManagementObject managementObject in objectCollection)
{
Console.WriteLine("Resource name: {0}", managementObject["Name"]);
Console.WriteLine("Resource size: {0}", managementObject["Size"]);
}
首先,我们使用 ConnectionOptions 对象设置用户信息以访问另一台计算机。然后我们声明资源所在的 WMI 命名空间的路径。在这种情况下,它是“root\\cimv2”。
再往下,您将看到如何列出所有 WMI 命名空间。
接下来,我们使用管理路径和连接选项输入构建一个 ManagementScope 对象。然后是有趣的部分:查询资源的类似 SQL 的语法,在本例中为 Win32_LogicalDisk。此页面列出了 Win32_LogicalDisk 的所有可选属性,包括 DriveType 的值。
ManagementObjectSearcher 是在声明的范围内运行查询的工具。ManagementObjectSearcher 的 Get() 方法枚举查询返回的所有管理对象。循环打印我们使用查询提取的属性。
以下是如何打印根的 WMI 命名空间:
private static List<String> GetWmiNamespaces(string root)
{
List<String> namespaces = new List<string>();
try
{
ManagementClass nsClass = new ManagementClass(new ManagementScope(root), new ManagementPath("__namespace"), null);
foreach (ManagementObject ns in nsClass.GetInstances())
{
string namespaceName = root + "\\" + ns["Name"].ToString();
namespaces.Add(namespaceName);
namespaces.AddRange(GetWmiNamespaces(namespaceName));
}
}
catch (ManagementException me)
{
Console.WriteLine(me.Message);
}
return namespaces;
}
如果您想枚举本地 PC 上的 WMI 命名空间,那么您可以调用此函数,例如……
List<String> namespaces = GetWmiNamespaces("root");
您可以在此处查看与诊断相关的所有帖子。