28. januar 2008 - 11:37Der er
9 kommentarer og 1 løsning
WMI for dummies
Hej alle,
Sidder og skal samle nogle informationer sammenomkring mit miljø (disk, ram, os osv)
Jeg har kigget på WMI og har besluttet at jeg er nødt til at have et hjælpetool (og det bygger man naturligvis selv). Jeg ved at man kan spørge på eksempel "Win32_Process" i Wmi, men hvordan får man en liste over de "ting" man kan spørge imod? dvs, en liste over alle "win32_XXX", og hvor stammer de fra? Kan man lave en liste over alle disse der hoster de win32:xx også og så lave sit værktøj "ærdigt" ???
Jepsen, jeg havde håbet på at kunne trække en liste fra en assembly eller lignende på min maskine, således jeg kunne automatisere det med et lille tool...pyt jeg nøjes :-)
Ved godt det har været med siden win98. Så et lille tool hvor den listede alle klasser, så et eller andet sted må skidtet jo stå, spørgsmålet er så om det er en enkelt assembly, eller flere. Og hvilke(n) man skal kigge i for at få den liste...
Sådan her lister man alle namespaces på maskinen (root/cmv2) er default
ManagementClass nsClass = new ManagementClass( new ManagementScope("root"), new ManagementPath("__namespace"), null); foreach (ManagementObject obj in nsClass.GetInstances()) { Console.WriteLine(obj["Name"].ToString()); }
Når man kommer sådan til at lege lidt med det, er det vildt hvad man kan. ALT, her er koden til at trække alle informationer om din computer ud og smide det i en html fil. Bemærk venligst alle begrænsningerne (den kører stadig i et par minutter). På min masking fylder det omkring 8 Mb for det hele, så pas på med den:
public class Test { public Test() { ManagementClass newClass = new ManagementClass(); EnumerationOptions options = new EnumerationOptions(); options.EnumerateDeep = true; int count = 0; Console.Write("Working"); using (StreamWriter writer = new StreamWriter("c:\\mycomputer.html", false)) { writer.WriteLine("<html><head><body>"); foreach (ManagementObject o in newClass.GetSubclasses(options)) { if (count < 10) { Console.Write("."); string className = (string)o["__Class"]; if (className.StartsWith("Win32")) { writer.WriteLine("<h1>" + className + "</h1>"); ManagementClass myClass = new ManagementClass(className); ManagementObjectCollection collection = myClass.GetInstances(); if (collection.Count > 0) { foreach (ManagementObject obj in collection) { writer.WriteLine("<h2>" + obj.Path + "</h2>"); foreach (PropertyData data in obj.Properties) { string value = data.Value != null ? data.Value.ToString() : "null"; writer.WriteLine("<h3>" + data.Name + " [" + value + "]</h3>"); } } count++; } } } else { break; } } writer.Flush(); writer.Close(); } Console.WriteLine("Done"); } }
Ps. uden begrænsninger kører den bare, jeg stoppede min da den havde lavet en HTML fil på 80Mb. Note to self: overvej multithreading, og lazy load
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.