使用 .NET C# 在 WMI 命名空间中查找所有 WMI 类名

这篇文章中,我们看到了一个使用 WMI 对象(如 ConnectionOptions、ObjectQuery 和 ManagementObjectSearcher)枚举计算机上所有本地驱动器的示例。回想一下我们使用的类似 SQL 的查询:

ObjectQuery objectQuery = new ObjectQuery("SELECT Size, Name FROM Win32_LogicalDisk where DriveType=3");
我们现在将看到一种列出 WMI 命名空间中所有 WMI 类的技术。首先,我们掌握 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.OrderBy(s => s).ToList();
}

我们调用这个方法如下列出本地计算机上的所有 WMI 命名空间:

List<String> namespaces = GetWmiNamespaces("root");

以下方法将使用 ManagementObjectSearcher 对象和查询从 WMI 命名空间中检索所有类:

private static List<String> GetClassNamesWithinWmiNamespace(string wmiNamespaceName)
{
    List<String> classes = new List<string>();
    ManagementObjectSearcher searcher = new ManagementObjectSearcher
                (new ManagementScope(wmiNamespaceName),
                new WqlObjectQuery("SELECT * FROM meta_class"));
    List<string> classNames = new List<string>();
    ManagementObjectCollection objectCollection = searcher.Get();
    foreach (ManagementClass wmiClass in objectCollection)
    {
        string stringified = wmiClass.ToString();
        string[] parts = stringified.Split(new char[] { ':' });
        classes.Add(parts[1]);
    }
    return classes.OrderBy(s => s).ToList();
}

ManagementClass ToString 方法使用冒号将类名附加到命名空间,因此是 Split 方法。

然后,您可以为每个命名空间名称调用此方法:

foreach (String namespaceName in namespaces)
{
    List<String> classNames = GetClassNamesWithinWmiNamespace(namespaceName);
}

但是,列出所有命名空间中的所有类名可能会花费很多时间。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值