1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. BugFix

Beiträge von BugFix

  • WMIC - Interface

    • BugFix
    • 7. Juni 2021 um 09:29
    Zitat von Bitnugger

    WMIC ist ja veraltet... was aber stattdessen benutzt werden soll, schreiben die Deppen nicht.

    Zitat von Features Removed or Deprecated in Windows Server 2012

    wmic_depreciated.png

    Die recht entspannte Syntax von WMIC ist dann obsolet und man muss sich doch mit PS auseinandersetzen. Das ist zugegeben sehr mächtig, sehr schnell und sehr vielseitig - aber eben auch eine eigene Skriptsprache mit der man sich erst vertraut machen muss.

    M$ empfiehlt dann über die PS CmdLets auf den WMI-Namespace zuzgreifen (Abrufen von WMI-Objekten (Get-CimInstance statt: Get-WmiObject)


    Zitat von Bitnugger

    Wieso prüfst du nicht die WMIC-Version? Bei mir ist es die Version 10.0.1941.1 und da wird Syntax: verwendet.

    Letztlich weiß ich ja nicht ab welcher Version eine Änderung stattfand und ob diese auch durchgängig enthalten ist. Meine jetzige Methode prüft halt das, was rauskommt - egal welche Version von Windows oder WMIC läuft.

  • WMIC - Interface

    • BugFix
    • 6. Juni 2021 um 13:57

    Weitere Neuerungen

    • optional Begriffe aus der ComboBox bei Auswahl in Befehlszeile einfügen
    • ComboBox mit ausführbaren Beispielen hinzugefügt

    s. Post 1

  • WMIC - Interface

    • BugFix
    • 6. Juni 2021 um 10:52

    Noch eine Änderung:

    In anderen Windows 10 Versionen wird nicht USAGE sondern wieder SYNTAX verwendet. Wird jetzt unabhängig von OSBuild behandelt.

    Hinzugefügt: FileOpenDialog für evtl. OUTPUT-Dateien.

    Post #1

  • WMIC - Interface

    • BugFix
    • 6. Juni 2021 um 07:39
    Zitat von Bitnugger

    Das funktioniert so nicht zuverlässig... @OSBuild ist bei mir 19042 und $sDetect muss SYNTAX: sein.

    Drecks Windows 10. Ohne jede Struktur.

    OK dann mache ich die Unterscheidung nicht von @OSBuild abhängig (obwohl das recht elegant war),, sondern suche gezielt nach beiden Begriffen in der Hoffnung, dass nicht noch weitere "Virusvarianten" existieren.

  • WMIC - Interface

    • BugFix
    • 5. Juni 2021 um 23:39

    Problem mit Windows 10 behoben. Neue Version im Startpost.

  • WMIC - Interface

    • BugFix
    • 5. Juni 2021 um 23:12
    Zitat von UEZ

    aber unter Win10 heißt es "USAGE:".

    Dann sag das doch gleich. :rofl:

    OK, dann setze ich das mal mit rein.

    Hier noch ein Link zu: Beispielen

  • WMIC - Interface

    • BugFix
    • 5. Juni 2021 um 22:52
    Zitat von UEZ

    An der Funktion OemToChar scheint es nicht zu liegen!

    Hmm, alles Andere ist doch nur Leerzeilen raus schubsen.

    Probiere trotzdem mal diese Variante, hier habe ich auf "OemToCharBuffA" umgestellt. Unter Win 7 funktioniert das auch problemlos.

    AutoIt
    ;-- TIME_STAMP   2021-06-05 22:52:48   v 0.2
    
    #include <GuiEdit.au3>
    #include <WindowsConstants.au3>
    
    
    Global $aParam[][2] = [ _
    ['/NAMESPACE'  ,'Pfad des Namespaces, auf dem der Alias ausgeführt wird.'], _
    ['/ROLE'       ,'Pfad für die Funktion, die die Aliasdefinitionen enthält.'], _
    ['/NODE'       ,'Server, auf denen der Alias ausgeführt wird.'], _
    ['/IMPLEVEL'   ,'Client-Identitätswechselebene.'], _
    ['/AUTHLEVEL'  ,'Clientauthentifizierungsebene.'], _
    ['/LOCALE'     ,'Sprachkennung, die der Client verwenden soll.'], _
    ['/PRIVILEGES' ,'Aktiviert oder deaktiviert alle Berechtigungen.'], _
    ['/TRACE'      ,'Gibt die Debuginformationen nach stderr aus.'], _
    ['/RECORD'     ,'Protokolliert alle Eingabebefehle und die Ausgabe.'], _
    ['/INTERACTIVE','Setzt oder setzt den interaktiven Modus zurück.'], _
    ['/FAILFAST'   ,'Setzt den FailFast-Modus oder setzt ihn zurück.'], _
    ['/USER'       ,'Benutzer für die Sitzung.'], _
    ['/PASSWORD'   ,'Kennwort für die Sitzungsanmeldung.'], _
    ['/OUTPUT'     ,'Bestimmt den Ausgabeumleitungsmodus.'], _
    ['/APPEND'     ,'Bestimmt den Ausgabeumleitungsmodus.'], _
    ['/AGGREGATE'  ,'Setzt oder setzt den Aggregatsmodus zurück.'], _
    ['/AUTHORITY'  ,'Gibt den <Autoritätstyp> für die Verbindung an.']]
    ;~ /?[:<BRIEF|FULL>]    Zeigt die Syntaxinformationen an.
    
    Global $aAliase[][2] = [ _
    ['ALIAS'              , 'Zugriff auf die auf dem lokalen System verfügbaren Aliase'], _
    ['BASEBOARD'          , 'Hauptplatinenverwaltung (auch Motherboard oder Systemkarte genannt).'], _
    ['BIOS'               , 'BIOS-Verwaltung.'], _
    ['BOOTCONFIG'         , 'Startkonfigurationsverwaltung.'], _
    ['CDROM'              , 'CD-Verwaltung.'], _
    ['COMPUTERSYSTEM'     , 'Computersystemverwaltung.'], _
    ['CPU'                , 'CPU-Verwaltung.'], _
    ['CSPRODUCT'          , 'Computersystem-Produktinformationen von SMBIOS.'], _
    ['DATAFILE'           , 'Datendatei-Verwaltung.'], _
    ['DCOMAPP'            , 'DCOM-Anwendungsverwaltung.'], _
    ['DESKTOP'            , 'Benutzerdesktopverwaltung.'], _
    ['DESKTOPMONITOR'     , 'Desktopbildschirmverwaltung.'], _
    ['DEVICEMEMORYADDRESS', 'Gerätespeicheradress-Verwaltung.'], _
    ['DISKDRIVE'          , 'Verwaltung des physikalischen Laufwerks.'], _
    ['DISKQUOTA'          , 'Datenträgerspeicherplatz-Nutzung für NTFS-Volumes.'], _
    ['DMACHANNEL'         , 'DMA-Kanalverwaltung.'], _
    ['ENVIRONMENT'        , 'Systemumgebungs-Einstellungsverwaltung.'], _
    ['FSDIR'              , 'Dateisystem-Verzeichniseintragsverwaltung.'], _
    ['GROUP'              , 'Gruppenkontenverwaltung.'], _
    ['IDECONTROLLER'      , 'IDE-Controllerverwaltung.'], _
    ['IRQ'                , 'IRQ-Verwaltung.'], _
    ['JOB'                , 'Bietet Zugriff auf mit dem Zeitplandienst geplante Aufträge.'], _
    ['LOADORDER'          , 'Verwaltung von Systemdiensten, die Ausführungsabhängigkeiten definieren.'], _
    ['LOGICALDISK'        , 'Verwaltung des lokalen Speichergeräts.'], _
    ['LOGON'              , 'Anmeldesitzungen.'], _
    ['MEMCACHE'           , 'Cacheverwaltung.'], _
    ['MEMORYCHIP'         , 'Speicherchipinformationen.'], _
    ['MEMPHYSICAL'        , 'Verwaltung des physikalischen Speichers des Computers.'], _
    ['NETCLIENT'          , 'Netzwerkclientverwaltung.'], _
    ['NETLOGIN'           , 'Verwaltung der Netzwerkanmeldeinformationen (eines bestimmten Benutzers).'], _
    ['NETPROTOCOL'        , 'Protokollverwaltung (und die Verwaltung der Protokollnetzwerkeigenschaften).'], _
    ['NETUSE'             , 'Verwaltung der aktiven Netzwerkverbindung.'], _
    ['NIC'                , 'NIC-Verwaltung.'], _
    ['NICCONFIG'          , 'Netzwerkadapterverwaltung.'], _
    ['NTDOMAIN'           , 'NT-Domänenverwaltung.'], _
    ['NTEVENT'            , 'Enträge im NT-Ereignisprotokoll.'], _
    ['NTEVENTLOG'         , 'NT-Ereignisprotokoll-Dateiverwaltung.'], _
    ['ONBOARDDEVICE'      , 'Verwaltung der in der Hauptplatine eingebauten Standardadapter (Systemkarte).'], _
    ['OS'                 , 'Verwaltung der installierten Betriebssysteme.'], _
    ['PAGEFILE'           , 'Verwaltung des virtuellen Speichers für den Dateiaustausch.'], _
    ['PAGEFILESET'        , 'Auslagerungsdatei-Einstellungsverwaltung.'], _
    ['PARTITION'          , 'Verwaltung von partitionierten Bereichen des physikalischen Datenträgers.'], _
    ['PORT'               , 'E/A-Anschlussverwaltung.'], _
    ['PORTCONNECTOR'      , 'Verwaltung von physikalischen Verbindungsanschlüssen.'], _
    ['PRINTER'            , 'Druckerverwaltung.'], _
    ['PRINTERCONFIG'      , 'Druckerkonfigurationsverwaltung.'], _
    ['PRINTJOB'           , 'Druckauftragsverwaltung.'], _
    ['PROCESS'            , 'Prozessverwaltung.'], _
    ['PRODUCT'            , 'Installationspaket-Aufgabenverwaltung.'], _
    ['QFE'                , 'QFE (Quick Fix Engineering).'], _
    ['QUOTASETTING'       , 'Setzt Informationen für Datenträgerkontingente auf einem Volume.'], _
    ['RDACCOUNT'          , 'Remotedesktopverbindungs-Berechtigungsverwaltung'], _
    ['RDNIC'              , 'Remotedesktopverbindungs-Verwaltung auf einem bestimmten Netzwerkadapter'], _
    ['RDPERMISSIONS'      , 'Berechtigungen für eine bestimmte Remotedesktopverbindung'], _
    ['RDTOGGLE'           , 'Remotedesktoplistener wird remote ein- und ausgeschaltet.'], _
    ['RECOVEROS'          , 'Informationen, die aus dem Speicher beim Fehlschlagen des Betriebssystems zusammengestellt werden.'], _
    ['REGISTRY'           , 'Computersystemregistrierungsverwaltung.'], _
    ['SCSICONTROLLER'     , 'SCSI-Controllerverwaltung.'], _
    ['SERVER'             , 'Serverinformationsverwaltung.'], _
    ['SERVICE'            , 'Dienstanwendungsverwaltung.'], _
    ['SHADOWCOPY'         , 'Schattenkopieverwaltung.'], _
    ['SHADOWSTORAGE'      , 'Schattenkopiespeicherverwaltung.'], _
    ['SHARE'              , 'Verwaltung von gemeinsam genutzten Ressourcen.'], _
    ['SOFTWAREELEMENT'    , 'Verwaltung der auf dem System installierten Softwareproduktelemente.'], _
    ['SOFTWAREFEATURE'    , 'Verwaltung von Softwareprodukten, die untergeordnete Sätze von "SoftwareElement".'], _
    ['SOUNDDEV'           , 'Audiogeräteverwaltung.'], _
    ['STARTUP'            , 'Verwaltung von Befehlen, die automatisch bei der Benutzeranmeldung am System ausgeführt werden.'], _
    ['SYSACCOUNT'         , 'Systemkontenverwaltung.'], _
    ['SYSDRIVER'          , 'Verwaltung von einem Systemtreiber für einen Basisdienst.'], _
    ['SYSTEMENCLOSURE'    , 'Systemgehäuseverwaltung.'], _
    ['SYSTEMSLOT'         , 'Verwaltung von physikalischen Verbindungspunkten, einschließlich Anschlüssen, Steckplätzen und Peripheriegeräten, und proprietären Verbindungspunkten.'], _
    ['TAPEDRIVE'          , 'Bandlaufwerkverwaltung.'], _
    ['TEMPERATURE'        , 'Datenverwaltung eines Temperatursensors (elektronisches Thermometer).'], _
    ['TIMEZONE'           , 'Zeitzonen-Datenverwaltung.'], _
    ['UPS'                , 'Verwaltung der unterbrechungsfreien Stromversorgung (USV).'], _
    ['USERACCOUNT'        , 'Benutzerkontenverwaltung.'], _
    ['VOLTAGE'            , 'Spannungssensor-Datenverwaltung.'], _
    ['VOLUME'             , 'Verwaltung des lokalen Speichervolumes.'], _
    ['VOLUMEQUOTASETTING' , 'Assoziiert die Datenträgerkontingentseinstellung auf ein bestimmtes Volume.'], _
    ['VOLUMEUSERQUOTA'    , 'Verwaltung des Speichervolumekontingents je Benutzer.'], _
    ['WMISET'             , 'Verwaltung für die optionalen WMI-Dienstparameter.']]
    
    Global $aGlobal[][2] = [ _
    ['CLASS'  , 'Wechselt zum vollständigen WMI-Schema.'], _
    ['PATH'   , 'Wechselt zu vollständigen WMI-Objektpfaden.' & @CRLF & 'z.B.: "wmic PATH Win32_Processor get loadpercentage"' & @CRLF & 'statt: "wmic cpu get loadpercentage"'], _
    ['CONTEXT', 'Zeigt den Status aller globalen Parameter an.']]
    ;~ QUIT/EXIT - Beendet das Programm.
    
    Global $aCmd[][2] = [ _
    ['GET'   , 'Zeigt alle oder einzelne Eigenschaften einer Klasse an,' & @CRLF & 'z.B.: GET /Value (alle) oder GET Name,SID (nur benannte)'], _
    ['LIST'  , 'Alle oder eine vordefinierte Anzahl von Eigenschaften anzeigen:' & @CRLF & 'LIST /Full (vollständig) bzw. LIST /Brief (kurz, nicht so flexibel wie GET)'], _
    ['SET'   , 'Einige (nicht alle) Klassen lassen das Ändern von einigen Eigenschaften zu' & @CRLF & '(z.B. Prozesspriorität auf hoch setzen)'], _
    ['CALL'  , 'Über CALL können Methoden (Befehle) an Klassenobjekte gesendet werden:' & @CRLF & 'zB: den PC rebooten oder Programme ausführen'], _
    ['CREATE', 'Meist zum erstellen von Systemvariablen verwendet']]
    
    Global $aSyntaxElements[][2] = [ _
    ['/FORMAT:htable', 'Ausgabeformat als HTML-Tabelle oder HTML-Report (eigentlich nur sinnvoll mit dem Umleiten in eine Datei (/OUTPUT)'], _
    ['/FORMAT:hform' , 'Ausgabeformat als HTML-Tabelle oder HTML-Report (eigentlich nur sinnvoll mit dem Umleiten in eine Datei (/OUTPUT)'], _
    ['WHERE'         , "Dient zum Filtern bzw. zum Auswählen einer Instanz" & @CRLF & "z.B.: wmic process where ""name='iexplore.exe'"" call terminate" & @CRLF & 'Anführungszeichen beachten!'], _
    ['LIKE'          , 'Neben "=" "<" ">" "<>" ein weiterer logischer WHERE-Operator' & @CRLF & 'z.B.: wmic process where "name LIKE ''%xplore%''" call terminate'], _
    ['/EVERY:n'      , 'Auftrag alle n Sekunden wiederholen. Funktioniert mit GET & LIST' & @CRLF & 'z.B.: wmic os get FreePhysicalMemory /every:30']]
    
    
    
    Global $hGui = GUICreate('WMIC - Interface', 1000, 800)
    GUISetFont(9, 400, Default, 'Consolas')
    GUICtrlCreateGroup('', 10, 10, 980, 70)
    
    GUICtrlCreateLabel('Parameter', 20, 25)
    Global $coParam = GUICtrlCreateCombo('', 20, 40, 184, 20, 0x0003)
    
    GUICtrlCreateLabel('Aliase', 214, 25)
    Global $coAliase = GUICtrlCreateCombo('', 214, 40, 184, 20, 0x0003)
    
    GUICtrlCreateLabel('Global', 408, 25)
    Global $coGlobal = GUICtrlCreateCombo('', 408, 40, 184, 20, 0x0003)
    
    GUICtrlCreateLabel('Befehle', 602, 25)
    Global $coCommand = GUICtrlCreateCombo('', 602, 40, 184, 20, 0x0003)
    
    GUICtrlCreateLabel('Syntaxelemente', 796, 25)
    Global $coSyntax = GUICtrlCreateCombo('', 796, 40, 184, 20, 0x0003)
    
    Global $edHelp = GUICtrlCreateEdit('', 10, 90, 980, 200)
    GUICtrlSetBkColor(-1, 0xFFFFAA)
    GUICtrlSetColor(-1, 0x030303)
    
    Global $inWMIC = GUICtrlCreateInput('', 10, 310, 920, 20)
    _GUICtrlEdit_SetCueBanner(GUICtrlGetHandle($inWMIC), 'Befehlszeile eingeben (führendes "WMIC" nicht zwingend, wird automatisch ergänzt)', True)
    
    Global $btRun = GUICtrlCreateButton('Run', 940, 310, 50, 20, 0x0001)
    
    Global $edWMIC = GUICtrlCreateEdit('Konsole WMIC', 10, 350, 980, 440, BitOR($WS_VSCROLL,$WS_HSCROLL,$ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_READONLY))
    GUICtrlSetBkColor(-1, 0x001D45)
    GUICtrlSetColor(-1, 0xF6F0F3)
    
    Global $aAssign[$coSyntax +1]
    $aAssign[$coParam] = $aParam
    $aAssign[$coAliase] = $aAliase
    $aAssign[$coGlobal] = $aGlobal
    $aAssign[$coCommand] = $aCmd
    $aAssign[$coSyntax] = $aSyntaxElements
    
    _FillCombo($coParam)
    _FillCombo($coAliase)
    _FillCombo($coGlobal)
    _FillCombo($coCommand)
    _FillCombo($coSyntax)
    
    GUISetState()
    ControlFocus($hGui, '', $inWMIC)
    _ShowDescription($coParam)
    
    Global $iMsg
    
    While True
        $iMsg = GUIGetMsg()
        Switch $iMsg
            Case -3
                Exit
            Case $coParam, $coAliase, $coGlobal, $coCommand, $coSyntax
                _ShowDescription($iMsg)
            Case $btRun
                _RunWMIC()
        EndSwitch
    WEnd
    
    
    Func _FillCombo($_ID)
        Local $sData, $ar = $aAssign[$_ID]
        For $i = 0 To UBound($ar) -1
            $sData &= $ar[$i][0] & '|'
        Next
        GUICtrlSetData($_ID, StringTrimRight($sData,1), $ar[0][0])
    EndFunc
    
    
    Func _ShowDescription($_ID)
        Local $sTerm = GUICtrlRead($_ID)
        Local $bSyntax = True
        If $_ID = $coCommand Or $_ID = $coSyntax Then $bSyntax = False
        $ar = $aAssign[$_ID]
        Local $sDescr, $sSyntax
        For $i = 0 To UBound($ar) -1
            If $ar[$i][0] = $sTerm Then
                $sDescr = $ar[$i][1]
                ExitLoop
            EndIf
        Next
        If $bSyntax Then $sSyntax = _WMIC_GetSyntax($sTerm)
        GUICtrlSetData($edHelp, '')
        GUICtrlSetData($edHelp, $sTerm & @CRLF & $sDescr & ($bSyntax ? @CRLF & @CRLF & 'SYNTAX:' & @CRLF & $sSyntax : ''))
    EndFunc
    
    
    Func _RunWMIC()
        Local $sCmd = GUICtrlRead($inWMIC)
        If $sCmd = '' Then Return
        GUICtrlSetData($edWMIC, '')
        Local $sConsole = $sCmd
        If StringLeft($sConsole, 4) <> 'WMIC' Then $sConsole = 'WMIC ' & $sConsole
        $sConsole &= @CRLF & _WMIC_Run($sCmd)
        If Not @error Then GUICtrlSetData($inWMIC, '')
        GUICtrlSetData($edWMIC, $sConsole)
    EndFunc
    
    
    ; Führt eine WMIC Operation aus.
    ; "WMIC" braucht dem Befehl nicht übergeben werden, wird von der Funktion automatisch komplettiert.
    ; Mit $_iOutput=1 (Standard) erfolgt die Rückgabe als String.
    ; ANSI-Werte in der Ausgabe werden konvertiert
    Func _WMIC_Run($_sCmd, $_iOutput=1)
        If StringLeft($_sCmd, 4) <> 'WMIC' Then $_sCmd = 'WMIC ' & $_sCmd
        Local $sRun = StringFormat('%s /c %s', @ComSpec, $_sCmd)
        Local $sOut = '', $iPID = Run($sRun, @ScriptDir, @SW_HIDE, BitOR(0x2,0x4))
        Local $sLine, $iErr, $aLine, $aRet, $sConsErr
        If $_iOutput = 1 Then
            Do
                $sLine = StdoutRead($iPID)
                $iErr = @error
                If Not $iErr And $sLine <> '' Then
                    $aLine = StringRegExp($sLine, '([^\r\n]+)', 3)
                    For $i = 0 To UBound($aLine) -1
                        If StringStripWS($aLine[$i], 8) <> '' Then
                            $sOut &= _OEMtoChar($aLine[$i]) & @CRLF
                        EndIf
                    Next
                EndIf
            Until $iErr
            $sConsErr = StderrRead($iPID)
            StdioClose($iPID)
        Else
            While ProcessExists($iPID)
                Sleep(350)
            WEnd
        EndIf
        If $sConsErr <> '' Then
            $sOut = _OEMtoChar($sConsErr)
        EndIf
        Return SetError(($sConsErr <> '' ? 1 : 0),0,($_iOutput = 1 ? $sOut : 1))
    EndFunc
    
    
    ; Analog zu _WMIC_Run()
    ; Das Ergebnis wird aber zeilenweise in ein 1D-Array geschrieben.
    ; Leere Zeilen werden ignoriert.
    Func _WMIC_Run_ToArray($_sCmd)
        If StringLeft($_sCmd, 4) <> 'WMIC' Then $_sCmd = 'WMIC ' & $_sCmd
        Local $sRun = StringFormat('%s /c %s', @ComSpec, $_sCmd)
        Local $iPID = Run($sRun, @ScriptDir, @SW_HIDE, BitOR(0x2,0x4))
        Local $sLine, $iErr, $aLine, $aRes[500], $iCount = 0, $aRet, $sConsErr, $bErr = False
        Do
            $sLine = StdoutRead($iPID)
            $iErr = @error
            If Not $iErr And $sLine <> '' Then
                $aLine = StringRegExp($sLine, '([^\r\n]+)', 3)
                For $i = 0 To UBound($aLine) -1
                    If StringStripWS($aLine[$i], 8) <> '' Then
                        $aRes[$iCount] = _OEMtoChar($aLine[$i])
                        $iCount += 1
                        If $iCount = UBound($aRes) Then ReDim $aRes[$iCount+500]
                    EndIf
                Next
            EndIf
        Until $iErr
        $sConsErr = StderrRead($iPID)
        StdioClose($iPID)
        If $sConsErr <> '' Then
            $aRes[0] = _OEMtoChar($sConsErr)
            ReDim $aRes[1]
            $bErr = True
        Else
            ReDim $aRes[$iCount]
        EndIf
        Return SetError(($bErr ? 1 : 0),0,$aRes)
    EndFunc
    
    Func _WMIC_GetSyntax($_Term, $_bAsArray=False)
        Local $aSyntax = _WMIC_Run_ToArray($_Term & ' /?')
        Local $bStart = False, $sSyntax = ''
        For $i = 0 To UBound($aSyntax) -1
            If Not $bStart And $aSyntax[$i] <> 'SYNTAX:' Then
                ContinueLoop
            ElseIf Not $bStart And $aSyntax[$i] = 'SYNTAX:' Then
                $bStart = True
            Else
                $sSyntax &= $aSyntax[$i] & @CRLF
            EndIf
        Next
        $sSyntax = StringTrimRight($sSyntax,2)
        Return ($_bAsArray ? StringSplit($sSyntax, @CRLF, 1+2) : $sSyntax)
    EndFunc
    
    
    Func _OEMtoChar($_sSrc)
        Local $iLen = StringLen($_sSrc)
        Local $tStr = DllStructCreate('char[' & $iLen & ']')
        DllStructSetData($tStr, 1, $_sSrc)
        Local $pStr = DllStructGetPtr($tStr)
        DllCall('user32', 'bool', 'OemToCharBuffA', 'ptr', $pStr, 'ptr', $pStr, 'dword', $iLen)
        Return DllStructGetData($tStr, 1)
    EndFunc
    Alles anzeigen
  • WMIC - Interface

    • BugFix
    • 5. Juni 2021 um 22:17
    Zitat von UEZ

    Unter WIn10 läuft dein Tool anders als unter Win7.

    Pooh, das ist natürlich Mist. Ich hatte als Notiz irgendwo gelesen, dass MS WMIC als DEPRECIATED markiert wurde. Hintergrund ist wohl, dass MS alles auf CIM-CmdLets umroutet, da diese OS-unabhängig sind.

    Vielleicht sind da schon Unterschiede.

    Die Syntax rufe ich ja direkt bei Auswahl des Begriffes ab, die ist nicht vorab gespeichert.

    Teste mal, ob du bei eigener Syntaxabfrage BIOS /? im Interface eine Ausgabe bekommst. Bzw teste mal direkt in einer CMD wmic bios /?. Das würde bedeuten, dass Win10 Probleme mit der Aufbereitung der Konsolenausgabe im Skript hat (evtl. OemToChar?).

  • WMIC - Interface

    • BugFix
    • 5. Juni 2021 um 19:33

    Auf WMIC bin ich in diesem Thread gestoßen. Wer ab und an mit WMI gearbeitet hat, wird das Tool (voller Name: Windows Management Instrumentation Console) sicher mögen. Der Zugriff auf die Systemkomponenten ist durch Aliase deutlich verständlicher als bei WMI.

    Hier mal noch die wenigen nützlichen Links dazu:

    • https://docs.microsoft.com/en-us/windows/win32/wmisdk/wmic
    • https://www.cs.cmu.edu/~tgp/scsadmins…MIC_Queries.txt
    • http://mcse.xn--krbel-jua.at/links/290/wmi/wmic.htm
    • https://xn--apfelbck-s4a.de/wmic-wmi-console/

    Ich habe die Informationen mal auf einer Oberfläche zusammengebracht, von der aus auch gleich Befehle ausgeführt werden können. Somit kann man sich Beschreibung und Syntaxinformation ausserhalb der Konsole anzeigen lassen.

    Da der "Run" Button als Pushbutton erstellt ist, ist also ein normaler Befehlsstart mit ENTER möglich. Ich lese sowohl Ergebnisse als auch Fehler aus und schreibe sie in die Pseudokonsole.


    EDIT:

    Unter Windows 10 wurde Syntax nicht erkannt - heißt dort USAGE (Danke an UEZ fürs Finden).

    Vertikale Scrollbar für Combos hinzugefügt.

    EDIT_2:

    Leider ist Windows 10 da nicht konsistent. In anderer Version steht statt USAGE wieder SYNTAX, habe das jetzt nicht über die Build-Version geregelt.

    NEU: Fileopendialog um eventuelle Ausgabedatei zu öffnen.

    EDIT_3:

    Jetzt hats mich gepackt. ^^

    NEU:

    • optional können Werte aus den ComboBoxen bei Auswahl in die Befehlszeile übernommen werden
    • einige Bsp. stehen in einer ComboBox zur Auswahl (Ansicht oder Ausführung) bereit
    AutoIt
    ;-- TIME_STAMP   2021-06-06 13:36:24   v 0.5
    
    
    #cs
    https://docs.microsoft.com/en-us/windows/win32/wmisdk/wmic
    https://www.cs.cmu.edu/~tgp/scsadmins/winadmin/WMIC_Queries.txt
    https://xn--apfelbck-s4a.de/wmic-wmi-console/
    http://mcse.xn--krbel-jua.at/links/290/wmi/wmic.htm
    
    Bsp. Dateiausgabe HTML-Format:
        WMIC /OUTPUT:processAu3.htm process WHERE "name='autoit3.exe'" GET /FORMAT:htable
    #ce
    
    
    #include <GuiEdit.au3>
    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    
    
    Global $aParam[][2] = [ _
    ['/APPEND'     ,'Bestimmt den Ausgabeumleitungsmodus.'], _
    ['/AGGREGATE'  ,'Setzt oder setzt den Aggregatsmodus zurück.'], _
    ['/AUTHLEVEL'  ,'Clientauthentifizierungsebene.'], _
    ['/AUTHORITY'  ,'Gibt den <Autoritätstyp> für die Verbindung an.'], _
    ['/FAILFAST'   ,'Setzt den FailFast-Modus oder setzt ihn zurück.'], _
    ['/IMPLEVEL'   ,'Client-Identitätswechselebene.'], _
    ['/INTERACTIVE','Setzt oder setzt den interaktiven Modus zurück.'], _
    ['/LOCALE'     ,'Sprachkennung, die der Client verwenden soll.'], _
    ['/NAMESPACE'  ,'Pfad des Namespaces, auf dem der Alias ausgeführt wird.'], _
    ['/NODE'       ,'Server, auf denen der Alias ausgeführt wird.'], _
    ['/OUTPUT'     ,'Bestimmt den Ausgabeumleitungsmodus.'], _
    ['/PASSWORD'   ,'Kennwort für die Sitzungsanmeldung.'], _
    ['/PRIVILEGES' ,'Aktiviert oder deaktiviert alle Berechtigungen.'], _
    ['/RECORD'     ,'Protokolliert alle Eingabebefehle und die Ausgabe.'], _
    ['/ROLE'       ,'Pfad für die Funktion, die die Aliasdefinitionen enthält.'], _
    ['/TRACE'      ,'Gibt die Debuginformationen nach stderr aus.'], _
    ['/USER'       ,'Benutzer für die Sitzung.']]
    ;~ /?[:<BRIEF|FULL>]    Zeigt die Syntaxinformationen an.
    
    Global $aAliase[][2] = [ _
    ['ALIAS'              , 'Zugriff auf die auf dem lokalen System verfügbaren Aliase'], _
    ['BASEBOARD'          , 'Hauptplatinenverwaltung (auch Motherboard oder Systemkarte genannt).'], _
    ['BIOS'               , 'BIOS-Verwaltung.'], _
    ['BOOTCONFIG'         , 'Startkonfigurationsverwaltung.'], _
    ['CDROM'              , 'CD-Verwaltung.'], _
    ['COMPUTERSYSTEM'     , 'Computersystemverwaltung.'], _
    ['CPU'                , 'CPU-Verwaltung.'], _
    ['CSPRODUCT'          , 'Computersystem-Produktinformationen von SMBIOS.'], _
    ['DATAFILE'           , 'Datendatei-Verwaltung.'], _
    ['DCOMAPP'            , 'DCOM-Anwendungsverwaltung.'], _
    ['DESKTOP'            , 'Benutzerdesktopverwaltung.'], _
    ['DESKTOPMONITOR'     , 'Desktopbildschirmverwaltung.'], _
    ['DEVICEMEMORYADDRESS', 'Gerätespeicheradress-Verwaltung.'], _
    ['DISKDRIVE'          , 'Verwaltung des physikalischen Laufwerks.'], _
    ['DISKQUOTA'          , 'Datenträgerspeicherplatz-Nutzung für NTFS-Volumes.'], _
    ['DMACHANNEL'         , 'DMA-Kanalverwaltung.'], _
    ['ENVIRONMENT'        , 'Systemumgebungs-Einstellungsverwaltung.'], _
    ['FSDIR'              , 'Dateisystem-Verzeichniseintragsverwaltung.'], _
    ['GROUP'              , 'Gruppenkontenverwaltung.'], _
    ['IDECONTROLLER'      , 'IDE-Controllerverwaltung.'], _
    ['IRQ'                , 'IRQ-Verwaltung.'], _
    ['JOB'                , 'Bietet Zugriff auf mit dem Zeitplandienst geplante Aufträge.'], _
    ['LOADORDER'          , 'Verwaltung von Systemdiensten, die Ausführungsabhängigkeiten definieren.'], _
    ['LOGICALDISK'        , 'Verwaltung des lokalen Speichergeräts.'], _
    ['LOGON'              , 'Anmeldesitzungen.'], _
    ['MEMCACHE'           , 'Cacheverwaltung.'], _
    ['MEMORYCHIP'         , 'Speicherchipinformationen.'], _
    ['MEMPHYSICAL'        , 'Verwaltung des physikalischen Speichers des Computers.'], _
    ['NETCLIENT'          , 'Netzwerkclientverwaltung.'], _
    ['NETLOGIN'           , 'Verwaltung der Netzwerkanmeldeinformationen (eines bestimmten Benutzers).'], _
    ['NETPROTOCOL'        , 'Protokollverwaltung (und die Verwaltung der Protokollnetzwerkeigenschaften).'], _
    ['NETUSE'             , 'Verwaltung der aktiven Netzwerkverbindung.'], _
    ['NIC'                , 'NIC-Verwaltung.'], _
    ['NICCONFIG'          , 'Netzwerkadapterverwaltung.'], _
    ['NTDOMAIN'           , 'NT-Domänenverwaltung.'], _
    ['NTEVENT'            , 'Enträge im NT-Ereignisprotokoll.'], _
    ['NTEVENTLOG'         , 'NT-Ereignisprotokoll-Dateiverwaltung.'], _
    ['ONBOARDDEVICE'      , 'Verwaltung der in der Hauptplatine eingebauten Standardadapter (Systemkarte).'], _
    ['OS'                 , 'Verwaltung der installierten Betriebssysteme.'], _
    ['PAGEFILE'           , 'Verwaltung des virtuellen Speichers für den Dateiaustausch.'], _
    ['PAGEFILESET'        , 'Auslagerungsdatei-Einstellungsverwaltung.'], _
    ['PARTITION'          , 'Verwaltung von partitionierten Bereichen des physikalischen Datenträgers.'], _
    ['PORT'               , 'E/A-Anschlussverwaltung.'], _
    ['PORTCONNECTOR'      , 'Verwaltung von physikalischen Verbindungsanschlüssen.'], _
    ['PRINTER'            , 'Druckerverwaltung.'], _
    ['PRINTERCONFIG'      , 'Druckerkonfigurationsverwaltung.'], _
    ['PRINTJOB'           , 'Druckauftragsverwaltung.'], _
    ['PROCESS'            , 'Prozessverwaltung.'], _
    ['PRODUCT'            , 'Installationspaket-Aufgabenverwaltung.'], _
    ['QFE'                , 'QFE (Quick Fix Engineering).'], _
    ['QUOTASETTING'       , 'Setzt Informationen für Datenträgerkontingente auf einem Volume.'], _
    ['RDACCOUNT'          , 'Remotedesktopverbindungs-Berechtigungsverwaltung'], _
    ['RDNIC'              , 'Remotedesktopverbindungs-Verwaltung auf einem bestimmten Netzwerkadapter'], _
    ['RDPERMISSIONS'      , 'Berechtigungen für eine bestimmte Remotedesktopverbindung'], _
    ['RDTOGGLE'           , 'Remotedesktoplistener wird remote ein- und ausgeschaltet.'], _
    ['RECOVEROS'          , 'Informationen, die aus dem Speicher beim Fehlschlagen des Betriebssystems zusammengestellt werden.'], _
    ['REGISTRY'           , 'Computersystemregistrierungsverwaltung.'], _
    ['SCSICONTROLLER'     , 'SCSI-Controllerverwaltung.'], _
    ['SERVER'             , 'Serverinformationsverwaltung.'], _
    ['SERVICE'            , 'Dienstanwendungsverwaltung.'], _
    ['SHADOWCOPY'         , 'Schattenkopieverwaltung.'], _
    ['SHADOWSTORAGE'      , 'Schattenkopiespeicherverwaltung.'], _
    ['SHARE'              , 'Verwaltung von gemeinsam genutzten Ressourcen.'], _
    ['SOFTWAREELEMENT'    , 'Verwaltung der auf dem System installierten Softwareproduktelemente.'], _
    ['SOFTWAREFEATURE'    , 'Verwaltung von Softwareprodukten, die untergeordnete Sätze von "SoftwareElement".'], _
    ['SOUNDDEV'           , 'Audiogeräteverwaltung.'], _
    ['STARTUP'            , 'Verwaltung von Befehlen, die automatisch bei der Benutzeranmeldung am System ausgeführt werden.'], _
    ['SYSACCOUNT'         , 'Systemkontenverwaltung.'], _
    ['SYSDRIVER'          , 'Verwaltung von einem Systemtreiber für einen Basisdienst.'], _
    ['SYSTEMENCLOSURE'    , 'Systemgehäuseverwaltung.'], _
    ['SYSTEMSLOT'         , 'Verwaltung von physikalischen Verbindungspunkten, einschließlich Anschlüssen, Steckplätzen und Peripheriegeräten, und proprietären Verbindungspunkten.'], _
    ['TAPEDRIVE'          , 'Bandlaufwerkverwaltung.'], _
    ['TEMPERATURE'        , 'Datenverwaltung eines Temperatursensors (elektronisches Thermometer).'], _
    ['TIMEZONE'           , 'Zeitzonen-Datenverwaltung.'], _
    ['UPS'                , 'Verwaltung der unterbrechungsfreien Stromversorgung (USV).'], _
    ['USERACCOUNT'        , 'Benutzerkontenverwaltung.'], _
    ['VOLTAGE'            , 'Spannungssensor-Datenverwaltung.'], _
    ['VOLUME'             , 'Verwaltung des lokalen Speichervolumes.'], _
    ['VOLUMEQUOTASETTING' , 'Assoziiert die Datenträgerkontingentseinstellung auf ein bestimmtes Volume.'], _
    ['VOLUMEUSERQUOTA'    , 'Verwaltung des Speichervolumekontingents je Benutzer.'], _
    ['WMISET'             , 'Verwaltung für die optionalen WMI-Dienstparameter.']]
    
    Global $aGlobal[][2] = [ _
    ['CLASS'  , 'Wechselt zum vollständigen WMI-Schema.'], _
    ['CONTEXT', 'Zeigt den Status aller globalen Parameter an.'], _
    ['PATH'   , 'Wechselt zu vollständigen WMI-Objektpfaden.' & @CRLF & 'z.B.: "wmic PATH Win32_Processor get loadpercentage"' & @CRLF & 'statt: "wmic cpu get loadpercentage"']]
    ;~ QUIT/EXIT - Beendet das Programm.
    
    Global $aCmd[][2] = [ _
    ['CALL'  , 'Über CALL können Methoden (Befehle) an Klassenobjekte gesendet werden:' & @CRLF & 'zB: den PC rebooten oder Programme ausführen'], _
    ['CREATE', 'Meist zum erstellen von Systemvariablen verwendet'], _
    ['GET'   , 'Zeigt alle oder einzelne Eigenschaften einer Klasse an,' & @CRLF & 'z.B.: GET /Value (alle) oder GET Name,SID (nur benannte)'], _
    ['LIST'  , 'Alle oder eine vordefinierte Anzahl von Eigenschaften anzeigen:' & @CRLF & '"LIST Full" (vollständig) bzw. "LIST Brief" (kurz, nicht so flexibel wie GET)'], _
    ['SET'   , 'Einige (nicht alle) Klassen lassen das Ändern von einigen Eigenschaften zu' & @CRLF & '(z.B. Prozesspriorität auf hoch setzen)']]
    
    Global $aSyntaxElements[][2] = [ _
    ['/EVERY:n'      , 'Auftrag alle n Sekunden wiederholen. Funktioniert mit GET & LIST' & @CRLF & 'z.B.: wmic os get FreePhysicalMemory /every:30'], _
    ['/FORMAT:hform' , 'Ausgabeformat als HTML-Tabelle oder HTML-Report (eigentlich nur sinnvoll mit dem Umleiten in eine Datei (/OUTPUT)'], _
    ['/FORMAT:htable', 'Ausgabeformat als HTML-Tabelle oder HTML-Report (eigentlich nur sinnvoll mit dem Umleiten in eine Datei (/OUTPUT)'], _
    ['LIKE'          , 'Neben "=" "<" ">" "<>" ein weiterer logischer WHERE-Operator' & @CRLF & 'z.B.: wmic process where "name LIKE ''%xplore%''" call terminate'], _
    ['WHERE'         , "Dient zum Filtern bzw. zum Auswählen einer Instanz" & @CRLF & "z.B.: wmic process where ""name='iexplore.exe'"" call terminate" & @CRLF & 'Anführungszeichen beachten!']]
    
    Global $aTemplate[][2] = [ _
    ['Output BIOS in Datei'    , 'BIOS > myBIOS.txt'], _
    ['Output BIOS in Clipboard', '/OUTPUT:CLIPBOARD BIOS'], _
    ['Output OS in Datei'      , 'OS >> myOS.txt'], _
    ['Output Netzwerk'         , '/OUTPUT:nicconfig.txt NICCONFIG LIST Brief'], _
    ['Prozeß AutoIt List Brief', 'PROCESS WHERE "Name=''autoit3.exe''" LIST Brief'], _
    ['Prozeß AutoIt List Full' , 'PROCESS WHERE "Name=''autoit3.exe''" LIST Full'], _
    ['Taschenrechner Starten'  , 'PROCESS CALL Create "calc.exe"'], _
    ['Taschenrechner Beenden'  , 'PROCESS WHERE Name="calc.exe" CALL Terminate']]
    
    
    Global $hGui = GUICreate('WMIC - Interface by @BugFix', 1000, 800)
    GUISetFont(9, 400, Default, 'Consolas')
    GUICtrlCreateGroup('', 10, 10, 980, 70)
    
    GUICtrlCreateLabel('Parameter', 20, 25)
    Global $coParam = GUICtrlCreateCombo('', 20, 40, 184, 20, BitOR(0x00200000,0x0003))
    
    GUICtrlCreateLabel('Aliase', 214, 25)
    Global $coAliase = GUICtrlCreateCombo('', 214, 40, 184, 20, BitOR(0x00200000,0x0003))
    
    GUICtrlCreateLabel('Global', 408, 25)
    Global $coGlobal = GUICtrlCreateCombo('', 408, 40, 184, 20, BitOR(0x00200000,0x0003))
    
    GUICtrlCreateLabel('Befehle', 602, 25)
    Global $coCommand = GUICtrlCreateCombo('', 602, 40, 184, 20, BitOR(0x00200000,0x0003))
    
    GUICtrlCreateLabel('Syntaxelemente', 796, 25)
    Global $coSyntax = GUICtrlCreateCombo('', 796, 40, 184, 20, BitOR(0x00200000,0x0003))
    
    Global $edHelp = GUICtrlCreateEdit('', 10, 90, 980, 200, BitOR($WS_VSCROLL,$WS_HSCROLL,$ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_READONLY))
    GUICtrlSetBkColor(-1, 0xFFFFAA)
    GUICtrlSetColor(-1, 0x030303)
    
    Global $inWMIC = GUICtrlCreateInput('', 10, 310, 980, 20)
    GUICtrlSetColor(-1, 0x000080)
    _GUICtrlEdit_SetCueBanner(GUICtrlGetHandle($inWMIC), 'Befehlszeile eingeben (führendes "WMIC" nicht zwingend, wird automatisch ergänzt)', True)
    
    Global $cbInsert = GUICtrlCreateCheckbox(' Wert aus ComboBox bei Auswahl in Befehlszeile übernehmen', 10, 340)
    GUICtrlCreateLabel('Beispiele:', 465, 344)
    Global $coTemplate = GUICtrlCreateCombo('', 550, 340, 200, 20, BitOR(0x00200000,0x0003))
    Global $btOpenFile = GUICtrlCreateButton('Öffne Ergebnisdatei', 760, 340, 160, 24)
    Global $btRun = GUICtrlCreateButton('Run', 940, 340, 50, 24, 0x0001)
    
    Global $edWMIC = GUICtrlCreateEdit('Konsole WMIC', 10, 370, 980, 420, BitOR($WS_VSCROLL,$WS_HSCROLL,$ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_READONLY))
    GUICtrlSetBkColor(-1, 0x001D45)
    GUICtrlSetColor(-1, 0xF6F0F3)
    
    Global $aAssign[$coTemplate +1]
    $aAssign[$coParam]    = $aParam
    $aAssign[$coAliase]   = $aAliase
    $aAssign[$coGlobal]   = $aGlobal
    $aAssign[$coCommand]  = $aCmd
    $aAssign[$coSyntax]   = $aSyntaxElements
    $aAssign[$coTemplate] = $aTemplate
    
    _FillCombo($coParam)
    _FillCombo($coAliase)
    _FillCombo($coGlobal)
    _FillCombo($coCommand)
    _FillCombo($coSyntax)
    _FillCombo($coTemplate)
    
    GUISetState()
    ControlFocus($hGui, '', $inWMIC)
    _ShowDescription($coParam)
    
    Global $iMsg, $sPath, $sSelection, $sAdd
    
    While True
        $iMsg = GUIGetMsg()
        Switch $iMsg
            Case -3
                Exit
            Case $coParam, $coAliase, $coGlobal, $coCommand, $coSyntax
                $sSelection = _ShowDescription($iMsg)
                $sAdd = $iMsg = $coParam ? ':' : ' '
                If BitAND(GUICtrlRead($cbInsert), $GUI_CHECKED) Then
                    GUICtrlSetData($inWMIC, GUICtrlRead($inWMIC) & $sSelection & $sAdd)
                    ControlFocus($hGui,'',$inWMIC)
                EndIf
            Case $coTemplate
                $sSelection = GUICtrlRead($coTemplate)
                For $i = 0 To UBound($aTemplate) -1
                    If $aTemplate[$i][0] = $sSelection Then
                        If BitAND(GUICtrlRead($cbInsert), $GUI_CHECKED) Then
                            GUICtrlSetData($inWMIC, $aTemplate[$i][1])
                        Else
                            GUICtrlSetData($edHelp, 'BEISPIEL "' & $sSelection & '"' & @CRLF & @CRLF & 'WMIC ' & $aTemplate[$i][1])
                        EndIf
                    EndIf
                Next
            Case $btOpenFile
                $sPath = FileOpenDialog('Öffnen Ergebnisdatei', @ScriptDir, "All (*.*)")
                If Not @error Then ShellExecute($sPath)
            Case $btRun
                _RunWMIC()
        EndSwitch
    WEnd
    
    
    Func _FillCombo($_ID)
        Local $sData, $ar = $aAssign[$_ID]
        For $i = 0 To UBound($ar) -1
            $sData &= $ar[$i][0] & '|'
        Next
        GUICtrlSetData($_ID, StringTrimRight($sData,1), $ar[0][0])
    EndFunc
    
    
    Func _ShowDescription($_ID)
        Local $sTerm = GUICtrlRead($_ID)
        Local $bSyntax = True
        If $_ID = $coCommand Or $_ID = $coSyntax Then $bSyntax = False
        $ar = $aAssign[$_ID]
        Local $sDescr, $sSyntax
        For $i = 0 To UBound($ar) -1
            If $ar[$i][0] = $sTerm Then
                $sDescr = $ar[$i][1]
                ExitLoop
            EndIf
        Next
        If $bSyntax Then $sSyntax = _WMIC_GetSyntax($sTerm)
        GUICtrlSetData($edHelp, '')
        GUICtrlSetData($edHelp, $sTerm & @CRLF & $sDescr & ($bSyntax ? @CRLF & @CRLF & 'SYNTAX:' & @CRLF & $sSyntax : ''))
        Return $sTerm
    EndFunc
    
    
    Func _RunWMIC()
        Local $sCmd = GUICtrlRead($inWMIC)
        If $sCmd = '' Then Return
        GUICtrlSetData($edWMIC, '')
        Local $sConsole = $sCmd
        If StringLeft($sConsole, 4) <> 'WMIC' Then $sConsole = 'WMIC ' & $sConsole
        $sConsole &= @CRLF & _WMIC_Run($sCmd)
        If Not @error Then GUICtrlSetData($inWMIC, '')
        GUICtrlSetData($edWMIC, $sConsole)
    EndFunc
    
    
    ; Führt eine WMIC Operation aus.
    ; "WMIC" braucht dem Befehl nicht übergeben werden, wird von der Funktion automatisch komplettiert.
    ; Mit $_iOutput=1 (Standard) erfolgt die Rückgabe als String.
    ; ANSI-Werte in der Ausgabe werden konvertiert
    Func _WMIC_Run($_sCmd, $_iOutput=1)
        If StringLeft($_sCmd, 4) <> 'WMIC' Then $_sCmd = 'WMIC ' & $_sCmd
        Local $sRun = StringFormat('%s /c %s', @ComSpec, $_sCmd)
        Local $sOut = '', $iPID = Run($sRun, @ScriptDir, @SW_HIDE, BitOR(0x2,0x4))
        Local $sLine, $iErr, $aLine, $aRet, $sConsErr
        If $_iOutput = 1 Then
            Do
                $sLine = StdoutRead($iPID)
                $iErr = @error
                If Not $iErr And $sLine <> '' Then
                    $aLine = StringRegExp($sLine, '([^\r\n]+)', 3)
                    For $i = 0 To UBound($aLine) -1
                        If StringStripWS($aLine[$i], 8) <> '' Then
                            $sOut &= _OEMtoChar($aLine[$i]) & @CRLF
                        EndIf
                    Next
                EndIf
            Until $iErr
            $sConsErr = StderrRead($iPID)
            StdioClose($iPID)
        Else
            While ProcessExists($iPID)
                Sleep(350)
            WEnd
        EndIf
        If $sConsErr <> '' Then $sOut = _OEMtoChar($sConsErr)
        Return SetError(($sConsErr <> '' ? 1 : 0),0,($_iOutput = 1 ? $sOut : 1))
    EndFunc
    
    
    ; Analog zu _WMIC_Run()
    ; Das Ergebnis wird aber zeilenweise in ein 1D-Array geschrieben.
    ; Leere Zeilen werden ignoriert.
    Func _WMIC_Run_ToArray($_sCmd)
        If StringLeft($_sCmd, 4) <> 'WMIC' Then $_sCmd = 'WMIC ' & $_sCmd
        Local $sRun = StringFormat('%s /c %s', @ComSpec, $_sCmd)
        Local $iPID = Run($sRun, @ScriptDir, @SW_HIDE, BitOR(0x2,0x4))
        Local $sLine, $iErr, $aLine, $aRes[500], $iCount = 0, $aRet, $sConsErr, $bErr = False
        Do
            $sLine = StdoutRead($iPID)
            $iErr = @error
            If Not $iErr And $sLine <> '' Then
                $aLine = StringRegExp($sLine, '([^\r\n]+)', 3)
                For $i = 0 To UBound($aLine) -1
                    If StringStripWS($aLine[$i], 8) <> '' Then
                        $aRes[$iCount] = _OEMtoChar($aLine[$i])
                        $iCount += 1
                        If $iCount = UBound($aRes) Then ReDim $aRes[$iCount+500]
                    EndIf
                Next
            EndIf
        Until $iErr
        $sConsErr = StderrRead($iPID)
        StdioClose($iPID)
        If $sConsErr <> '' Then
            $aRes[0] = _OEMtoChar($sConsErr)
            ReDim $aRes[1]
            $bErr = True
        Else
            ReDim $aRes[$iCount]
        EndIf
        Return SetError(($bErr ? 1 : 0),0,$aRes)
    EndFunc
    
    
    Func _WMIC_GetSyntax($_Term, $_bAsArray=False)
        Local $aSyntax = _WMIC_Run_ToArray($_Term & ' /?')
        Local $bStart = False, $sSyntax = ''
        For $i = 0 To UBound($aSyntax) -1
            If Not $bStart And ($aSyntax[$i] <> 'USAGE:' And $aSyntax[$i] <> 'SYNTAX:') Then
                ContinueLoop
            ElseIf Not $bStart And ($aSyntax[$i] = 'USAGE:' Or $aSyntax[$i] = 'SYNTAX:') Then
                $bStart = True
            Else
                $sSyntax &= $aSyntax[$i] & @CRLF
            EndIf
        Next
        $sSyntax = StringTrimRight($sSyntax,2)
        Return ($_bAsArray ? StringSplit($sSyntax, @CRLF, 1+2) : $sSyntax)
    EndFunc
    
    
    Func _OEMtoChar($_sSrc)
        Local $iLen = StringLen($_sSrc)
        Local $tStr = DllStructCreate('char[' & $iLen & ']')
        DllStructSetData($tStr, 1, $_sSrc)
        Local $pStr = DllStructGetPtr($tStr)
        DllCall('user32', 'bool', 'OemToCharBuffA', 'ptr', $pStr, 'ptr', $pStr, 'dword', $iLen)
        Return DllStructGetData($tStr, 1)
    EndFunc
    Alles anzeigen

    Viel Spaß beim Probieren.


    Bsp. Ausgabe in Datei (HTML-Format)

    wmic_example_out_htm.PNG  wmic_example_out_htm_2.PNG


    wmic_example_out_htm_3.PNG  wmic_example_out_htm_4.PNG

    Dateien

    WMIC-Interface.au3 17,56 kB – 514 Downloads
  • _WinAPI_GetProcessCommandLine​() funktioniert scheinbar nicht mehr?

    • BugFix
    • 5. Juni 2021 um 16:57
    Zitat von HansJ54

    Gleich noch eine doofe Frage: der String, den ich mit StringSplit in das Array stecke, hat am Ende einmal einen leeren Eintrag und dann noch einen mit 1 Byte. Jetzt brauche ich mal eine Idee, wie ich den String vor dem Zerlegen in Hex Byte für Byte anzeigen kann um zu sehen, was da hinten dran hängt. Auf Anhieb nichts dazu gefunden, wie das geht.

    - Du splittest die Consolenausgabe (am Zeilenumbruch?)

    - Du hast Leerzeilen drin

    - Ein String hat nur ein Byte

    Habe ich das richtig verstanden?

    Splitten der Konsolenausgabe muss man differenzierter machen. Es wird ständig was (auch Leeres) in die Konsole ausgegeben solange die PID existiert, da musst du schon beim Abgreifen der Ergebnisse korrigieren.

    Kannst ja mal auf diese Fuktionen zurückgreifen:

    AutoIt
    ; Führt eine WMIC Operation aus. 
    ; "WMIC" braucht dem Befehl nicht übergeben werden, wird von der Funktion automatisch komplettiert.
    ; Mit $_iOutput=1 (Standard) erfolgt die Rückgabe als String.
    ; ANSI-Werte in der Ausgabe werden konvertiert
    Func _WMIC_Run($_sCmd, $_iOutput=1)
        If StringLeft($_sCmd, 4) <> 'WMIC' Then $_sCmd = 'WMIC ' & $_sCmd
        Local $sRun = StringFormat('%s /c %s', @ComSpec, $_sCmd)
        Local $sOut = '', $iPID = Run($sRun, @ScriptDir, @SW_HIDE, 0x2)
        Local $sLine, $iErr, $aLine, $aRet
        If $_iOutput = 1 Then
            Do
                $sLine = StdoutRead($iPID)
                $iErr = @error
                If Not $iErr And $sLine <> '' Then
                    $aLine = StringRegExp($sLine, '([^\r\n]+)', 3)
                    For $i = 0 To UBound($aLine) -1
                        If StringStripWS($aLine[$i], 8) <> '' Then
                            $aRet = DllCall("user32.dll", "bool", "OemToChar", "str", $aLine[$i], "str", "")
                            $sOut &= $aRet[2] & @CRLF
                        EndIf
                    Next
                EndIf
            Until $iErr
            StdioClose($iPID)
        Else
            While ProcessExists($iPID)
                Sleep(350)
            WEnd
        EndIf
        Return ($_iOutput = 1 ? $sOut : 1)
    EndFunc
    
    
    ; Analog zu _WMIC_Run()
    ; Das Ergebnis wird aber zeilenweise in ein 1D-Array geschrieben.
    ; Leere Zeilen werden ignoriert.
    Func _WMIC_Run_ToArray($_sCmd)
        If StringLeft($_sCmd, 4) <> 'WMIC' Then $_sCmd = 'WMIC ' & $_sCmd
        Local $sRun = StringFormat('%s /c %s', @ComSpec, $_sCmd)
        Local $iPID = Run($sRun, @ScriptDir, @SW_HIDE, 0x2)
        Local $sLine, $iErr, $aLine, $aRes[500], $iCount = 0, $aRet
        Do
            $sLine = StdoutRead($iPID)
            $iErr = @error
            If Not $iErr And $sLine <> '' Then
                $aLine = StringRegExp($sLine, '([^\r\n]+)', 3)
                For $i = 0 To UBound($aLine) -1
                    If StringStripWS($aLine[$i], 8) <> '' Then
                        $aRet = DllCall("user32.dll", "bool", "OemToChar", "str", $aLine[$i], "str", "")
                        $aRes[$iCount] = $aRet[2]
                        $iCount += 1
                        If $iCount = UBound($aRes) Then ReDim $aRes[$iCount+500]
                    EndIf
                Next
            EndIf
        Until $iErr
        StdioClose($iPID)
        ReDim $aRes[$iCount]
        Return $aRes
    EndFunc
    Alles anzeigen
  • _WinAPI_GetProcessCommandLine​() funktioniert scheinbar nicht mehr?

    • BugFix
    • 5. Juni 2021 um 14:42
    Zitat

    Zitat von BugFix

    Quatsch, das ist so, als ob du Äpfel mit Birnen vergleichst... in Post #9 verwendest du in dem Run() den Befehl Find, in Post #14 machst du es ganz anders - ohne Find.

    He He - das ist nicht auf meinem Mist gewachsen. :rofl:

  • _WinAPI_GetProcessCommandLine​() funktioniert scheinbar nicht mehr?

    • BugFix
    • 4. Juni 2021 um 20:20
    Zitat

    Aber jetzt brauche ich noch einen Tipp, ob es eine AutoIt-Funktion gibt, die die letzten Elemente oder alle Elemente, die leer sind, aus einer Tabelle löscht oder ob man es nur in der Art wie mein _ArrayClear() machen kann.

    Wenn es die letzten Elemente sind und die Anzahl der nicht-leeren Elemente bekannt ist, kannst du mit ReDim das Array verkleinern.

  • _WinAPI_GetProcessCommandLine​() funktioniert scheinbar nicht mehr?

    • BugFix
    • 4. Juni 2021 um 18:03

    Die schnellste Lösung ist meist PowerShell, so auch hier. Und die Ausgabe ist komplett.

    Wichtig: Unbedingt Format-Table mit Out-String Cmdlet kombinieren, sonst wird die Zeile abgeschnitten.

    AutoIt
    Global $sProcess = 'chrome.exe'
    Global $sPathOutFile = 'C:\Code\chrome_processlist.txt'
    
    
    Global $sCmdPS = _
    'Get-WmiObject Win32_Process -Filter "name = ''' & $sProcess & '''" | Select-Object CommandLine | ' & _
    'Format-Table -Property * -AutoSize | Out-String -Width 4096 | Out-File -FilePath ' & $sPathOutFile
    
    
    _PowerShell_Run($sCmdPS)
    
    
    Func _PowerShell_Run($_sCmd, $_iOutput=0)
        Local Const $sKey32 = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell"
        Local Const $sKey64 = "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell"
        Local Static $sKey = @CPUArch = 'X64' ? $sKey64 : $sKey32
        Local Static $sPSexe = RegRead($sKey, 'Path')
        Local $sPathTMP = StringFormat('%s\__%s%s%s%s%s%s%s.ps1', @TempDir, @YEAR, @MON, @MDAY, @HOUR, @MIN, @SEC, @MSEC)
        Local $fH = FileOpen($sPathTMP, 2+8+128)
        FileWrite($fH, $_sCmd)
        FileClose($fH)
        Local $sRun = StringFormat('%s -ExecutionPolicy UnRestricted -File %s', $sPSexe, $sPathTMP)
        Local $sOut = '', $iPID = Run($sRun, @ScriptDir, @SW_HIDE, 0x2)
        If $_iOutput = 1 Then
            Do
                $sOut &= StdoutRead($iPID)
            Until @error
            StdioClose($iPID)
        Else
            While ProcessExists($iPID)
                Sleep(350)
            WEnd
        EndIf
        FileDelete($sPathTMP)
        Return ($_iOutput = 1 ? $sOut : 1)
    EndFunc
    Alles anzeigen
  • _WinAPI_GetProcessCommandLine​() funktioniert scheinbar nicht mehr?

    • BugFix
    • 3. Juni 2021 um 18:40

    Versuchs mal mit WMI:

    Code
    WMIC path win32_process get Caption,Processid,Commandline

    Kannst du auch in AutoIt mit WMI Objekt ausführen. Habe nur gerade keinen PC zur Hand.

    Ausgabe in Datei geht auch:

    Code
    WMIC /OUTPUT:C:\Process.txt path win32_process get Caption,Processid,Commandline
  • _WinAPI_GetProcessCommandLine​() funktioniert scheinbar nicht mehr?

    • BugFix
    • 3. Juni 2021 um 13:51
    Zitat

    This function uses undocumented API functions and may stop working properly in future versions of Windows.

    Using this function for some processes may require full access rights. Use _WinAPI_AdjustTokenPrivileges()
    function to enable $SE_DEBUG_NAME privilege before calling this function.

    Undokumentierte Funktionen die möglicherweise in neueren Windowsversionen nicht mehr richtig funktionieren.

    Ich denke, das sagt Alles.

    Ansonsten ist der Verweis auf die Privilegien sicher zu beachten.

  • Lua Skripte mit SciTE laden - HowTo

    • BugFix
    • 30. Mai 2021 um 11:06

    Da es beim Installieren von fremden Lua-Skripten immer dasselbe Vorgehen ist, habe ich hier alles einmal zusammengefasst.

    Wenn SciTE4AutoIt in der Standardeinstellung installiert wurde, haben wir folgende Pfade

    SciteDefaultHome C:\Program Files (x86)\AutoIt3\SciTE

    Lua Programmstart-Skript .\lua\SciTEStartup.lua

    SciteUserHome C:\Users\U_S_E_R\AppData\Local\AutoIt v3\SciTE


    Um Lua-Skripte von AddOns beim Start mit laden zu lassen, muss der Standort der SciTEStartup.lua verlegt werden, da sie am Standardort nicht verändert werden kann.

    Als Speicherort zu empfehlen ist dafür SciteUserHome (Pfad s.o.).

    Dazu

    1. SciTEStartup.lua kopieren nach SciteUserHome

    2. In den Benutzereinstellungen SciTEUser.properties als ersten Eintrag! einfügen:

    ext.lua.startup.script=$(SciteUserHome)/SciTEStartup.lua

    ***

    Erstellt diesen Eintrag vorerst mit einem Kommentarzeichen am Anfang (#), damit die folgenden Aktionen ohne Probleme in SciTE ausgeführt werden können.

    Wenn alles andere erledigt ist, das Kommentarzeichen entfernen, speichern und SciTE neu starten.

    3. Für eigene/fremde Lua-Skripte sollte ein eigener Ordner angelegt werden. Der Speicherort dieses Ordners wird über folgende Property in der SciTEUser.properties definiert

    #~ Speicherort der Lua-Skriptdateien !! ohne abschließenden Backslash !! - PFAD anpassen

    Lua.User.Scripts.Path=C:\Code\Lua

    Änderungen im Lua Startup-Skript

    Wenn alle Lua-Skripte in einem Ordner landen kann das unübersichtlich werden und auch zu Namenskollisionen führen, wenn die Skripte eigene Includes mitbringen. Deshalb muss eingestellt werden, dass Skripte sich in Ordner mit dem selben Namen des Skriptes befinden können.

    Dazu wird die LUA_USER_PATH Variable angepasst. Die Anpassung enthält auch die Möglichkeit zum Laden von Dll-Dateien (auch wenn das z.Zt. mit den aktuellen SciTE Versionen nicht möglich ist).

    Im Original gibt es den Eintrag:

    -- A table listing all loaded files.

    LoadLuaFileList = { }

    Oberhalb diese Eintrags einfügen:

    local sUserLua = props["Lua.User.Scripts.Path"]

    LUA_USER_PATH = sUserLua .. "\\?.dll;" .. sUserLua .. "\\?\\?.dll;"

    package.cpath = LUA_USER_PATH .. package.cpath

    LUA_USER_LUA = sUserLua .. "\\?.lua;" .. sUserLua .. "\\?\\?.lua;"

    package.path = LUA_USER_LUA .. package.path

    Der letzte Eintrag in der Datei ist:

    -- Start up the events (Calls OnStartup()).

    EventClass:BeginEvents()

    Darunter fügen wir ein:

    --------------------------------------------------------------------------------

    -- Calls LoadLuaFile() with directory from Lua-User-Script property

    --------------------------------------------------------------------------------

    function LoadUserLuaFile(file)

    LoadLuaFile(file, props["Lua.User.Scripts.Path"] .. "\\")

    end -- LoadUserLuaFile()

    --------------------------------------------------------------------------------

    -- (Bsp.) Mit diesem Aufruf wird die Datei "Irgendeine_Lua_AddOn_Datei.lua" aus dem Speicherort

    -- der eigenen Lua-Skriptdateien beim Start geladen.

    LoadUserLuaFile("Irgendeine_Lua_AddOn_Datei.lua")

    Wenn wir jetzt also ein AddOn installieren wollen, das "mit dem Lua Programmstart-Skript geladen" werden muss, gehen wir so vor:

    1. Kopieren der AddOn Datei (oder Ordner) in den "Lua.User.Scripts.Path"

    2. Hinzufügen des Startaufrufs am Ende der "SciTEStartup.lua" mit

    LoadUserLuaFile("DATEINAME.lua")

    Nach einem Neustart steht das neue Tool zur Verfügung.

  • Fehler in der deutschen Hilfe bitte hier melden (Hilfedatei 3.3.14.5 2021.04.04)

    • BugFix
    • 29. Mai 2021 um 15:55
    Zitat von Tweaky

    BugFix

    Also soll ich deinen Text bei den Bemerkungen ergänzen, richtig?

    Das halte ich für sinnvoll. ;)

  • Console-Debug: farbig mit Sprungmarke und Bedingung

    • BugFix
    • 29. Mai 2021 um 12:27

    Neue Version:

    - Ansprung von Zeile UND Spalte möglich

    - Markieren der Zeile durch Marker am Editorrand

  • ConsoleWrite() rot färben und trotzdem per Zeilennummer ins Programm springen

    • BugFix
    • 28. Mai 2021 um 23:31
    Zitat von HansJ54

    Das wäre super. Vielleicht noch alternativ $iErr=0 <=> $bErr=False und $iErr<>0 <=> $bErr=True

    Guckst du: Console-Debug: farbig mit Sprungmarke und Bedingung

  • Console-Debug: farbig mit Sprungmarke und Bedingung

    • BugFix
    • 28. Mai 2021 um 23:29

    Der SciTE Lexer bietet für die Konsole 4 Styles, die über das erste Zeichen in einer Zeile aktiviert werden. Standardmäßig sind das die Farben blau (>), rot (!), grün (+), orange (-).

    2 Styles gibt es extra mit der Möglichkeit durch Doppelklick auf die Ausgabe, die enthaltene Zeilennummer im Editor anzuspringen.

    Ich habe hier die Möglichkeit geschaffen, eigene Debugzeilen mit verschiedenen Farben zu erstellen. Auch die Möglichkeit der unterschiedlichen Färbung in Abhängigkeit von einer Bedingung besteht.

    EDIT: Zeile UND Spalte können angegeben werden

    Es kann also jeder eigene Debugzeilen zum Anspringen erstellen. Das Muster dafür:

    erstes Zeichen: ! oder + oder - oder >

    gefolgt von: @@

    folgend beliebige Zeichen ausser: (

    gefolgt von Sprunganweisung: (Zeilennummer) oder (Zeilennummer,Spaltennummer) - Zahlen 1-basiert.

    danach kann weiterer beliebiger Text folgen.

    Es wird außerdem am Editorrand ein temporärer Marker für die entsprechende Zeile gesetzt. (verschwindet wieder bei nächstem Syntaxcheck oder Skriptaufruf)

    Der AutoIt-Teil

    AutoIt: ConsoleDebug.au3
    #cs Example:
    
    Local $a =4, $b = 5, $column = 14
    _ConsoleDebugCondition('Bedingung-False', $a=$b, @ScriptLineNumber, $column)
    
    _ConsoleDebugCondition('Bedingung-True', $a<>$b, @ScriptLineNumber)
    
    _ConsoleDebugColor('Text grün', @ScriptLineNumber, $column, 11)
    
    _ConsoleDebugColor('Text orange', @ScriptLineNumber, $column, 12)
    
    _ConsoleDebugColor('Text rot o. Spalte', @ScriptLineNumber, 0, 10)
    
    ; Output:
    !@@ Debug(753,14) : Bedingung-False
    >@@ Debug(755) : Bedingung-True
    +@@ Debug(757,14) : Text grün
    -@@ Debug(759,14) : Text orange
    !@@ Debug(761) : Text rot o. Spalte
    #ce
    
    
    
    
    #cs
    $iStyleErr    Standard
        4  (>)     blau
       10  (!)     rot
       11  (+)     grün
       12  (- <)   orange
    #ce
    Func _ConsoleDebugColor($sText, $iLine, $iCol=0, $iStyleErr=10)
        Local $sStyle
        Switch $iStyleErr
            Case 4
                $sStyle = '>'
            Case 10
                $sStyle = '!'
            Case 11
                $sStyle = '+'
            Case 12
                $sStyle = '-'
        EndSwitch
        ConsoleWrite(StringFormat('%s@@ Debug(%d%s) : %s', $sStyle, $iLine, ($iCol > 0 ? ',' & $iCol : ''), $sText) & @CRLF)
    EndFunc
    
    Func _ConsoleDebugCondition($sText, $bCondition, $iLine, $iCol=0, $iStyleTrue=4, $iStyleFalse=10)
        _ConsoleDebugColor($sText, $iLine, $iCol, ($bCondition ? $iStyleTrue : $iStyleFalse))
    EndFunc
    Alles anzeigen


    Damit die Sprungmarke erkannt wird, muss das Lua-Skript installiert werden

    Code: JumpOutput.lua
    -- coding:utf-8
    
    OutputSciTE = EventClass:new(Common)
    
    MARKER_JUMP = 0
    editor:MarkerDefine(MARKER_JUMP, SC_MARK_SHORTARROW)
    
    OutputSciTE.OnDoubleClick = function(self)
        if editor.Focus then return end   -- Fokus muss auf output sein
        local pos = output.CurrentPos
        local line = output:LineFromPosition(pos)
        local text = output:GetLine(line) -- Text der angeklickten Zeile
        -- Parsen nach Sprungmarke
        local jumpmark = '@@'
        local pattLC = '^[%+%-<>!]'..jumpmark..'[^(]+%((%d+),(%d+)%)'
        local pattL = '^[%+%-<>!]'..jumpmark..'[^(]+%((%d+)%)'
        local l, c = text:match(pattLC)
        if not l then l = text:match(pattL) end
        if l ~= nil then self:JumpLineCol(l, c) end
    end
    
    OutputSciTE.JumpLineCol = function(self, line, col)
        local home = editor:PositionFromLine(line-1)
        local pos = home
        if col ~= nil then pos = home + col -1 end
        editor:GotoPos(pos)
        editor:GrabFocus()
        editor:MarkerAdd(line-1, MARKER_JUMP)
    end
    Alles anzeigen

    Dazu muss das Skript in der SciTEStartup.lua geladen werden.

    Wie das geht, könnt ihr in dieser Anleitung nachlesen.

    Dateien

    JumpOutput.lua 911 Byte – 332 Downloads ConsoleDebug.au3 1,24 kB – 317 Downloads

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™