﻿;-- 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
