在 C# .NET 中使用 WMI 查找所有本地驱动器

本文介绍了如何通过Windows Management Instrumentation (WMI) 在.NET项目中访问远程计算机的系统资源,特别是列举网络中计算机上的本地驱动器。通过设置ConnectionOptions,指定ManagementScope,并使用ObjectQuery进行SQL-like查询,可以获取并打印出驱动器的名称和大小。此外,还展示了如何递归枚举WMI命名空间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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");

您可以在此处查看与诊断相关的所有帖子。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值