Hey Bitnugger,
an der Stelle erstmal vielen Dank für deine ganzen Hinweise und Verbesserungsvorschläge.
Habe fast alles so in mein Script übernehmen können.
Einige Sachen waren mir komplett neu.
Zu deinem Script noch eine Frage.
Kannst du es noch um eine weitere Information erweitern?
Ich würde gern noch den aktuell angemeldeten User mit ausgewertet bekommen.
Habe mich selbst schon daran versucht...aber ich bekomme leider immer noch den User zurückgemeldet, der das Script ausführt.
Die beste Stelle wäre:
Abfragedatum : Abfragezeit : Rechnername : CurrentUser : _CheckBootUp()
Alles anzeigenHotKeySet: 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.
AutoIt: CheckBootUp Alles anzeigen;-- 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