Finding all WMI class names within a WMI namespace with .NET C#
November 21, 2014 2 Comments
In this post we saw an example of using WMI objects such as ConnectionOptions, ObjectQuery and ManagementObjectSearcher to enumerate all local drives on a computer. Recall the SQL-like query we used:
ObjectQuery objectQuery = new ObjectQuery("SELECT Size, Name FROM Win32_LogicalDisk where DriveType=3");
We’ll now see a technique to list all WMI classes within a WMI namespace. First we get hold of the WMI namespaces:
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();
}
We call this method as follows to list all WMI namespaces on the local computer:
List<String> namespaces = GetWmiNamespaces("root");
The following method will retrieve all classes from a WMI namespace using the ManagementObjectSearcher object and a query:
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();
}
The ManagementClass ToString method attaches the class name to the namespace with a colon hence the Split method.
You can then call this method for each namespace name:
foreach (String namespaceName in namespaces)
{
List<String> classNames = GetClassNamesWithinWmiNamespace(namespaceName);
}
Listing all class names within all namespaces can take a lot of time though.
You can view all posts related to Diagnostics here.
Simple and well explained, thanks!!!
tnx very nice