PB.Ex WMI (Windows)

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

PB.Ex WMI (Windows)

Beitrag von RSBasic »

Hallo,

WMI (Windows Management Instrumentation) ist eine Schnittstelle zum Ermitteln von Informationen (z.B. Batteriestatus, PC-Informationen, Festplatteninformationen, Netzwerkinformationen, Programme, ...), zum Ausführen von Methoden (z.B. Domain-Anmeldung, Lüfter-Steuerung, Netzwerkverbindungen aktivieren/deaktivieren, Drucker-Verwaltung, ...) und zum Abfragen von Events (z.B. ob Prozess gestartet oder beendet wurde, ...).

Funktionen:
  • ExecuteWMIQuery()
    • Syntax:

      Code: Alles auswählen

      Result = ExecuteWMIQuery(Namespace$, Query$, @Output$)
    • Beschreibung: Führt eine Abfrage aus.
    • Parameter:
      1. Namespace$: Bezeichnung des Namensraums.
      2. Query$: Abfrage der Klasse.
      3. @Output$: Das Ergebnis der Abfrage wird im XML-Format in die String-Variable gespeichert.
    • Rückgabewert:
      • 0: Der Vorgang war erfolgreich.
    • Beispielcode:

      Code: Alles auswählen

      EnableExplicit
      
      Global PBEx_WMI
      
      CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
        PBEx_WMI = OpenLibrary(#PB_Any, "PB.Ex_WMI_x86.dll")
      CompilerElseIf #PB_Compiler_Processor = #PB_Processor_x64
        PBEx_WMI = OpenLibrary(#PB_Any, "PB.Ex_WMI_x64.dll")
      CompilerEndIf
      
      If PBEx_WMI
        Prototype ExecuteWMIQuery(Namespace.p-Unicode, Query.p-Unicode, Output)
        Global ExecuteWMIQuery.ExecuteWMIQuery = GetFunction(PBEx_WMI, "ExecuteWMIQuery")
        Prototype ExecuteWMIMethod(Namespace.p-Unicode, Query.p-Unicode, Method.p-Unicode, ParameterArray, ParameterArraySize)
        Global ExecuteWMIMethod.ExecuteWMIMethod = GetFunction(PBEx_WMI, "ExecuteWMIMethod")
        Prototype WaitWMIEvent(Query.p-Unicode, Timeout = 0)
        Global WaitWMIEvent.WaitWMIEvent = GetFunction(PBEx_WMI, "WaitWMIEvent")
        
        Define Output$ = Space(1000000)
        ExecuteWMIQuery("root\CIMV2", "SELECT * FROM Win32_LogicalDisk", @Output$)
        ParseXML(1, Output$)
        FormatXML(1, #PB_XML_WindowsNewline | #PB_XML_ReFormat | #PB_XML_ReIndent)
        Debug ComposeXML(1)
        
        CloseLibrary(PBEx_WMI)
      EndIf
  • ExecuteWMIMethod()
    • Syntax:

      Code: Alles auswählen

      Result = ExecuteWMIMethod(Namespace$, Query$, Method$, ParameterArray, ParameterArraySize)
    • Beschreibung: Führt eine Methode aus.
    • Parameter:
      1. Namespace$: Bezeichnung des Namensraums.
      2. Query$: Abfrage der Klasse und optional mit Bedingungen.
      3. Method$: Name der Methode, die ausgeführt werden soll.
      4. ParameterArray: Ein String-Array mit Parametern, die übergeben werden sollen. Parametername und -wert werden mit einem Gleichheitszeichen ohne Leerzeichen getrennt.
      5. ParameterArraySize: Anzahl der Elemente.
    • Rückgabewert:
      • 0: Der Vorgang war erfolgreich.
    • Beispielcode:

      Code: Alles auswählen

      EnableExplicit
      
      Global PBEx_WMI
      
      CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
        PBEx_WMI = OpenLibrary(#PB_Any, "PB.Ex_WMI_x86.dll")
      CompilerElseIf #PB_Compiler_Processor = #PB_Processor_x64
        PBEx_WMI = OpenLibrary(#PB_Any, "PB.Ex_WMI_x64.dll")
      CompilerEndIf
      
      If PBEx_WMI
        Prototype ExecuteWMIQuery(Namespace.p-Unicode, Query.p-Unicode, Output)
        Global ExecuteWMIQuery.ExecuteWMIQuery = GetFunction(PBEx_WMI, "ExecuteWMIQuery")
        Prototype ExecuteWMIMethod(Namespace.p-Unicode, Query.p-Unicode, Method.p-Unicode, ParameterArray, ParameterArraySize)
        Global ExecuteWMIMethod.ExecuteWMIMethod = GetFunction(PBEx_WMI, "ExecuteWMIMethod")
        Prototype WaitWMIEvent(Query.p-Unicode, Timeout = 0)
        Global WaitWMIEvent.WaitWMIEvent = GetFunction(PBEx_WMI, "WaitWMIEvent")
        
        ;Administratorrechte erforderlich
        Dim ParameterArray.s(0)
        ParameterArray(0) = "Name=YourNewUsername"
        Debug ExecuteWMIMethod("root\CIMV2", "Win32_UserAccount.Domain='YourWorkgroup',Name='YourUsername'", "Rename", ParameterArray(), ArraySize(ParameterArray())+1)
        
        CloseLibrary(PBEx_WMI)
      EndIf
  • WaitWMIEvent()
    • Syntax:

      Code: Alles auswählen

      Result = WaitWMIEvent(Class$, Query$, Timeout = 0)
    • Beschreibung: Wartet auf ein Event.
    • Parameter:
      1. Query$: Abfrage der Klasse und optional mit Bedingungen.
      2. Timeout: Zeit in Millisekunden, wie lange maximal auf ein Event gewartet werden soll. Wenn nichts oder 0 angegeben wurde, dann wird so lange gewartet, bis das Event ausgelöst wurde.
    • Rückgabewert:
      • 0: Der Vorgang war erfolgreich.
    • Beispielcode:

      Code: Alles auswählen

      EnableExplicit
      
      Global PBEx_WMI
      
      CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
        PBEx_WMI = OpenLibrary(#PB_Any, "PB.Ex_WMI_x86.dll")
      CompilerElseIf #PB_Compiler_Processor = #PB_Processor_x64
        PBEx_WMI = OpenLibrary(#PB_Any, "PB.Ex_WMI_x64.dll")
      CompilerEndIf
      
      If PBEx_WMI
        Prototype ExecuteWMIQuery(Namespace.p-Unicode, Query.p-Unicode, Output)
        Global ExecuteWMIQuery.ExecuteWMIQuery = GetFunction(PBEx_WMI, "ExecuteWMIQuery")
        Prototype ExecuteWMIMethod(Namespace.p-Unicode, Query.p-Unicode, Method.p-Unicode, ParameterArray, ParameterArraySize)
        Global ExecuteWMIMethod.ExecuteWMIMethod = GetFunction(PBEx_WMI, "ExecuteWMIMethod")
        Prototype WaitWMIEvent(Query.p-Unicode, Timeout = 0)
        Global WaitWMIEvent.WaitWMIEvent = GetFunction(PBEx_WMI, "WaitWMIEvent")
        
        ;Administratorrechte erforderlich
        Debug "Warten, bis der Taschenrechner gestartet wurde..."
        If WaitWMIEvent("SELECT * FROM Win32_ProcessStartTrace WHERE ProcessName = 'calc.exe'") = 0
          Debug "Taschenrechner wurde gestartet."
        Else
          Debug "Fehler"
        EndIf
        
        CloseLibrary(PBEx_WMI)
      EndIf
Systemvoraussetzungen:
  • Windows XP oder höher
  • .NET Framework 3.5 oder höher
  • Unicode-Aktivierung (standardmäßig ab PB 5.50)
Da das benötigte .NET Framework ab Windows 7 standardmäßig vorinstalliert ist und auf XP und Vista installiert werden kann, sollte das kein Problem sein, diese Version zu verwenden.
Es ist keine Assembly-Registrierung mit regasm.exe mit Administratorrechten notwendig wie bei COMatePLUS.

Lizenz: Diese DLL-Datei ist kostenlos und darf sowohl privat als auch kommerziell verwendet werden.
Folgende Copyright-Texte müssen mitgeliefert werden:
Copyright © 2019 RSBasic.de
Download: https://www.rsbasic.de/downloads/downlo ... Ex_WMI.zip
Bild

Ich würde mich über Feedbacks, Verbesserungsvorschläge, Fehlermeldungen oder Wünsche sehr freuen. Wer mich unterstützen möchte, kann mir auch was kleines spenden. Danke :)
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
joebusch
Beiträge: 6
Registriert: 21.12.2014 17:09

Re: PB.Ex WMI (Windows)

Beitrag von joebusch »

Hallo RSBasic,
erst mal Danke für die Dll's. Die Software funktioniert soweit ganz gut. Ich hätte eine Frage, kann man diese eventuell für eine neuere .Net Version kompilieren ?. Unter z.B. WInServer 2016 startet ein Installdialog, der dotNet 3.5 installieren will. Laut dem was ich hier ersehe https://docs.microsoft.com/de-de/dotnet ... -installed
ist dort z.b. 4.6.2 im Lieferumfang. Es wäre ungünstig nur für gelegentlich WMI Abfragen ein älteres Framework zu installieren, das dann wieder zahllose Updates nach sich zieht.
Ich weiss nicht, ob es Sinn macht, aber vielleicht kann man die Ausgabe auch in anderen Formaten (CSv,Json etc.) anbieten ? Damit man diese z.B in Sqlite importieren kann. (kann man sich auch selber umstellen) Ich habe diese intern in einer Struktuierten Liste (Liste + Map) verwendet. Fand ich irgendwie griffiger beim weiteren (internen) verarbeiten.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: PB.Ex WMI (Windows)

Beitrag von RSBasic »

PB.Ex WMI 1.0.1.0 wurde veröffentlicht.

Changelog:
  • Aktualisiert: .NET Framework 3.5 > .NET Framework 4.7.2


@joebusch
Ich hab es auf 4.7.2 aktualisiert. Das sollte auf Windows Server 2006 auch vorhanden sein.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Antworten