Beiträge von veronesi
-
-
Hmm, schade.
Wie kriegt man denn die GUI auch zu sehen? -
Welche Rechte meinst Du?
Das Script wird bei mir unter einem speziellen Benutzeraccount ausgeführt. Dieser Account ist per GPP bei allen Computern als lokaler Administrator eingetragen.
Brauche ich sonst noch spezielle Rechte?Gruss Veronesi
-
Hallo zusammen
Für ein Projekt wäre es gut, wenn ich auf einem Remotecomputer ein Programm starten könnte.
Der Benutzer, welcher das Script ausführt, hat lokale Adminrechte auf dem Remotecomputer. (Alles Win7 x64)Natürlich könnte ich psexec verwenden. Doch es reizt mich schon, das alles in AutoIt zu lösen.
Nach einiger Zeit suchen, konnte ich folgendes Script zusammenstellen:Spoiler anzeigen
[autoit];http://msdn2.microsoft.com/en-us/library/aa389388(VS.85).aspx
[/autoit] [autoit][/autoit] [autoit]MsgBox(0, "", _RemoteStart('C:\Windows\System32\Notepad.exe', "localhost", 1))
[/autoit] [autoit][/autoit] [autoit]Func _RemoteStart($Program, $RemoteComputer, $ShowWindow = 1)
[/autoit] [autoit][/autoit] [autoit]
;ShowWindow = 1 => Show / 0 => Hide
Local $oWMIService, $oStartup, $oConfig, $oProcess
Local $iProcessID, $iReturn
$oWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate,authenticationLevel=pktPrivacy, (Debug)}!\\" & $RemoteComputer & "\root\cimv2")$oStartup = $oWMIService.Get("Win32_ProcessStartup")
[/autoit] [autoit][/autoit] [autoit]
$oConfig = $oStartup.SpawnInstance_
$oConfig.ShowWindow = $ShowWindow$oProcess = $oWMIService.Get("Win32_Process")
[/autoit] [autoit][/autoit] [autoit]
$iReturn = $oProcess.Create($Program, Default, $oConfig, $iProcessID)$oWMIService = 0
[/autoit] [autoit][/autoit] [autoit]
$oStartup = 0
$oConfig = 0
$oProcess = 0If $iReturn <> 0 Then
[/autoit]
Return False
Else
Return True
EndIf
EndFunc ;==>_RemoteStartAuf dem lokalen Computer läuft es
Doch wenn ich den String localhost auf den Remote-PC umstelle, bekomme ich zwar ein True zurück, doch es wird nichts ausgeführt.Kann mir jemand helfen?
Gruss, Veronesi -
Hallo chip!
Vielen Dank!
Auf diese Lösung hätte ich selber kommen müssen!Besten Dank!
Veronesi -
Hallo Zusammen
Irgendwie komme ich mit dem StringRegExp überhaupt nicht klar. Für Euch ist das sicher eine 10 Sekunden Übung!
[autoit]#include <Array.au3>
[/autoit][autoit][/autoit][autoit]
$String = 'Local $pLFile = xyz' & @CRLF & _
'Local $pSrc = xyz' & @CRLF & _
'Local $SHA1 = xyz'$Pattern = '(?i)(?s)(.*)Local $pSrc =(?-s)(.*)'
[/autoit]
$aTest = StringRegExp($String, $Pattern, 1)
MsgBox(0,"",$aTest & " / " & @error)
_ArrayDisplay($aTest)Ich möchte mit dem Pattern vom $String folgenden Teil zurückbekommen: Local $pSrc = xyz
Wobei diese Zeile nicht zwingend auf der ersten oder zweiten Zeile stehen muss. Zudem ist alles nach dem Gleichheitszeichen variabel!
Mit anderen Worten: Ich möchte den String haben, welcher mit Local $pSrc = beginnt und zwar soweit, bis das nächste @CRLF kommt.Vielen Dank für Eure Hilfe!
Veronesi -
So etwas?
Spoiler anzeigen
[autoit]#cs
[/autoit] [autoit][/autoit] [autoit]
UDF cfx.au3
serial functions using kernel32.dll
V1.0
Uwe Lahni 2008
V2.0
Andrew Calcutt 05/16/2009 - Started converting to UDF
V2.1
Mikko Keski-Heroja 02/23/2011 - UDF is now compatible with Opt("MustDeclareVars",1) and Date.au3. Global variable $dll is renamed to $commDll.
V2.2
Veronesi 04/26/2011 - Changed some cosmetics and documentation / Add Function to set RTS and to get DCD Status
#ce
#include-once
Global $commDll
Global $hSerialPort
Global $dcb_Struct
Global $commtimeout
Global $commtimeout_Struct
Global $commState;====================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name: _OpenCOMPort($CommPort, $CommBaud, $CommBits, $CommParity, $CommStop, $SetRTS)
; Description: Opens serial port
; Parameters: $CommPort
; $CommBits - 4-8
; $CommParity - 0=none, 1=odd, 2=even, 3=mark, 4=space
; $CommStop - 0 => 1 Stop bit / 1 => 1.5 Stop bits / 2 => 2 Stop bits
; $SetRTS - 0 = RTS => 0 / 1 = RTS => 1 / 2 = RTS handshake / 3 = RTS toggle
; Returns: on success, returns serial port id?
; on failure returns -1 and sets @error to 1
; Note:
;====================================================================================
Func _OpenCOMPort($CommPort, $CommBaud = '9600', $CommBits = '8', $CommParity = '0', $CommStop = '0', $SetRTS = 0)
#cs
CommCtrl => fBitfields => http://msdn.microsoft.com/en-us/library/…4(v=vs.85).aspx
http://www.hpcc.ecs.soton.ac.uk/software/Win32API.Txt
' The fourteen actual DCB bit-sized data fields within the four bytes of fBitFields can be manipulated by bitwise logical And/Or operations.
' FieldName Bit # Description
' ----------------- ----- ------------------------------
' fBinary 1 binary mode, no EOF check
' fParity 2 enable parity checking
' fOutxCtsFlow 3 CTS output flow control
' fOutxDsrFlow 4 DSR output flow control
' fDtrControl 5 DTR flow control type (2 bits)
' fDsrSensitivity 7 DSR sensitivity
' fTXContinueOnXoff 8 XOFF continues Tx
' fOutX 9 XON/XOFF out flow control
' fInX 10 XON/XOFF in flow control
' fErrorChar 11 enable error replacement
' fNull 12 enable null stripping
' fRtsControl 13 RTS flow control (2 bits)
' fAbortOnError 15 abort reads/writes on error
' fDummy2 16 reserved
#ceLocal Const $RTS_CONTROL_DISABLE = 0x0000
[/autoit] [autoit][/autoit] [autoit]
Local Const $RTS_CONTROL_ENABLE = 0x1000
Local Const $RTS_CONTROL_HANDSHAKE = 0x2000
Local Const $RTS_CONTROL_TOGGLE = 0x3000
Local $CommCtrl
$commDll = DllOpen("kernel32.dll")
Local $dcbs = "long DCBlength;long BaudRate; long fBitFields;short wReserved;" & _
"short XonLim;short XoffLim;byte Bytesize;byte parity;byte StopBits;byte XonChar; byte XoffChar;" & _
"Byte ErrorChar;Byte EofChar;Byte EvtChar;short wReserved1"Local $commtimeouts = "long ReadIntervalTimeout;long ReadTotalTimeoutMultiplier;" & _
[/autoit] [autoit][/autoit] [autoit]
"long ReadTotalTimeoutConstant;long WriteTotalTimeoutMultiplier;long WriteTotalTimeoutConstant"Local Const $GENERIC_READ_WRITE = 0xC0000000
[/autoit] [autoit][/autoit] [autoit]
Local Const $OPEN_EXISTING = 3
Local Const $FILE_ATTRIBUTE_NORMAL = 0x80$dcb_Struct = DllStructCreate($dcbs)
[/autoit] [autoit][/autoit] [autoit]
If @error Then Return SetError(1, 1, -1)$commtimeout_Struct = DllStructCreate($commtimeouts)
[/autoit] [autoit][/autoit] [autoit]
If @error Then Return SetError(1, 1, -1)$hSerialPort = DllCall($commDll, "hwnd", "CreateFile", "str", "COM" & $CommPort, _
[/autoit] [autoit][/autoit] [autoit]
"int", $GENERIC_READ_WRITE, _
"int", 0, _
"ptr", 0, _
"int", $OPEN_EXISTING, _
"int", $FILE_ATTRIBUTE_NORMAL, _
"int", 0)
If @error Then Return SetError(1, 1, -1)
If Number($hSerialPort[0]) < 1 Then Return SetError(1, 1, -1)
$commState = DllCall($commDll, "long", "GetCommState", "hwnd", $hSerialPort[0], "ptr", DllStructGetPtr($dcb_Struct))$CommCtrl = BitAND($CommCtrl, 0xFFFCFFF) ; RTS-Bits löschen
[/autoit] [autoit][/autoit] [autoit]
Switch $SetRTS
Case 0
Case 1
$CommCtrl = BitOR($CommCtrl, $RTS_CONTROL_ENABLE)
Case 2
$CommCtrl = BitOR($CommCtrl, $RTS_CONTROL_HANDSHAKE)
Case 3
$CommCtrl = BitOR($CommCtrl, $RTS_CONTROL_TOGGLE)
Case Else
Return SetError(1, 1, -1)
EndSwitchIf @error Then Return SetError(1, 1, -1)
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($dcb_Struct, "DCBLength", DllStructGetSize($dcb_Struct))
If @error Then Return SetError(1, 1, -1)
DllStructSetData($dcb_Struct, "BaudRate", $CommBaud)
If @error Then Return SetError(1, 1, -1)
DllStructSetData($dcb_Struct, "Bytesize", $CommBits)
If @error Then Return SetError(1, 1, -1)
DllStructSetData($dcb_Struct, "fBitfields", Number($CommCtrl))
If @error Then Return SetError(1, 1, -1)
DllStructSetData($dcb_Struct, "Parity", $CommParity)
If @error Then Return SetError(1, 1, -1)
DllStructSetData($dcb_Struct, "StopBits", '0x' & $CommStop)
If @error Then Return SetError(1, 1, -1)
DllStructSetData($dcb_Struct, "XonLim", 2048)
If @error Then Return SetError(1, 1, -1)
DllStructSetData($dcb_Struct, "XoffLim", 512)
If @error Then Return SetError(1, 1, -1)
$commState = DllCall($commDll, "short", "SetCommState", "hwnd", $hSerialPort[0], "ptr", DllStructGetPtr($dcb_Struct))
If @error Then Return SetError(1, 1, -1)If $commState[0] = 0 Then Return SetError(1, 1, -1)
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($commtimeout_Struct, "ReadIntervalTimeout", -1)
$commtimeout = DllCall($commDll, "long", "SetCommTimeouts", "hwnd", $hSerialPort[0], "ptr", DllStructGetPtr($commtimeout_Struct))
If @error Then Return SetError(1, 1, -1)
Return Number($hSerialPort[0])
EndFunc ;==>_OpenCOMPort;====================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name: _CloseCOMPort($CommSerialPort)
; Description: Closes serial port
; Parameters: $CommSerialPort - value returned by _OpenComm
; Returns: on success, returns 1
; on failure returns -1 and sets @error to 1
; Note:
;====================================================================================
Func _CloseCOMPort($CommSerialPort)
Local $closeerr = DllCall($commDll, "int", "CloseHandle", "hwnd", $CommSerialPort)
DllClose($commDll)
If @error Then Return SetError(1, 1, -1)
Return ($closeerr[0])
EndFunc ;==>_CloseCOMPort;====================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name: _SendSerialString($CommSerialPort, $sSensString)
; Description: Send a String
; Parameters: $CommSerialPort - value returned by _OpenComm
; $sSendString - String to send
; Returns: on success, returns 1
; on failure returns -1 and sets @error to 1
; Note:
;====================================================================================
Func _SendSerialString($CommSerialPort, $sSendString)
Local $lptr0 = DllStructCreate("long_ptr")
DllCall($commDll, "int", "WriteFile", "hwnd", $CommSerialPort, _
"str", $sSendString, _
"int", StringLen($sSendString), _
"long_ptr", DllStructGetPtr($lptr0), _
"ptr", 0)
If @error Then Return SetError(1, 1, -1)
EndFunc ;==>_SendSerialString;====================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name: _ReceiveStringWait($CommSerialPort, $MinBufferSize, $MaxWaitTime)
; Description: Recieves data
; Parameters: $CommSerialPort - value returned by _OpenComm
; $MinBufferSize - Buffer size to wait for
; $MaxWaitTime - Maximum time to wait before failing
; Returns: on success, returns String
; on failure returns -1 and sets @error to 1
; Note:
;====================================================================================
Func _ReceiveStringWait($CommSerialPort, $MinBufferSize, $MaxWaitTime)
Local $rxbuf
Local $jetza = TimerInit()
Local $lptr0 = DllStructCreate("long_ptr")Local $rxr, $rxl, $to
[/autoit] [autoit][/autoit] [autoit]
Do
$rxr = DllCall($commDll, "int", "ReadFile", "hwnd", $CommSerialPort, _
"str", " ", _
"int", 1, _
"long_ptr", DllStructGetPtr($lptr0), _
"ptr", 0)
If @error Then Return SetError(1, 1, -1)
$rxl = DllStructGetData($lptr0, 1)
If $rxl >= 1 Then
$rxbuf &= $rxr[2]
EndIf
$to = TimerDiff($jetza)
Until StringLen($rxbuf) >= $MinBufferSize Or $to > $MaxWaitTime
Return ($rxbuf)
EndFunc ;==>_ReceiveStringWait;====================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name: _SetCOMRTS($commPort, $RTS)
; Description: Sets RTS flow control
; Parameters: $CommPort - value returned by _OpenComm
; $RTS : 0 = disable, 1 = enable
; Returns: on success, returns 1
; on failure returns -1 and sets @error to 1
; Note:
;====================================================================================
Func _SetCOMRTS($CommPort, $SetRTS)
;http://msdn.microsoft.com/en-us/library/…4(v=vs.85).aspx
Local $EscapeComm, $RTS
If Number($CommPort) < 1 Then Return SetError(1, 1, -1)
Switch $SetRTS
Case 0
$RTS = 4
Case 1
$RTS = 3
Case Else
Return SetError(1, 1, -1)
EndSwitch
$EscapeComm = DllCall($CommDll, "BOOL", "EscapeCommFunction", "HWND", $CommPort, "DWORD", $RTS)
If @error Or ($EscapeComm[0] = 0) Then Return SetError(1, 1, -1)
Return True
EndFunc ;==>_SetCOMRTS;====================================================================================
[/autoit]
; Function Name: _GetCOMDCD($commPort)
; Description: Gets DCD status (Set from RTS in 0-Modem Cable)
; Parameters: $CommPort - value returned by _OpenComm
; Returns: on success, returns value
; on failure returns -1 and sets @error to 1
; Note:
;====================================================================================
Func _GetCOMDCD($CommPort)
; http://msdn.microsoft.com/en-us/library/…8(v=vs.85).aspx
Local $CommCtrl, $lpModemStat
If Number($CommPort) < 1 Then Return SetError(1, 1, -1)
$lpModemStat = DllStructCreate("DWORD")
$CommState = DllCall($CommDll, "BOOL", "GetCommModemStatus", "HWND", $CommPort, "Ptr", DllStructGetPtr($lpModemStat))
If @error Or ($CommState[0] = 0) Then Return SetError(1, 1, -1)
$CommCtrl = DllStructGetData($lpModemStat, 1)
If BitAND($CommCtrl, 0x80) Then Return 1 ; Isolate DCD (RLSD)
Return 0
EndFunc ;==>_GetCOMDCD -
Schön, dass wir den Fehler eingrenzen und finden konnten.
Gerne geschehen! -
Ach ja, noch einen Fehler gefunden:
Bei _ReceiveStringWait muss als $ComSerialPort der Rückgabewert von _OpenCOMPort eingetragen werden. Nicht der COM-Port selber! -
Woher hast Du denn die _GetComPorts?
Funktioniert die?Was für einen @Error - Wert gibt die Funktion _ReceiveStringWait zurück?
Stimmt die $MinBufferSize? -
Nach dem _SendSerialString hast Du ein Sleep.
Was passiert, wenn Du das entfernst?Denn mit dem _ReceiveStringWait wartest Du ja sowieso, bis die Antwort kommt. (Das Timeout muss natürlich genug lange inkl. Reserve sein!)
-
Hallo nochmals!
Aber Du weisst schon, dass Du mit Deiner MsgBox
[autoit]
[/autoit]
MsgBox(0, string(_ReceiveStringWait($ComPort, $MinBufferSize, $MaxWaitTime)), 100, 100)
Den Empfangenen String in die Titelzeile der Messagebox schreibst?
In den eigentlichen Textkörper schreibst Du 100 rein!
Und das Timeout ist ebenfalls 100.Ist das wirklich so gewollt?
-
Vor _ReceiveStringWait wartest Du jeweils 500ms.
Bist Du sicher, dass Du den Buffer auf der seriellen Schnittstelle aktiviert hast? (Standardmässig ist er aktiviert)Sonst wird die Antwort nicht zwischengespeichert, die über die serielle Schnittstelle reinkommt.
Reicht die Wartezeit von 800ms? -
Hast Du schon mal das folgende probiert?
Das sollte funktionieren, wenn die Dos-Box schon offen ist! Also genau das, was Du im ersten Post gewünscht hast.Wenn es mehrere DOS-Fenster gibt, dann müsste man sich etwas zur Identifizierung überlegen.
[autoit];[user='204854']veronesi[/user]
[/autoit][autoit][/autoit][autoit]
Global $OldOption = Opt("WinTitleMatchMode", 2)
Global $TimerWinActivate = TimerInit()
While 1
If WinActivate("[TITLE:\cmd.exe; CLASS:ConsoleWindowClass]", "") <> 0 Then ExitLoop
If TimerDiff($TimerWinActivate) > 20000 Then ExitLoop ;Emergency Exit
Sleep(250)
WEndControlSend("[TITLE:\cmd.exe; CLASS:ConsoleWindowClass]", "", "", "stop" & @CRLF)
[/autoit]
Opt("WinTitleMatchMode", $OldOption)Gruss Veronesi
-
Der Link, den ich gepostet habe, stellt - gemäss Beschreibung - auch ein Fenster VOR der Anmeldung dar!
Einfach kann man nur den Text wählen und keine grafischen Veränderungen durchführen..... -
Vielleicht bringt Dir auch das etwas Link
-
Leider ist mir keine Möglichkeit bekannt, vor einer Anmeldung ein Fenster oder irgendwas darzustellen.
Ich denke, dass dies nicht gehen wird!Weshalb möchtest Du VOR dem Login etwas anzeigen?
Wichtig ist doch, dass das Script läuft und ggfs nach dem Login etwas angezeigt werden kann! -
-
Ok Den Geschwindigkeitsunterschied muss man aber auch etwas differenzierter anschauen.
Im Beispiel wird einfach in einer Schleife das Objekt befüllt.
In Wirklichkeit muss vor jedem Eintrag jedesmal vorher einige Daten vom Netzlaufwerk abgefragt werden. D.h. unter Umständen macht der Geschwindigkeits Nachteil von AutoIt nicht mehr so viel aus... Mal testen! -
Gut beherrschen ist so eine Sache

Aber die Syntax von Phyton scheint mir kompliziert.
Soll ich da nicht gleich auf Delphi gehen?Wie wäre echt die Geschwindigkeit in Delphi und gibt es hier gratis Compiler?
Danke!