Hallo zusammen
Ich bin gerade dabei ein GUI zu erstellen mit dem ich relativ einfach eigene und auch vordefinierte Befehle mit Hilfe von PsExec absetzen kann. Für diejenigen, die nich wissen was PsExec ist, hier eine Beschreibung. Kurz zusammen gefasst, ermöglicht PsExec es auf einem Remote-System einen Befehl abzusetzen.
Ich bin nun soweit dass ich über das GUI einen Befehl absetzen kann. Das Problem welches ich hier allerdings noch habe, ist dass ich den Output nicht auslesen kann, welcher generiert wird. Ich denke das Problem liegt darin, dass PsExec eine Zeile schreibt, diese dann aber dann wieder löscht, und etwas neues hinein schreibt. Die Methode mit rausschreiben des Outputs in ein .txt File, möchte ich nicht, da gewisse Befehle eine lange Laufzeit haben, und ich gerne in "Echtzeit" sehen möchte was gerade läuft. Ich habe in den englischen AutoIt Foren über dieses Problem gelesen, bin aber nicht schlau geworden (ist mein erstes Mal mit diesen STDOUT usw).
Mein Code sieht soweit wie folgt aus:
Spoiler anzeigen
#include <GUIConstants.au3>
#include <EditConstants.au3>
#include <Process.au3>
#include <Constants.au3>
#Region ### START Koda GUI section ### Form=
$Form = GUICreate("Form", 537, 728, 193, 125)
$Host = GUICtrlCreateInput("Server01", 64, 16, 121, 21)
$User = GUICtrlCreateInput("domain\admin", 64, 40, 121, 21)
$Password = GUICtrlCreateInput("password", 64, 64, 121, 21, $ES_PASSWORD)
$GetUser = GUICtrlCreateInput("Administrator", 64, 88, 121, 21)
$GetUserTime = GUICtrlCreateButton("Loginzeit", 192, 16, 75, 25, 0)
$Run = GUICtrlCreateButton("Run", 192, 48, 75, 25, 0)
$Label1 = GUICtrlCreateLabel("Hostname", 8, 16, 52, 17)
$Label2 = GUICtrlCreateLabel("Benutzer", 8, 40, 46, 17)
$Label3 = GUICtrlCreateLabel("Passwort", 8, 64, 47, 17)
$Label4 = GUICtrlCreateLabel("Loginuser", 8, 88, 50, 17)
$Label5 = GUICtrlCreateLabel("Command", 8, 120, 51, 17)
$Label6 = GUICtrlCreateLabel("Ausgabe", 8, 368, 46, 17)
$Command = GUICtrlCreateEdit("", 8, 144, 521, 209, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_WANTRETURN))
$Output = GUICtrlCreateEdit("", 8, 392, 521, 321, BitOR($ES_AUTOVSCROLL,$ES_WANTRETURN,$ES_READONLY))
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Run
If GuiCtrlRead($Host) = "" Or GUICtrlRead($User) = "" Or GuiCtrlRead($Password) = "" Then
MsgBox(64, "Fehlende Angaben", "Bitte fülle alle benötigten Felder aus")
Else
$Command = 'C:\Windows\si\PsExec.exe \\' & GUICtrlRead($Host) & ' -u ' & GUICtrlRead($User) & ' -p ' & GUICtrlRead($Password) & ' ' & GUICtrlRead($Command)
$CommandHidden = 'C:\Windows\si\PsExec.exe \\' & GUICtrlRead($Host) & ' -u ' & GUICtrlRead($User) & ' -p ***** ' & GUICtrlRead($Command)
$_Run = @ComSpec & ' /c ' & $Command
GUICtrlSetData($Output, $_Run)
$_Pid = Run ( $_Run, '', @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
Dim $_StderrRead='', $_StdoutRead=''
While ProcessExists ( $_Pid )
Sleep(100)
$_StderrRead = StderrRead ( $_Pid )
If Not @error And $_StderrRead <> '' Then GUICtrlSetData($Output, GUICtrlRead($Output) & $_StderrRead & @Crlf )
$_StdoutRead = StdoutRead ( $_Pid )
If Not @error And $_StdoutRead <> '' Then GUICtrlSetData($Output, GUICtrlRead($Output) & $_StdoutRead & @Crlf )
Wend
EndIf
Case $GetUserTime
If GuiCtrlRead($Host) = "" Or GUICtrlRead($User) = "" Or GuiCtrlRead($Password) = "" Or GUICtrlRead($GetUser) = "" Then
MsgBox(64, "Fehlende Angaben", "Bitte fülle alle benötigten Felder aus")
Else
$Command = 'C:\Windows\si\PsExec.exe \\' & GUICtrlRead($Host) & ' -u ' & GUICtrlRead($User) & ' -p ' & GUICtrlRead($Password) & ' net user ' & GUICtrlRead($GetUser); & ' | findstr /B /C:"Letzte Anmeldung"'
$CommandHidden = 'C:\Windows\si\PsExec.exe \\' & GUICtrlRead($Host) & ' -u ' & GUICtrlRead($User) & ' -p ***** net user ' & GUICtrlRead($GetUser); & ' | findstr /B /C:"Letzte Anmeldung"'
$_Run = @ComSpec & ' /c ' & $Command
GUICtrlSetData($Output, $_Run)
$_Pid = Run ( $_Run, '', @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
Dim $_StderrRead='', $_StdoutRead=''
While ProcessExists ( $_Pid )
Sleep(100)
$_StderrRead = StderrRead ( $_Pid )
If Not @error And $_StderrRead <> '' Then GUICtrlSetData($Output, GUICtrlRead($Output) & $_StderrRead & @Crlf )
$_StdoutRead = StdoutRead ( $_Pid )
If Not @error And $_StdoutRead <> '' Then GUICtrlSetData($Output, GUICtrlRead($Output) & $_StdoutRead & @Crlf )
Wend
EndIf
EndSwitch
WEnd
Falls mir jemand hierbei behilflich sein könnte, wäre ich ihm dankbar. Auch sonstige Script-Verbesserungen sind gerne erhört.
Vielen Dank jetzt schonmal
Ahatius