Ich rate jetz mal und sage der 2te Bildschirm befindet sich links neben deinem Hauptbildschirm, oder?
Jeep!
Ich rate jetz mal und sage der 2te Bildschirm befindet sich links neben deinem Hauptbildschirm, oder?
Jeep!
Ich arbeite mit zwei Monitoren und habe ISN Autoit Studio (ISN) nun so eingerichtet, dass es sich die Fensterposition merkt und ISN auf Monitor 2 verschoben. Allerdings werden dann alle von ISN geöffneten Fenster (z.B. die Projektverwaltung) an einer ungünstigen Position angezeigt, denn der rechte Teil der Fenster befindet sich dabei auf Monitor 1!
Die Fenster lassen sich zudem zwar beliebig weit nach rechts (auf Monitor 1) verschieben, aber nicht weiter nach links, als auf den Bildern zu sehen ist!
Auch ist es 1x passiert, dass die geöffnete Projektverwaltung nach dem Verschieben des ISN-Fenster plötzlich nicht mehr sichtbar und auch über das Menü nicht mehr aufrufbar war.
ISN_Autoit_Studio_WindowPos_02.png ISN_Autoit_Studio_WindowPos.png
Schau mal hier... evtl. hilft dir das weiter...
Ich war mal so frei und habe es eingebaut... diese Funktion (_GDIPlus_ImageGetPropertyItem) ist nun übrigens in AutoIt v3.3.14.3 enthalten und kann (je nach Kamera) noch mehr Properties auslesen.
Wie löse ich das Problem?
Um auf den Ziel-Rechnern die Registry lesen/schreiben zu können, muss dort der Dienst "Remoteregistrierung" ausgeführt werden.
Lösung 1: Dienste mit services.msc (auf den Ziel-Rechnern) konfigurieren
Windows + R drücken, services.msc eingeben, mit Enter abschicken.
Permanent: Den Starttyp für den Dienst Remoteregistrierung auf Automatisch umstellen und den Dienst starten.
Temporär: Den Dienst Remoteregistrierung starten.
Lösung 2: Dienste mit sc.exe (auf den Ziel-Rechnern) konfigurieren
Windows + R drücken, cmd.exe eingeben, mit Enter abschicken.
Permanent: sc.exe config RemoteRegistry start=auto & sc.exe start RemoteRegistry
Temporär: sc.exe start RemoteRegistry
Lösung 3: Dienste mit psexec.exe (auf dem PC, auf dem das Script ausgeführt wird) konfigurieren
; ComputerName, UserName und Passwort mit den realen Daten ersetzen!
Permanent: psexec \\ComputerName -u UserName -p Passwort -h sc.exe config RemoteRegistry start=auto & psexec \\ComputerName -u UserName -p Passwort -h sc.exe start RemoteRegistry
Temporär: psexec \\ComputerName -u UserName -p Passwort -h sc.exe start RemoteRegistry
Download psexec: https://technet.microsoft.com/de-de/sysinternals/bb897553.aspx
Lösung 3 habe ich dir noch in das Script eingebaut...
;-- TIME_STAMP 2018-03-07 19:48:11 v 0.1
#RequireAdmin
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Change2CUI=y
#AutoIt3Wrapper_Res_requestedExecutionLevel=requireAdministrator
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#Region ;************ Includes ************
#include-once
#include <File.au3>
;~ #include <Array.au3>
;~ #include <AutoItConstants.au3>
;~ #include <MsgBoxConstants.au3>
#EndRegion ;************ Includes ************
; WMI-Dienst gestartet?
; sc query winmgmt
; Windows Firewall WMI eingehend
; abfragen: netsh advfirewall firewall show rule name="Windows-Verwaltungsinstrumentation (WMI eingehend)"
; erlauben: netsh advfirewall firewall set rule group="Windows-Verwaltungsinstrumentation (WMI)" new enable=yes
; ESET Security musste ich temporär auf "Interaktiv" umstellen, um die neuen Regeln ohne einen Neustart zu übernehmen.
Global $g_sLogFile = @ScriptDir & "\CheckBootUp.txt"
If Not IsAdmin() Then Exit MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL, $MB_TOPMOST), @ScriptName, "Das Skript muss mit Adminrechten gestartet werden!")
; Globales Hotkey zum Beenden des Scripts: "ESC-Taste"
If Not HotKeySet("{ESC}", _Exit) Then Exit MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL, $MB_TOPMOST), @ScriptName, "Globales HotKey 'ESC' konnte nicht gesetzt werden!")
_CheckBootUp()
Func _CheckBootUp()
Local $hFile, $sComputerName, $sUserName, $sPassword, $aRechner = FileReadToArray(@ScriptDir & "\RechnerListe.txt")
If Not UBound($aRechner) Then Exit MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL, $MB_TOPMOST), @ScriptName, "RechnerListe.txt nicht gefunden oder leer!")
$hFile = FileOpen($g_sLogFile, BitOR($FO_ANSI, $FO_APPEND)) ; ANSI reicht völlig aus, wenn keine Sonderzeichen enthalten sind.
For $i = 0 To UBound($aRechner) - 1 Step 1
Ping($aRechner[$i], 300)
If @error Then
; ____________________StringFormat('11111 : 22222 : 33333 : 44', 1111111111111, 22, 33, 444444444)
_FileWriteLog($hFile, StringFormat('%-26s : %-26s : %-26s : %s', $aRechner[$i], '', '', 'offline'))
Else
$sUserName = _GetUserName($aRechner[$i])
$sComputerName = $aRechner[$i]
$sPassword = '' ; Evtl. nächste Woche kann ich dir zeigen, wie man die Passwörter verschlüsselt speichern kann... doch jetzt habe ich keine Zeit dafür. ;-)
; ____________________StringFormat('11111 : 22222 : 33333 : 44', 1111111111111, 22222222222, 333333333333333333333333333333333333333333333333333, 444444444444444444444444444444)
_FileWriteLog($hFile, StringFormat('%-26s : %-26s : %-26s : %s', $sComputerName, $sUserName, _GetRegData($sComputerName, $sUserName, $sPassword), _GetLastBootUp($sComputerName)))
EndIf
Next
FileClose($hFile)
MsgBox(BitOR($MB_ICONINFORMATION, $MB_SYSTEMMODAL, $MB_TOPMOST), @ScriptName, "Fertig")
EndFunc ;==>_CheckBootUp
Func _GetLastBootUp($sComputer = '.') ; "." steht für lokalen Rechner
Local $oWMIService = ObjGet("winmgmts:\\" & $sComputer & "\root\cimv2")
If Not IsObj($oWMIService) Then Return ''
Local $oColOperatingSystems = $oWMIService.ExecQuery("Select LastBootUpTime from Win32_OperatingSystem")
Local $sBootup
For $oOS In $oColOperatingSystems
$sBootup = $oOS.LastBootUpTime ; --> 20180210112637.125599+060
Next
Return $sBootup = '' ? 'WMI-Dienst nicht gestartet oder keine Regeln für Windows Firewall WMI eingehend definiert!' : StringRegExpReplace($sBootup, '(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2}).+', '\1-\2-\3 \4:\5:\6')
EndFunc ;==>_GetLastBootUp
Func _GetUserName($strClient = @ComputerName, $strDomain = '')
Local $objWMIService, $objItem, $colItems, $strUser, $Result
$objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & $strClient)
If Not IsObj($objWMIService) Then Return ''
$colItems = $objWMIService.InstancesOf("Win32_Process")
If IsObj($colItems) Then
For $objItem In $colItems
If ($objItem.Caption = "explorer.exe") Then
$Result = $objItem.GetOwner($strUser, $strDomain)
If (Not @error) And ($Result = 0) Then Return $strUser
EndIf
Next
EndIf
EndFunc ;==>_GetUserName
Func _GetRegData($sComputerName, $sUserName, $sPasswort = '', $bActivateAutoStart = True)
Local $sUserID, $iError
$sPasswort = '' ? _GetPassword($sComputerName, $sUserName) : $sPasswort
For $i = 1 To 2 Step 1
$sUserID = RegRead("\\" & $sComputerName & "\HKCU\SOFTWARE\pSAG\proalpha-client-production\5.1\proALPHA Session", "UserID")
If $sUserID Then Return $sUserID
If RegRead('\\' & $sComputerName & "\HKCR\.txt", "") Then Return 'pSAG nicht installiert!'
If $i = 2 Then Return SetError(1, 0, 'RemoteRegistry konnte nicht gestartet werden!')
; Download psexec: https://technet.microsoft.com/de-de/sysinternals/bb897553.aspx
$iError = RunWait(StringFormat('psexec \\\%s -u %s -p %s -h sc.exe start RemoteRegistry', $sComputerName, $sUserName, $sPasswort))
If $iError Then Return SetError($iError, 0, 'psexec (start) Error = ' & $iError & '!')
If Not $bActivateAutoStart Then ContinueLoop
$iError = RunWait(StringFormat('psexec \\\%s -u %s -p %s -h sc.exe config RemoteRegistry start=auto', $sComputerName, $sUserName, $sPasswort))
If $iError Then Return SetError($iError, 0, 'psexec (config) Error = ' & $iError & '!')
Next
EndFunc ;==>_GetRegData
Func _GetPassword($sComputerName, $sUserName)
Return InputBox(@ScriptName, StringFormat('ComputerName: %s\r\rUserName: %s\r\r\rPasswort eingeben: ', $sComputerName, $sUserName), '*')
EndFunc
Func _Exit()
Exit
EndFunc ;==>_Exit
Alles anzeigen
Kann nicht ganz nachvollziehen, wie der Aufbau von _FileWriteLog ist und wo genau die Ausgabe in die Datei erfolgt.
Vielleicht kannst du dazu ja noch etwas loswerden?
_FileWriteLog schreibt das aktuelle Datum, die Uhrzeit und den angegebenen Text in eine Protokolldatei. Mit StringFormat formatieren wir den angegebenen Text.
; _FileWriteLog ( $sLogPath, $sLogMsg [, $iFlag = -1] )
; ____________________StringFormat('11111 : 22222 : 33333 : 44', 1111111111111, 222222222222222222222222222, 3333333333333, 44444444444444444444444444444)
_FileWriteLog($hFile, StringFormat('%-26s : %-26s : %-26s : %s', $aRechner[$i], _GetUserName($aRechner[$i]), _GetRegData(), _GetLastBootUp($aRechner[$i])))
#cs
%s Korrespondierende Variable als String interpretieren.
%-26s Wie %s, durch das "-" wird der String aber linksbündig ausgegeben und mit Leerzeichen auf "26" Zeichen aufgefüllt, falls er kürzer ist.
Datum, Uhrzeit : $aRechner[$i] : _GetUserName($aRechner[$i]): _GetRegData() : _GetLastBootUp($aRechner[$i])
: %-26s : %-26s : %-26s : %s
2018-03-02 21:50:05 : SERVER : Bitnugger : Bitnugger : 2018-03-02 20:20:14
#ce
Alles anzeigen
Hier die Version mit _GetRegData()
;-- TIME_STAMP 2018-03-06 20:30:36 v 0.1
#RequireAdmin
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Change2CUI=y
#AutoIt3Wrapper_Res_requestedExecutionLevel=requireAdministrator
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#Region ;************ Includes ************
#include-once
#include <File.au3>
;~ #include <Array.au3>
;~ #include <AutoItConstants.au3>
;~ #include <MsgBoxConstants.au3>
#EndRegion ;************ Includes ************
; WMI-Dienst gestartet?
; sc query winmgmt
; Windows Firewall WMI eingehend
; abfragen: netsh advfirewall firewall show rule name="Windows-Verwaltungsinstrumentation (WMI eingehend)"
; erlauben: netsh advfirewall firewall set rule group="Windows-Verwaltungsinstrumentation (WMI)" new enable=yes
; ESET Security musste ich temporär auf "Interaktiv" umstellen, um die neuen Regeln ohne einen Neustart zu übernehmen.
Global $g_sLogFile = @ScriptDir & "\CheckBootUp.txt"
If Not IsAdmin() Then Exit MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL, $MB_TOPMOST), @ScriptName, "Das Skript muss mit Adminrechten gestartet werden!")
; Globales Hotkey zum Beenden des Scripts: "ESC-Taste"
If Not HotKeySet("{ESC}", _Exit) Then Exit MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL, $MB_TOPMOST), @ScriptName, "Globales HotKey 'ESC' konnte nicht gesetzt werden!")
_CheckBootUp()
Func _CheckBootUp()
Local $hFile, $aRechner = FileReadToArray(@ScriptDir & "\RechnerListe.txt")
If Not UBound($aRechner) Then Exit MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL, $MB_TOPMOST), @ScriptName, "RechnerListe.txt nicht gefunden oder leer!")
$hFile = FileOpen($g_sLogFile, BitOR($FO_ANSI, $FO_APPEND)) ; ANSI reicht völlig aus, wenn keine Sonderzeichen enthalten sind.
For $i = 0 To UBound($aRechner) - 1 Step 1
Ping($aRechner[$i], 300)
If @error Then
; ____________________StringFormat('11111 : 22222 : 33333 : 44', 1111111111111, 22, 33, 444444444)
_FileWriteLog($hFile, StringFormat('%-26s : %-26s : %-26s : %s', $aRechner[$i], '', '', 'offline'))
Else
; ____________________StringFormat('11111 : 22222 : 33333 : 44', 1111111111111, 222222222222222222222222222, 3333333333333, 44444444444444444444444444444)
_FileWriteLog($hFile, StringFormat('%-26s : %-26s : %-26s : %s', $aRechner[$i], _GetUserName($aRechner[$i]), _GetRegData(), _GetLastBootUp($aRechner[$i])))
EndIf
Next
FileClose($hFile)
MsgBox(BitOR($MB_ICONINFORMATION, $MB_SYSTEMMODAL, $MB_TOPMOST), @ScriptName, "Fertig")
EndFunc ;==>_CheckBootUp
Func _GetLastBootUp($sComputer = '.') ; "." steht für lokalen Rechner
Local $oWMIService = ObjGet("winmgmts:\\" & $sComputer & "\root\cimv2")
If Not IsObj($oWMIService) Then Return ''
Local $oColOperatingSystems = $oWMIService.ExecQuery("Select LastBootUpTime from Win32_OperatingSystem")
Local $sBootup
For $oOS In $oColOperatingSystems
$sBootup = $oOS.LastBootUpTime ; --> 20180210112637.125599+060
Next
Return $sBootup = '' ? 'WMI-Dienst nicht gestartet oder keine Regeln für Windows Firewall WMI eingehend definiert!' : StringRegExpReplace($sBootup, '(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2}).+', '\1-\2-\3 \4:\5:\6')
EndFunc ;==>_GetLastBootUp
Func _GetUserName($strClient = @ComputerName, $strDomain = '')
Local $objWMIService, $objItem, $colItems, $strUser, $Result
$objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & $strClient)
If Not IsObj($objWMIService) Then Return ''
$colItems = $objWMIService.InstancesOf("Win32_Process")
If IsObj($colItems) Then
For $objItem In $colItems
If ($objItem.Caption = "explorer.exe") Then
$Result = $objItem.GetOwner($strUser, $strDomain)
If (Not @error) And ($Result = 0) Then Return $strUser
EndIf
Next
EndIf
EndFunc ;==>_GetUserName
Func _GetRegData()
Return RegRead("HKEY_CURRENT_USER\SOFTWARE\pSAG\proalpha-client-production\5.1\proALPHA Session", "UserID")
EndFunc ;==>_GetRegData
Func _Exit()
Exit
EndFunc ;==>_Exit
Alles anzeigen
Und BITTE: Zitiere künftig nicht mehr komplette Nachrichten oder Scripte, sondern nur den relevanten Teil, der zum Verständnis nötig ist.
Ich habe wirklich spekuliert, dass mal ein Ping verloren gehen kann.
Nun, bis data ist mir noch nie ein Ping verloren gegangen... und wäre dem so, würde ich das Problem nicht einfach mit einer For-Schleife kaschieren, sondern die Ursache dafür finden wollen. ![]()
Es könnte vllt. sein, dass mal ein Ping verloren geht. Zur Sicherheit könntest du den Ping in eine eigene For Schleife packen und max. dreimal ausführen,
Mit anderen Worten... den Parameter $iTimeOut auf 3000 setzen. ![]()
Habe das Script bei mir getestet und es läuft einwandfrei und ohne Fehler.
Die Funktion labelSetScheme habe ich allerdings etwas verkürzt...
Func labelSetScheme($cLabel, $iScheme)
Local Static $aSchemes = [[0xCCFF33, 0x336600], [0xFF9933, 0x993300], [0xFFFF66, 0x996633], [0xFFFFFF, 0x000000]]
;~ If $iScheme < 0 Or $iScheme >= UBound($aSchemes) Then Return SetError(1, 0, False)
GUICtrlSetBkColor($cLabel, $aSchemes[$iScheme][0])
GUICtrlSetColor($cLabel, $aSchemes[$iScheme][1])
EndFunc
ContinueCase... du brauchst doch nur die Cases vertauschen?!
Select
Case $read_important = 4
_GUICtrlTreeView_SetIcon($hTreeView, $hFileItem, 'shell32.dll', 92)
Case $read_reservierung = 4
_GUICtrlTreeView_SetIcon($hTreeView, $hFileItem, 'shell32.dll', 111) ;Icon 111
Case Else
_GUICtrlTreeView_SetIcon($hTreeView, $hFileItem, 'shell32.dll', 5)
EndSelect
Mein aktuelles Projekt hat bis dato 307 KB in 3893 Zeilen und ist zu 95% fertig.
SciTE Jump kenne ich schon sehr lange, nutze es aber nicht, weil es nicht mit mehreren SciTE-Instanzen und auch nicht mit mehreren Monitoren klar kommt. Das müsste dringend mal angepasst werden. Um zu einer Funktion zu scrollen, drücke ich Ctrl + j. Dazu muss das Caret vor/über/hinter einem Funktionsnamen stehen. Bei den Includes geht dies übrigens mit Alt + i. Desweitern setze ich auch gerne Lesezeichen (Strg + F2), um wichtige Stellen im Script zu markieren, die dann mit F2/Shift + F2 angesprungen werden können.
Das Hauptscript in mehrere Module aufzuteilen macht Sinn, wenn man eine IDE benutzt. Mit SciTE bringt es mehr Nachteile als Vorteile, weil SciTE keine Projekte verwalten kann.
Ich habe zwar ISN AutoIT Studio
installiert und "spiele" auch ab und an gerne damit, hantiere wegen den von mir integrierten Lua-Scripts aber dennoch lieber mit SciTE.
Ich benutze je nach Situation OrganizeIncludes oder IncludesHelper, doch keines der beiden Tools ist wirklich befriedigend, da keines der beiden alle benötigten Includes immer korrekt erkennt! ManageIncludes.lua ( BugFix ) bekomme ich leider nicht zum Laufen.
In meinem aktuellen Projekt habe ich folgende Unterordner:
LPS Manager
BackUp\ ; BackUp der Einstellungen (*.ini)
Debug\ ; Spezielle Debug-Funktionen (werden ausgeführt, wenn $g_iDEBUG > 0 ist)
Docs\ ; Anleitungen für User
Erweiterungen\ ; Optionale Erweiterungen
ETH484 - 4 x 16A ethernet relay\ ;
Icons\ ;
ListView\ ; 16 x 16, ...
ToolBar\ ; 64 x 64, ...
Includes\ ; Eigene Includes für dieses Projekt
Pics\ ; ProgInfo und Pic für Hilfe
PlantLayouts ; Gebäudepläne (via Drag n Drop hinzufügar)
Sounds\ ; Sounds für Error, Notify, Mail usw.
Mail\ ;
Test\ ; Test-Scripte, die in vielen Fällen später auch in anderen Projekten verwendet werden können
Tools\ ; Spezielle Tools für dieses Projekt
Alles anzeigen
;-- TIME_STAMP 2018-03-02 21:51:25 v 0.1
#RequireAdmin
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Change2CUI=y
#AutoIt3Wrapper_Res_requestedExecutionLevel=requireAdministrator
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#Region ;************ Includes ************
#include-once
#include <File.au3>
;~ #include <Array.au3>
;~ #include <AutoItConstants.au3>
;~ #include <MsgBoxConstants.au3>
#EndRegion ;************ Includes ************
; WMI-Dienst gestartet?
; sc query winmgmt
; Windows Firewall WMI eingehend
; abfragen: netsh advfirewall firewall show rule name="Windows-Verwaltungsinstrumentation (WMI eingehend)"
; erlauben: netsh advfirewall firewall set rule group="Windows-Verwaltungsinstrumentation (WMI)" new enable=yes
; ESET Security musste ich temporär auf "Interaktiv" umstellen, um die neuen Regeln ohne einen Neustart zu übernehmen.
Global $g_sLogFile = @ScriptDir & "\CheckBootUp.txt"
If Not IsAdmin() Then Exit MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL, $MB_TOPMOST), @ScriptName, "Das Skript muss mit Adminrechten gestartet werden!")
; Globales Hotkey zum Beenden des Scripts: "ESC-Taste"
If Not HotKeySet("{ESC}", _Exit) Then Exit MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL, $MB_TOPMOST), @ScriptName, "Globales HotKey 'ESC' konnte nicht gesetzt werden!")
_CheckBootUp()
Func _CheckBootUp()
Local $hFile, $aRechner = FileReadToArray(@ScriptDir & "\RechnerListe.txt")
If Not UBound($aRechner) Then Exit MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL, $MB_TOPMOST), @ScriptName, "RechnerListe.txt nicht gefunden oder leer!")
$hFile = FileOpen($g_sLogFile, BitOr($FO_ANSI, $FO_APPEND)) ; ANSI reicht völlig aus, wenn keine Sonderzeichen enthalten sind.
For $i = 0 To UBound($aRechner) -1 Step 1
Ping($aRechner[$i], 300)
If @error Then
; ____________________StringFormat('11111 : 22222 : 33', 1111111111111, 22, 33)
_FileWriteLog($hFile, StringFormat('%-26s : %-26s : %s', $aRechner[$i], '', ''))
Else
; ____________________StringFormat('11111 : 22222 : 33', 1111111111111, 222222222222222222222222222, 33333333333333333333333333333)
_FileWriteLog($hFile, StringFormat('%-26s : %-26s : %s', $aRechner[$i], _GetUserName($aRechner[$i]), _GetLastBootUp($aRechner[$i])))
EndIf
Next
FileClose($hFile)
MsgBox(BitOR($MB_ICONINFORMATION, $MB_SYSTEMMODAL, $MB_TOPMOST), @ScriptName, "Fertig")
EndFunc ;==>_CheckBootUp
Func _GetLastBootUp($sComputer = '.') ; "." steht für lokalen Rechner
Local $oWMIService = ObjGet("winmgmts:\\" & $sComputer & "\root\cimv2")
If Not IsObj($oWMIService) Then Return ''
Local $oColOperatingSystems = $oWMIService.ExecQuery("Select LastBootUpTime from Win32_OperatingSystem")
Local $sBootup
For $oOS In $oColOperatingSystems
$sBootup = $oOS.LastBootUpTime ; --> 20180210112637.125599+060
Next
Return $sBootup = '' ? 'WMI-Dienst nicht gestartet oder keine Regeln für Windows Firewall WMI eingehend definiert!' : StringRegExpReplace($sBootup, '(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2}).+', '\1-\2-\3 \4:\5:\6')
EndFunc ;==>_GetLastBootUp
Func _GetUserName($strClient = @ComputerName, $strDomain = '')
Local $objWMIService, $objItem, $colItems, $strUser, $Result
$objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & $strClient)
If Not IsObj($objWMIService) Then Return ''
$colItems = $objWMIService.InstancesOf("Win32_Process")
If IsObj($colItems) Then
For $objItem In $colItems
If ($objItem.Caption = "explorer.exe") Then
$Result = $objItem.GetOwner($strUser, $strDomain)
If (Not @error) And ($Result = 0) Then Return $strUser
EndIf
Next
EndIf
EndFunc ;==>_GetUserName
Func _Exit()
Exit
EndFunc ;==>_Exit
Alles anzeigen
Habe mich selbst schon daran versucht...aber ich bekomme leider immer noch den User zurückgemeldet, der das Script ausführt.
Zeige mal bitte, wie du es versucht hast.
Hier ein paar Möglichkeiten...
;-- TIME_STAMP 2018-03-01 21:28:11 v 0.1
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
;~ #AutoIt3Wrapper_Change2CUI=y
;~ #AutoIt3Wrapper_Res_requestedExecutionLevel=requireAdministrator
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
ConsoleWrite('+ @UserName = ' & @UserName & @CRLF)
ConsoleWrite('> LastUsedUsername = ' & RegRead((@OSArch = 'X86' ? 'HKLM' : 'HKLM64') & '\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon', 'LastUsedUsername') & @CRLF)
ConsoleWrite('- @ComputerName = ' & _GetUserName(@ComputerName) & @CRLF)
If @IPAddress1 <> '0.0.0.0' Then ConsoleWrite('- @IPAddress1 ('&@IPAddress1&') = ' & _GetUserName(@IPAddress1) & @CRLF)
If @IPAddress2 <> '0.0.0.0' Then ConsoleWrite('- @IPAddress2 ('&@IPAddress2&') = ' & _GetUserName(@IPAddress2) & @CRLF)
If @IPAddress3 <> '0.0.0.0' Then ConsoleWrite('- @IPAddress3 ('&@IPAddress3&') = ' & _GetUserName(@IPAddress3) & @CRLF)
If @IPAddress4 <> '0.0.0.0' Then ConsoleWrite('- @IPAddress4 ('&@IPAddress4&') = ' & _GetUserName(@IPAddress4) & @CRLF)
Func _GetUserName($strClient)
Local $objWMIService, $objItem, $colItems, $strUser, $strDomain, $Result
$objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & $strClient)
If Not IsObj($objWMIService) Then Return ''
$colItems = $objWMIService.InstancesOf("Win32_Process")
If IsObj($colItems) Then
For $objItem In $colItems
If ($objItem.Caption = "explorer.exe") Then
$Result = $objItem.GetOwner($strUser, $strDomain)
If (Not @error) And ($Result = 0) Then Return $strUser
EndIf
Next
EndIf
EndFunc
Alles anzeigen
Nein! Seit 3.3.10.2 (?) kann man Funktionen als Referenz übergeben und es ist auch möglich sie direkt zu übergeben.
Stimmt... danke... habe es soeben getestet... das ist in der Hilfe zu HotKeySet aber nicht mal ansatzweise beschrieben.
Du kannst sogar Funktionen aus Variablen callen!
Ja, das wusste ich bereits... bis dato hatte ich aber angenommen, dass es zumindest bei HotKeySet nicht der Fall ist.
HotKeySet: Bei globalen Hotkeys würde ich immer überprüfen, ob diese gesetzt werden konnten. Zudem muss der Funktionsname in ""!
IsAdmin: Nur dann Ausgabe machen und Script beenden, wenn es nicht der Fall ist.
getRow: FileClose muss vor dem Return ausgeführt werden!
getRow/hasRows - sind überflüssig!
structure: Das erste FileOpen $hFilehandle wird an keiner Stelle geschlossen!
Es heißt nicht $sCount, $sLine... sondern $iCount, $iLine, denn dass $s steht für String, das $i für Int[eger].
Du darfst die Modes für FileOpen nicht mit & verknüpfen, sondern mit + oder besser noch mit BitOr. "Haus" & "katze" = "Hauskatze", 1 + 2 = 3, BitOr(1, 2) = 3
Falsch: Local $hFileAusgabe = FileOpen($sDateiAusgabe, $FO_UTF8 & $FO_APPEND)
Richtig: Local $hFileAusgabe = FileOpen($sDateiAusgabe, $FO_UTF8 + $FO_APPEND)
Besser: Local $hFileAusgabe = FileOpen($sDateiAusgabe, BitOr($FO_UTF8, $FO_APPEND))
If $iPing Then ... ist falsch, denn die "roundtrip-time" kann sehr wohl auch Null sein, was in der Hilfe leider immer noch nicht richtig beschrieben ist!
Richtig ist also...
If @error Then
$sPath wird an keiner Stelle im Script verwendet.
In Zeile 59/64 verwendest du "Magic Numbers", in Zeile 7 aber Konstanten für MsgBox... du solltest dich für eine Form entscheiden.
;-- TIME_STAMP 2018-02-26 20:32:38 v 0.1
#RequireAdmin
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Change2CUI=y
#AutoIt3Wrapper_Res_requestedExecutionLevel=requireAdministrator
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#Region ;************ Includes ************
#include-once
#include <File.au3>
;~ #include <Array.au3>
;~ #include <AutoItConstants.au3>
;~ #include <MsgBoxConstants.au3>
#EndRegion ;************ Includes ************
; WMI-Dienst gestartet?
; sc query winmgmt
; Windows Firewall WMI eingehend
; abfragen: netsh advfirewall firewall show rule name="Windows-Verwaltungsinstrumentation (WMI eingehend)"
; erlauben: netsh advfirewall firewall set rule group="Windows-Verwaltungsinstrumentation (WMI)" new enable=yes
; ESET Security musste ich temporär auf "Interaktiv" umstellen, um die neuen Regeln ohne einen Neustart zu übernehmen.
Global $g_sLogFile = @ScriptDir & "\CheckBootUp.txt"
If Not IsAdmin() Then Exit MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL, $MB_TOPMOST), @ScriptName, "Das Skript muss mit Adminrechten gestartet werden!")
; Globales Hotkey zum Beenden des Scripts: "ESC-Taste"
If Not HotKeySet("{ESC}", "_Exit") Then Exit MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL, $MB_TOPMOST), @ScriptName, "Globales HotKey 'ESC' konnte nicht gesetzt werden!")
_CheckBootUp()
Func _CheckBootUp()
Local $hFile, $aRechner, $aRechner = FileReadToArray(@ScriptDir & "\RechnerListe.txt")
If Not UBound($aRechner) Then Exit MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL, $MB_TOPMOST), @ScriptName, "RechnerListe.txt nicht gefunden oder leer!")
$hFile = FileOpen($g_sLogFile, BitOr($FO_ANSI, $FO_APPEND)) ; ANSI reicht völlig aus, wenn keine Sonderzeichen enthalten sind.
For $i = 0 To UBound($aRechner) -1 Step 1
ConsoleWrite('Ping ' & $aRechner[$i] & @CRLF)
Ping($aRechner[$i], 300)
_FileWriteLog($hFile, StringFormat('%-26s : %s', $aRechner[$i], (@error ? 'offline' : _GetLastBootUp($aRechner[$i]))))
Next
FileClose($hFile)
MsgBox(BitOR($MB_ICONINFORMATION, $MB_SYSTEMMODAL, $MB_TOPMOST), @ScriptName, "Fertig")
EndFunc ;==>_CheckBootUp
Func _GetLastBootUp($sComputer = '.') ; "." steht für lokalen Rechner
Local $oWMIService = ObjGet("winmgmts:\\" & $sComputer & "\root\cimv2")
If Not IsObj($oWMIService) Then Return ''
Local $oColOperatingSystems = $oWMIService.ExecQuery("Select LastBootUpTime from Win32_OperatingSystem")
Local $sBootup
For $oOS In $oColOperatingSystems
$sBootup = $oOS.LastBootUpTime ; --> 20180210112637.125599+060
ConsoleWrite('$sBootup = ' & $sBootup & @CRLF)
Next
Return $sBootup = '' ? 'WMI-Dienst nicht gestartet oder keine Regeln für Windows Firewall WMI eingehend definiert!' : StringRegExpReplace($sBootup, '(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2}).+', '\1-\2-\3 \4:\5:\6')
EndFunc ;==>_GetLastBootUp
Func _Exit()
Exit
EndFunc ;==>_Exit
Alles anzeigen
Wenn du mit 64-Bit Programmen oder Dlls hantieren möchtest, dann musst du AutoIt das auch sagen...
#AutoIt3Wrapper_UseX64=y
Local $hDLL = DllOpen(@ScriptDir & "\LogitechLed.dll")
If @error Then Exit MsgBox(16, @ScriptName, "LogitechLed.dll kann nicht geladen werden - das Script wird beendet!")
Local $aReturn = DllCall($hDLL, "bool", "LogiLedInit")
If @error Then MsgBox(0, "", "Methode konnte nicht aufgerufen werden!")
DllClose($hDLL)
Exit
Im Anhang findest du eine aktualisierte ModernMenuLib_with_Tray_Fixed (für AutoIt v3.3.14.3)... inkl. deinem Script und einer geänderten/korrigierten SystemWindowSizes.au3.
Du darfst Konstanten nicht innerhalb einer Funktion deklarieren, weil sie nur einmalig deklariert werden dürfen und nicht bei jedem Funktionsaufruf!
Globale Variablen sollten nach Möglichkeit auch nicht innerhalb von Funktionen deklariert werden... wobei sich das aber nicht immer vermeiden lässt.
in der SystemWindowSizes.au3 werden werden Konstanten deklariert, noch andere Dateien includiert.
Das ist ja wunderbar... und wo finde ich die SystemWindowSizes.au3?
Ohne Script kann ich dein Problem nicht nachvollziehen.
Dann werden die Includes in der falschen Reihenfolge geladen...