WMI: Alle Property's

  • Hallo!

    Meine Finger bluten, mein Kopf raucht nach zwei Tagen suchen und am Ende bin ich nicht weitergekommen:(

    Ich hoffe Ihr könnt mir weiterheilfen...

    Ich möchte in AutoIT eine WMI-Anfrage stellen und als Antwort eine Liste (Array, Output,...) aller (ich hoffe das stimmt so) Property's bekommen.

    Zur Zeit mache ich eine Anfrage so:

    Code
    local $objWMIService = ObjGet("winmgmts:\\.\root\CIMV2")
    $colItems = $objWMIService.ExecQuery('Select * from Win32_PnPSignedDriver')
    
    for $i in $colItems
        ConsoleWrite ($i.Description & @crlf)
    Next

    Das funktioniert auch, aber ich benötige um etwas universeller zu sein alle Felder die ich Auswerten kann - ich hoffe ich drücke mich nicht zu unverständlich aus.

    Es geht als um das ".Description" - ich weiß dank WIM-Explore, dass es das gibt, aber es muss ja eine Möglichkeit geben um alle Propertys aufzulisten. Und stehe ich an!

    Unter Powershell ist das sehr einfach: Get-WmiObject -Class "Win32_PnPSignedDriver" -Namespace "root\CIMV2" | Get-Member - ich würde aber nur ungern in ein AutoIT Programm wieder den Umweg über die PS gehen.

    Ich habe mir auch schon Script-o-Matic angesehen, aber ich muss gestehen das ist doch ein Level zu hoch für mich!

    Ein ganz ein kleines Beispiel wie man das löst wäre sehr hilfreich...

    lg

    Racer

  • Hi Racer !

    Hier ein Skript von PsaltyDS aus dem engl. Forum !

    Ich habe es probiert und es läuft, warum also das Rad neu erfinden ;).

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Ich dürfte mich schlecht bei meiner Frage ausgedrückt habe. Es geht mir nicht darum wie ich eine WMI Abfrage von Win32_PnPSignedDriver nach z.B.: DeviceName mache, sondern wie ich die Angaben "DeviceName, DeviceID,...) bekomme.

    Der Vergleich hinkt ein bisschen aber so wie ich aus einen INI-File mit "IniReadSection" die Elemente/Key (wobei ich nur die Elemente möchte) auslesen kann, ohne vorher zu wissen welche es gibt. Ich muss nur den Sectionnamen wissen...

    Wie in meinen Beispiel will ich nicht Hardcoded $variable.Description schreiben, ich möchte wenn das geht alle Möglichen Elemente bekommen die bei (Als Beispiel: Win32_PnPSignedDriver) möglich sind.

    lg

    Racer

    PS: WMI ist nicht so mein Fall, sollte ich hier falsch Bezeichnungen verwenden bitte ich gleich um Verzeihung für mein Unwissen

  • Ich dürfte mich schlecht bei meiner Frage ausgedrückt habe.

    Nun, ein wenig - zumindest für mich :P.

    ich möchte wenn das geht alle Möglichen Elemente bekommen die bei (Als Beispiel: Win32_PnPSignedDriver) möglich sind.

    Welche Eigenschaften Dir in Win32_PnPSignedDriver zur Verfügung stehen, findest Du unter :

    https://msdn.microsoft.com/en-us/library/…4(v=vs.85).aspx

    Ansonsten kannst Du mit dem obigen Beispiel auch ein 2-D Array befüllen.

    Leider verstehe ich immer noch nicht so ganz worauf Du hinaus willst :/.

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Welche Eigenschaften Dir in Win32_PnPSignedDriver zur Verfügung stehen, findest Du unter :

    https://msdn.microsoft.com/en-us/library/…4(v=vs.85).aspx

    Ich bin sicher ich verwende die falschen Bezeichungen.

    Auf der MS Seite stehen alle Möglichen Felder (String ClassGuidID, CompatID,...) für Win32_PnPSignedDriver. Und ich möchte die Liste nicht erstellen (wie auf der Webseite beschrieben) sondern aus dem System abfragen welche Properties es gibt.

    Je nach WIM Anfrage sind es unterschiedliche Felder.

    Beispiel:

    Bei Win32_PnPDevice gibt es SameElement und SystemElement

    Bei Win32_Printer gibe es Attribus, Availability, Comment, uvm.

    Je nachdem welche Klasse ich Abfrage, muss ich für die Ausgabe wissen welches Properties es gibt das ich dann in einer Schleife abfragen kann:

    Code
    for $i in $colItems
        ConsoleWrite ($i.Description & @crlf)
    Next

    ich möchste aber eine Liste aller möglichen Properties von der jeweiligen Klasse. Quasi was kann ich in einer Klasse alles abfragen!

    lg

    Racer

  • Code
    For $Item in $colItems
        For $Prop In $Item.Properties_
            ConsoleWrite ($Prop.Name & @crlf)
        Next
    Next

    Versuch mal...

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

    • Offizieller Beitrag

    Dann nimm doch den Weg über PS. Ist doch kein Aufwand:

  • Code
    Local $strComputer = "."
    Local $strNameSpace = "root\cimv2"
    Local $strClass = "Win32_PnPSignedDriver"
    
    Local $objClass = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & $strComputer & "\" & $strNameSpace & ":" & $strClass)
    For $objClassProperty In $objClass.Properties_
        ConsoleWrite($objClassProperty.Name & @CRLF)
    Next
  • Ich habe mir auch schon Script-o-Matic angesehen, aber ich muss gestehen das ist doch ein Level zu hoch für mich!

    Scriptomatic liefert dir alles was du brauchst fix und fertig. Ich habe seit Jahren keine einzige Zeile WMI-Abfragen "zu Fuß" erstellt, wozu auch?! Wenn es doch ein Script gibt, welches einwandfrei funktioniert...

    Du könntest das von Scriptomatic erstellte Script benutzen, und damit dein Problem sofort lösen.

    Dann könntest du hier fragen, wie Scriptomatic funktioniert und damit deinen persönlichen Level-up schaffen.

    Jetzt hast du eine Handvoll "Brocken" vorgeworfen bekommen und ich bezweifle, dass du viel dabei gelernt hast, denn die WMI-Abfrage "zu Fuß" hast du doch sowieso schon (teilweise) per AutoIt und auch per PS selbst erstellt.

  • Meist Du, Script-o-matic hätte ihm bei der Ermittlung der Property-Names einer Klasse geholfen ?

    Aber ich lasse mich gerne eines besseren belehren...

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Code
    Local $strComputer = "."
    Local $strNameSpace = "root\cimv2"
    Local $strClass = "Win32_PnPSignedDriver"
    
    Local $objClass = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & $strComputer & "\" & $strNameSpace & ":" & $strClass)
    For $objClassProperty In $objClass.Properties_
        ConsoleWrite($objClassProperty.Name & @CRLF)
    Next

    Das ist ja noch besser....danke schön!

    lg

    Racer

  • Scriptomatic liefert dir alles was du brauchst fix und fertig. Ich habe seit Jahren keine einzige Zeile WMI-Abfragen "zu Fuß" erstellt, wozu auch?! Wenn es doch ein Script gibt, welches einwandfrei funktioniert...

    Du könntest das von Scriptomatic erstellte Script benutzen, und damit dein Problem sofort lösen.

    Dann könntest du hier fragen, wie Scriptomatic funktioniert und damit deinen persönlichen Level-up schaffen.

    Jetzt hast du eine Handvoll "Brocken" vorgeworfen bekommen und ich bezweifle, dass du viel dabei gelernt hast, denn die WMI-Abfrage "zu Fuß" hast du doch sowieso schon (teilweise) per AutoIt und auch per PS selbst erstellt.

    Ich gebe Dir schon recht das Scriptomatic ein Werkzeug ist das einem sehr viel Arbeit abnimmt. Aber in diesen speziellen Fall hat es mir nicht weitergeholfen (oder nicht in den Hintern gebissen).

    Ich habe mir den Quellcode angesehen und versucht herauzufinden wie Scriptomatic das macht - und das habe ich gemeint ein Level zu hoch.

    Eine einfach unflexible Abfrage ist ja kein Problem, überhaupt wenn man es statisch in ein Programm einbetten kann. In meinen Fall muss und möchte ich es etwas dynamischer gestalten und darum gehe ich diesen Umweg.

    Powershell ist nicht immer verfügbar (WinPE) und daher möchte ich es lieber native in AutoIT die Aufgabe lösen!

    lg

    Racer