WMI-Abfragen aus Gehen
Möchte ich ausführen WMI-Abfragen aus Gehen. Es gibt Möglichkeiten, Aufruf von DLL-Funktionen aus Gehen. Mein Verständnis ist, dass es irgendeine DLL irgendwo die, mit der richtigen nennen, werden wieder einige Daten kann ich analysieren und verwenden. Ich würde es vorziehen, um zu vermeiden, aufrufen, die in C oder C++, vor allem, da ich denke, das sind Wrapper über die Windows-API selbst.
Ich geprüft habe die Ausgabe von dumpbin.exe /exports c:\windows\system32\wmi.dll
, und der folgende Eintrag sieht vielversprechend aus:
WmiQueryAllDataA (forwarded to wmiclnt.WmiQueryAllDataA)
Aber ich bin mir nicht sicher, was zu tun ist von hier. Welche Argumente hat diese Funktion nutzen? Was braucht es dafür? Suche für WmiQueryAllDataA
ist nicht hilfreich. Und dieser name erscheint nur in einem Kommentar von c:\program files (x86)\windows kits\8.1\include\shared\wmistr.h
ist, aber keine Funktion Unterschrift.
Gibt es bessere Methoden? Gibt es eine andere DLL? Bin ich etwas fehlt? Sollte ich nur mit einem C-wrapper?
Ausführen einer WMI-Abfrage in Linqpad mit .NET Reflector zeigt die Verwendung von WmiNetUtilsHelper:ExecQueryWmi
(und ein _f
version), aber weder über eine sichtbare Umsetzung.
Update: verwenden Sie die github.com/StackExchange/wmi - Paket setzt die Lösung in der akzeptierten Antwort.
- Kevins Antwort unten ist jetzt implementiert in einem Go-Paket auf Github. Siehe godoc.org/github.com/StackExchange/wmi
Du musst angemeldet sein, um einen Kommentar abzugeben.
Willkommen in der wunderbaren Welt der COM, Objekt-Orientierte Programmierung in C ab, wenn C++ war ein "junger Schnösel".
Auf github mattn geworfen hat zusammen eine kleine Wickler Gehen, die ich verwendet, um zu werfen zusammen eine schnelle Beispiel-Programm. "Diesem repository erstellt wurde, für Experimente und sollte als instabil." flößt allen Arten von Vertrauen.
Ich ' m verlassen eine Menge Fehler zu überprüfen. Vertrauen Sie mir, wenn ich sage, werden Sie wollen, um es zurück.
Das wirkliche Fleisch ist der Aufruf ExecQuery, ich passieren zu greifen "Win32_Process" aus der verfügbare Klassen, weil es einfach zu verstehen und zu drucken.
Auf meinem Rechner, diese Drucke:
Ich es nicht verwende erhöhten oder mit deaktivierter UAC, aber einige WMI-Anbieter sind gonna erfordern einen privilegierten Benutzer.
Ich bin auch nicht zu 100%, dass dies nicht Leck ein wenig, Sie wollen zu Graben, in dass. COM-Objekte Referenz gezählt, so
defer
sollte ziemlich gut passen gibt es (vorausgesetzt, die Methode ist nicht verrückt lange laufen) aber gehen-ole kann etwas Magie im inneren konnte ich nicht feststellen.Ich bin das kommentieren über ein Jahr später, aber es gibt hier eine Lösung auf github (und unten geschrieben für die Nachwelt).
Zugriff auf die
winmgmts
Objekt oder ein namespace (das ist das gleiche), kann man folgenden code verwenden. Grundsätzlich müssen Sie den namespace angeben, wie parameter, die nicht dokumentiert ist, richtig ingo-ole
.In dem code unten kann man auch sehen, wie Sie auf eine Klasse innerhalb dieses namespace, und führen Sie eine Methode.