在这篇文章中,我们看到了一个使用 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);
}
但是,列出所有命名空间中的所有类名可能会花费很多时间。
您可以在此处查看与诊断相关的所有帖子。