1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Lashandan

Beiträge von Lashandan

  • Softwareinventarisierung

    • Lashandan
    • 23. Juli 2018 um 13:10
    Zitat von BugFix

    Tipp: Pfadangaben nicht hardcoden.

    Deine *.txt und deine Logfiles sind fest im Skript codiert. Ich würde das flexibel gestalten (mit INI oder Programmparameter)

    - wenn INI vorhanden --> verwende Pfade von dort -->sonst: @ScriptDir & "\..."

    Oder

    - wenn Startparameter übergeben ( /txt='Pfad\Datei.txt' /log1='Pfad\Log1Datei.log' /log2='Pfad\Log2Datei.log' - oder ähnlich) --> verwende diese Pfade, sonst: s.o.

    Hey BugFix - vielen Dank für deine Antwort.

    Danke für den Hinweis. Habe es berücksichtigt und verwende künftig keine harten Pfadangaben ;)

    Zitat von autoiter

    Das nächste betrifft deine Funktionen, OSList und Softwarelist. Hier hast du jeweils ein FileClose am Ende der Funktion. Aber zuvor hast du die Datei nie mit FileOpen geöffnet und du arbeitest daher auch nicht mit dem Filehandle, das von dieser Funktion zurückgegeben wird, sondern mit dem Dateipfad. Daher werden die Schritte FileOpen/FileClose bei jeder Anwendung der Funktion FileWriteLine durchgeführt. Je mehr Einträge, desto länger dauert das...

    Ich bin sicher, die Korrektur dieses kleinen Fehlers macht dein Skript schon schneller. Darüber hinaus würde ich den langen, sich wiederholenden Teil der Ausgabe, am Anfang in eine Variable schreiben und diese dann benutzen. Dann wirkt der Code nicht so erschlagend.

    Hier am Bsp deiner OSList-Funktion (mehr Auswirkungen hat das sicher bei Softwarelist. Da ist es aber genau gleich zu ändern.):

    (Achtung: Bei FileOpen benutze ich die Konstante $FO_OVERWRITE. Entweder du schreibst stattdessen 2 oder du fügst oben im Skript #include <FileConstants.au3> ein.)

    AutoIt
    Func OSList()
        Local $sLogFileOS = @ScriptDir & "\" & @MON & "" & @MDAY & "" & @YEAR & "_" & @HOUR & "_" & @MIN & "_LogFileOS.txt"
        Local $hOpenLFileOS = FileOpen($sLogFileOS, $FO_OVERWRITE) ; ACHTUNG: Ab hier wird nur noch mit dem Handle $hOpenLFileOS gearbeitet. Nicht mit $sLogFileOS.
        If $hOpenLFileOS = -1 Then
            MsgBox($MB_SYSTEMMODAL, "Abbruch", $sLogFileOS & " konnte nicht geöffnet werden!")
            Exit
        EndIf
        
        FileWriteLine($hOpenLFileOS, @WDAY & "." & @MON & "." & @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & "Start der Betriebssystemverarbeitung")
        ConsoleWrite(@WDAY & "." & @MON & "." & @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & "Start der Betriebssystemverarbeitung" & @CRLF)
        Local $sDesc = "", $iPing = 0
        For $i = 0 To UBound($sPC) - 1
            $sDesc = @WDAY & "." & @MON & "." & @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i]
            
            $iPing = Ping($sPC[$i], 250)
            Switch @error
                Case 1
                    ;MsgBox(64, @error, "Host is offline")
                    FileWriteLine($hOpenLFileOS, $sDesc & " Error 1: " & "Host ist Offline" & @CRLF)
                    ConsoleWrite($sDesc & " Error 1: " & "Host ist Offline" & @CRLF)
                Case 2
                    ;MsgBox(64, @error, "Host is unreachable")
                    FileWriteLine($hOpenLFileOS, $sDesc & " Error 2: " & "Host nicht erreichbar" & @CRLF)
                    ConsoleWrite($sDesc & " Error 2: " & "Host nicht erreichbar" & @CRLF)
                Case 3
                    ;MsgBox(64, @error, "Bad destination")
                    FileWriteLine($hOpenLFileOS, $sDesc & " Error 3: " & "Bad destination" & @CRLF)
                    ConsoleWrite($sDesc & " Error 3: " & "Bad destination" & @CRLF)
                Case 4
                    ;MsgBox(64, @error, "Other errors")
                    FileWriteLine($hOpenLFileOS, $sDesc & " Error 4: " & "Kein Zugriff" & @CRLF)
                    ConsoleWrite($sDesc & " Error 4: " & "Kein Zugriff" & @CRLF)
                Case Else
                    FileWriteLine($hOpenLFileOS, $sDesc & " Status : " & "Rechner online" & @CRLF)
                    ConsoleWrite($sDesc & " Status : " & "Rechner online" & @CRLF)
                    ;MsgBox(64, @error, "Host is online")
                    $oWMI = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & $sPC[$i] & "\root\cimv2")
                    If IsObj($oWMI) Then
                        $aSystem = $oWMI.ExecQuery("Select * from Win32_OperatingSystem")
                        For $oApp In $aSystem
                            $installdate = StringMid($oApp.InstallDate, 1, 4) & "-" & StringMid($oApp.InstallDate, 5, 2) & "-" & StringMid($oApp.InstallDate, 7, 2)
                            ;FileWriteLine($LogFile, $sPC[$i] & "," & $oApp.Name & "," & $oApp.Version & "," & $oApp.Vendor & "," & $oApp.InstallDate & @CRLF)
                            If $sData2 <> '' Then
                                $sData2 = $sData2 & '~'
                            EndIf
                            ;('%1;%2;%3;%4;%5'    %1               %2                 %3                    %4                   %5)
                            $sData = StringFormat('%s;%s;%s;%s;%s', $sPC[$i] & ";" & $oApp.Caption & ";" & $oApp.Version & ";" & $oApp.Manufacturer & ";" & $installdate)
                            $sData2 = $sData2 & '~' & $sData
                        Next
                    Else
                        ;FileWriteLine($LogFile, $sPC[$i] & "," & "Offline" & @CRLF)
                    EndIf
                    $oHTTP.Send("id=setSoftwareinventar&data=" & _URLEncode($sData2))
                    FileWriteLine($hOpenLFileOS, $sDesc & " Erfolg : " & "Eintraege wurden vorgenommen" & @CRLF)
                    ConsoleWrite($sDesc & " Erfolg : " & "Eintraege wurden vorgenommen" & @CRLF)
                    ;ConsoleWrite($sData2)
            EndSwitch
        Next
        FileWriteLine($hOpenLFileOS, @WDAY & "." & @MON & "." & @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & "Ende der Betriebssystemverarbeitung")
        ConsoleWrite(@WDAY & "." & @MON & "." & @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & "Ende der Betriebssystemverarbeitung" & @CRLF)
        FileClose($hOpenLFileOS)
    EndFunc   ;==>OSList
    Alles anzeigen

    Auch diesen Hinweis von dir habe ich berücksichtigt und angewandt.

    Ich ging wohl einfach davon aus, dass ein FileOpen gar nicht mehr notwendig wäre, wenn man die Variable zum Pfad bzw. zum Logfile angibt.

    Aber es macht alles nur Sinn was du schreibst:

    Funktion starten, File öffnen, offen lassen, Schreibvorgänge vornehmen und am Ende erst wieder schließen.

    Ich habe die neue Funktion auch direkt mal getestet...allerdings habe ich immer noch Schwierigkeiten mit der Performance.

    Also hat es nicht unbedingt zu einer Besserung geführt, den Code aber wesentlich ordentlicher und richtiger gemacht.

    Die Performance bei der OSList()-Funktion läuft problemlos und sehr schnell. Innerhalb von 3 Minuten waren 190 Rechner abgefragt.

    Weiterhin habe ich weitere 28 Rechner abgefragt und eine Softwareliste erstellen lassen, hier mal die Zeiten dazu:

    Uhrzeit Status Dauer
    10:45:54 NDEST003 Erfolg : Eintraege wurden vorgenommen 00:00:28
    10:47:18 NDEST005 Erfolg : Eintraege wurden vorgenommen 00:01:24
    10:47:20 NDEST009 Erfolg : Eintraege wurden vorgenommen 00:00:02
    10:47:48 NDEST044 Erfolg : Eintraege wurden vorgenommen 00:00:28
    10:50:36 NDEST054 Erfolg : Eintraege wurden vorgenommen 00:02:48
    10:51:00 NDEST055 Erfolg : Eintraege wurden vorgenommen 00:00:24
    10:51:29 NDEST056 Erfolg : Eintraege wurden vorgenommen 00:00:29
    10:53:34 NDEST058 Erfolg : Eintraege wurden vorgenommen 00:02:05
    10:55:24 NDEST059 Erfolg : Eintraege wurden vorgenommen 00:01:50
    10:56:01 NDEST061 Erfolg : Eintraege wurden vorgenommen 00:00:37
    10:57:29 NDEST066 Erfolg : Eintraege wurden vorgenommen 00:01:28
    10:58:04 NDEST071 Erfolg : Eintraege wurden vorgenommen 00:00:35
    10:58:30 NDEST078 Erfolg : Eintraege wurden vorgenommen 00:00:26
    10:59:23 SDESTAPP3 Erfolg : Eintraege wurden vorgenommen 00:00:53
    10:59:57 SDESTAPP4 Erfolg : Eintraege wurden vorgenommen 00:00:34
    11:01:33 SDESTFELIX Erfolg : Eintraege wurden vorgenommen 00:01:36
    11:02:14 SDESTFIL03 Erfolg : Eintraege wurden vorgenommen 00:00:41
    11:02:59 SDESTIZDQ Erfolg : Eintraege wurden vorgenommen 00:00:45
    11:03:37 SDESTLSA Erfolg : Eintraege wurden vorgenommen 00:00:38
    11:04:20 SDESTMXS02 Erfolg : Eintraege wurden vorgenommen 00:00:43
    11:04:50 SDESTPAAPP1 Erfolg : Eintraege wurden vorgenommen 00:00:30
    11:05:08 SDESTPAD1 Erfolg : Eintraege wurden vorgenommen 00:00:18
    11:10:00 SDESTSQL02 Erfolg : Eintraege wurden vorgenommen 00:04:52
    11:11:44 SDESTSQL03 Erfolg : Eintraege wurden vorgenommen 00:01:44
    11:12:47 SDESTSQL04 Erfolg : Eintraege wurden vorgenommen 00:01:03
    11:15:46 VDEST1001 Erfolg : Eintraege wurden vorgenommen 00:02:59
    11:17:50 VDEST1003 Erfolg : Eintraege wurden vorgenommen 00:02:04
    11:19:10 VDEST1004 Erfolg : Eintraege wurden vorgenommen 00:01:20

    Ich kann mir einfach noch nicht so recht erklären, wodurch diese extrem unterschiedlichen Zeiten zustande kommen.

    Aber vllt. hat ja jemand von euch noch eine Idee hinsichtlich der Optimierung.

    Zitat von misterspeed

    Da dein Webservice POST Daten entgegennimmt ohne vorherige Authentifizierung (hab jedenfalls beim Überfliegen nichts davon gesehn) ließe sich das ganze massiv paralelisieren.

    Anstatt das Script zentral von einer Adminstation auszuführen könnte auch jeder Clientrechner im Netzwerk seine eigenen Scriptinstanz ausführen und seine Daten selbsständig an den Webservice melden. So machen das auch verbreitete "professionelle" Lösungen wie z.B. OCS Inventory und GLPI

    Vorteil:

    - Alle Clients melden paralell, somit extreme Zeitersparnis

    - Alle Clients könnten periodisch Updates über ihre derzeitige Konfiguration versenden (z.B. über täglichen Windows Task), somit hast du stets aktuelle Daten über die Softwarekonfiguration

    Nachteil bzw. Mehraufwand:

    - Das Script muss einmalig auf dem Clientrechner platziert und entsprechend als Task eingerichtet werden

    - Der Webservice bzw. dessen API muss im kompletten Netzwerk verfügbar sein (evtl. Probleme mit Clients die mobil und nicht immer im lokalen Netzwerk angemeldet sind)

    - Missbrauchspotential, da Webservice ohne Authentifizierung ansprechbar ist -> evtl. richtige API mit Authentifizierung einsetzen

    - Client Script sollte über Selbstupdate Funktion verfügen, damit du einfach und schnell alle Clients austauschen kannst wenn du eine Änderung des Clients benötigst

    - Fehlermeldungen vielleicht besser unsichtbar per Email versenden anstatt per msgbox ausgeben, um Benutzer nicht zu verwirren

    Alles anzeigen

    Hey misterspeed - dir auch vielen Dank für deine Bemühungen.

    Hierzu muss ich aber noch erwähnen, dass ich nur für die Teststellung keine Authentifizierung nutze.

    Leider überwiegen die Nachteile bei der von dir vorgeschlagenen Lösung.

    Allerdings habe ich noch folgendes vor...dadurch, dass ja ein Webservice und eine SQL-Datenbank die ganze Geschichte unterstützt, habe ich später keine *.txt-Datei mehr in der die abzufragenden Rechner stehen, sondern eine SQL-Tabelle in der alle Rechner mittels IP-Range ermittelt werden.

    Dann starte ich mein Skript als Dienst in 6-10 verschiedene Instanzen (die Anzahl muss ich mir ausprobieren) und jedesmal, wenn sich das Skript einen Rechner holt, setzt der Webservice einen Eintrag in der Datenbank, dass dieser Rechner bereits abgefragt wird. Hat die erste Instanz dann die benötigten Informationen, wird die Softwareliste in die Datenbank geschrieben und der Webservice löscht den abgefragten Rechner.

    Somit erhöht sich die Performance eben um die Anzahl der Instanzen/Dienste die gestartet werden.

  • Softwareinventarisierung

    • Lashandan
    • 20. Juli 2018 um 11:05

    Hallo an alle begeisterten AutoIt-Freunde,

    ich befasse mich mit der Inventarisierung aller Rechner in unserem Unternehmen und habe dafür mal ein Skript geschrieben.

    Dieses Skript öffnet ein Konsole-Fenster und gibt dort die einzelnen Schritte aus.

    Als Quelle Dient derzeit noch eine *.txt-Datei in der alle Rechner eingetragen werden.

    Habe das Skript in zwei Hauptfunktionen unterteilt, eine Funktion fragt alle Rechner ab und sucht nach den installierten Betriebssystemen.

    Die zweite Funktion fragt alle Rechner ab und sucht nach der gesamten installierten Software.

    Im Anschluss an jede Funktion werden die Daten zusammengefasst und per HTTP-POST Methode an einen Webservice gesendet.

    Als Frontend dient eine Webansicht in der man übersichtlich den jeweiligen Rechner auswählen kann und die Installierte Software sehen kann.

    Ich würde mich freuen, wenn die Profis unter euch mal einen Blick auf den Code werfen könnten und Verbesserungsvorschläge liefern.

    Die Laufzeit der Funktion zur Abfrage der installierten Betriebssysteme ist zufriedenstellend.

    Leider ist die Laufzeit der Funktion zur Abfrage der installierten Software noch sehr hoch.

    Schaut euch den Code mal an.

    Ich freue mich auf eure Kommentare.

    AutoIt
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Icon=ico\21699-200.ico
    #AutoIt3Wrapper_Compression=4
    #AutoIt3Wrapper_Change2CUI=y
    #AutoIt3Wrapper_Res_Comment=ComputerInfoViewer Inventory
    #AutoIt3Wrapper_Res_Description=ComputerInfoViewer Inventory
    #AutoIt3Wrapper_Res_Fileversion=0.9.0.5
    #AutoIt3Wrapper_Res_Fileversion_AutoIncrement=p
    #AutoIt3Wrapper_Res_LegalCopyright=Lashandan
    #AutoIt3Wrapper_Res_Language=1031
    #AutoIt3Wrapper_Res_requestedExecutionLevel=requireAdministrator
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    
    #Region ;**** Includes & RequireAdmin ****
    #include <Array.au3>
    #include <AutoITConstants.au3>
    ;#include <Timers.au3>
    #include <WinHttp.au3>
    #include <MsgBoxConstants.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #RequireAdmin
    #EndRegion ;**** Includes & RequireAdmin ****
    
    #Region ;**** Variablen ****
    Local $oWMI, $ComputerList = @ScriptDir & "\computer.txt", $aSystem, $sPC = FileReadToArray($ComputerList)
    Local $oHTTP, $sData, $aRechner, $hFile, $sData2
    Local $input
    $oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
    $oHTTP.Open("POST", "http://xxxxx:xx/request.php", False)
    $oHTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
    $oHTTP.Send($sData)
    #EndRegion ;**** Variablen ****
    
    #Region ;**** Quellprüfung
    If Not FileExists($ComputerList) Then
        MsgBox(48, "Error", "Fehlende Datei 'computer.txt' : " & @CRLF & $ComputerList & @CRLF & @CRLF & "Bitte stellen Sie sicher, dass die Quelldatei existiert.")
        Exit
    EndIf
    #EndRegion ;**** Quellprüfung
    
    #Region ;**** Start der Konsole
    ConsoleWrite("________________________" & @CRLF)
    ConsoleWrite("Eingabeaufforderung:" & @CRLF)
    ConsoleWrite("________________________" & @CRLF)
    ConsoleWrite("--> Bitte eine 1 eingeben fuer das Erstellen der OS-Liste." & @CRLF)
    ConsoleWrite("--> Bitte eine 2 eingeben fuer das Erstellen der Software-Liste." & @CRLF)
    
    While 1
    $input &= ConsoleRead()
    if StringInStr($input,@CRLF) <> 0 then ExitLoop
    Wend
    
    if $input = "1" & @CRLF Then
    ConsoleWrite("Erstellen der OS-Liste startet" & @CRLF)
    $sOSList = OSList()
    ElseIf $input = "2" & @CRLF Then
    ConsoleWrite("Erstellen der Software-Liste startet" & @CRLF)
    $sSoftwarelist = Softwarelist()
    Else
    ConsoleWrite("Falsche Eingabe! Erwartet wird 1 oder 2! Sie haben " & $input & " eingegeben!" & @CRLF )
    Sleep(1000)
    ConsoleWrite("Skript schliesst in 3" & @CRLF)
    Sleep(1000)
    ConsoleWrite("Skript schliesst in 2" & @CRLF)
    Sleep(1000)
    ConsoleWrite("Skript schliesst in 1" & @CRLF)
    Sleep(1000)
    EndIf
    #EndRegion ;**** Start der Konsole
    
    #Region ;**** Funktionen ****
    func OSList()
        $LogFileOS = @ScriptDir & "\" & @MON & "" & @MDAY & "" & @YEAR & "_" & @HOUR & "_" & @MIN & "_LogFileOS.txt"
        FileWriteLine($LogFileOS, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & "Start der Betriebssystemverarbeitung")
        ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & "Start der Betriebssystemverarbeitung" & @CRLF)
    For $i = 0 To UBound($sPC) - 1
        Local $iPing = Ping($sPC[$i], 250)
            Switch @error
            Case 1
            ;MsgBox(64, @error, "Host is offline")
            FileWriteLine($LogFileOS, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Error 1: " & "Host ist Offline" & @CRLF)
            ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & " " & @TAB & $sPC[$i] & " Error 1: " & "Host ist Offline" & @CRLF)
            Case 2
            ;MsgBox(64, @error, "Host is unreachable")
            FileWriteLine($LogFileOS, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Error 2: " & "Host nicht erreichbar" & @CRLF)
            ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Error 2: " & "Host nicht erreichbar" & @CRLF)
            Case 3
            ;MsgBox(64, @error, "Bad destination")
            FileWriteLine($LogFileOS, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Error 3: " & "Bad destination" & @CRLF)
            ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Error 3: " & "Bad destination" & @CRLF)
            Case 4
            ;MsgBox(64, @error, "Other errors")
            FileWriteLine($LogFileOS, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Error 4: " & "Kein Zugriff" & @CRLF)
            ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Error 4: " & "Kein Zugriff" & @CRLF)
            Case Else
            FileWriteLine($LogFileOS, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Status : " & "Rechner online" & @CRLF)
            ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Status : " & "Rechner online" & @CRLF)
            ;MsgBox(64, @error, "Host is online")
            $oWMI = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & $sPC[$i] & "\root\cimv2")
             If IsObj($oWMI) Then
                $aSystem = $oWMI.ExecQuery("Select * from Win32_OperatingSystem")
                For $oApp In $aSystem
                    $installdate = StringMid($oApp.InstallDate,1,4) & "-" & StringMid($oApp.InstallDate,5,2) & "-" & StringMid($oApp.InstallDate,7,2)
                    ;FileWriteLine($LogFile, $sPC[$i] & "," & $oApp.Name & "," & $oApp.Version & "," & $oApp.Vendor & "," & $oApp.InstallDate & @CRLF)
                    if $sData2 <> '' Then
                        $sData2 = $sData2 & '~'
                    EndIf
                                        ;('%1;%2;%3;%4;%5'    %1               %2                 %3                    %4                   %5)
                    $sData = StringFormat('%s;%s;%s;%s;%s', $sPC[$i] & ";" & $oApp.Caption & ";" & $oApp.Version & ";" & $oApp.Manufacturer & ";" & $installdate)
                    $sData2 = $sData2 & '~' & $sData
                Next
            Else
                ;FileWriteLine($LogFile, $sPC[$i] & "," & "Offline" & @CRLF)
            EndIf
        $oHTTP.Send("id=setSoftwareinventar&data=" & _URLEncode($sData2))
        FileWriteLine($LogFileOS, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Erfolg : " & "Eintraege wurden vorgenommen" & @CRLF)
        ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Erfolg : " & "Eintraege wurden vorgenommen" & @CRLF)
        ;ConsoleWrite($sData2)
            EndSwitch
    Next
    FileWriteLine($LogFileOS, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & "Ende der Betriebssystemverarbeitung")
    ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & "Ende der Betriebssystemverarbeitung" & @CRLF)
    FileClose($LogFileOS)
    EndFunc ;OSList()
    
    func Softwarelist()
        $LogFileSoftware = @ScriptDir & "\" & @MON & "" & @MDAY & "" & @YEAR & "_" & @HOUR & "_" & @MIN & "_LogFileSoftware.txt"
        FileWriteLine($LogFileSoftware, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & "Start der Softwareverarbeitung")
        ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & "Start der Softwareverarbeitung" & @CRLF)
    For $i = 0 To UBound($sPC) - 1
        Local $iPing = Ping($sPC[$i], 250)
            Switch @error
            Case 1
            ;MsgBox(64, @error, "Host is offline")
            FileWriteLine($LogFileSoftware, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Error 1: " & "Host ist Offline" & @CRLF)
            ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Error 1: " & "Host ist Offline" & @CRLF)
            Case 2
            ;MsgBox(64, @error, "Host is unreachable")
            FileWriteLine($LogFileSoftware, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Error 2: " & "Host nicht erreichbar" & @CRLF)
            ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Error 2: " & "Host nicht erreichbar" & @CRLF)
            Case 3
            ;MsgBox(64, @error, "Bad destination")
            FileWriteLine($LogFileSoftware, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Error 3: " & "Bad destination" & @CRLF)
            ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Error 3: " & "Bad destination" & @CRLF)
            Case 4
            ;MsgBox(64, @error, "Other errors")
            FileWriteLine($LogFileSoftware, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Error 4: " & "Kein Zugriff" & @CRLF)
            ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Error 4: " & "Kein Zugriff" & @CRLF)
            Case Else
            FileWriteLine($LogFileSoftware, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Status : " & "Rechner online" & @CRLF)
            ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Status : " & "Rechner online" & @CRLF)
            ;MsgBox(64, @error, "Host is online")
            $oWMI = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & $sPC[$i] & "\root\cimv2")
             If IsObj($oWMI) Then
                $aSystem = $oWMI.ExecQuery("Select * from Win32_Product")
                For $oApp In $aSystem
                    ;$installdate = StringMid($oApp.InstallDate,1,4) & "-" & StringMid($oApp.InstallDate,5,2) & "-" & StringMid($oApp.InstallDate,7,2)
                    ;FileWriteLine($LogFile, $sPC[$i] & "," & $oApp.Name & "," & $oApp.Version & "," & $oApp.Vendor & "," & $oApp.InstallDate & @CRLF)
                    if $sData2 <> '' Then
                        $sData2 = $sData2 & '~'
                    EndIf
                                        ;('%1;%2;%3;%4;%5'    %1               %2                 %3                    %4                   %5)
                    $sData = StringFormat('%s;%s;%s;%s;%s', $sPC[$i] & ";" & $oApp.Name & ";" & $oApp.Version & ";" & $oApp.Vendor & ";" & $oApp.InstallDate)
                    $sData2 = $sData2 & '~' & $sData
                Next
            Else
                ;FileWriteLine($LogFile, $sPC[$i] & "," & "Offline" & @CRLF)
            EndIf
        $oHTTP.Send("id=setSoftwareinventar&data=" & _URLEncode($sData2))
        FileWriteLine($LogFileSoftware, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Erfolg : " & "Eintraege wurden vorgenommen" & @CRLF)
        ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & $sPC[$i] & " Erfolg : " & "Eintraege wurden vorgenommen" & @CRLF)
        ;ConsoleWrite($sData2)
            EndSwitch
    Next
    FileWriteLine($LogFileSoftware, @WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & "Ende der Softwareverarbeitung")
    ConsoleWrite(@WDAY &"."& @MON &"."& @YEAR & " " & @HOUR & ":" & @MIN & ":" & @SEC & " " & @TAB & "Ende der Softwareverarbeitung" & @CRLF)
    FileClose($LogFileSoftware)
    EndFunc ;Softwarelist()
    
    Func _URLEncode($urlText)
        Local $sText
    
        For $i = 1 To StringLen($urlText)
            $acode = Asc(StringMid($urlText, $i, 1))
            Select
                Case ($acode >= 48 And $acode <= 57) Or _
                        ($acode >= 65 And $acode <= 90) Or _
                        ($acode >= 97 And $acode <= 122)
                    $sText &= StringMid($urlText, $i, 1)
                Case $acode = 32
                    $sText &= "%20"
                Case Else
                    $sText &= "%" & Hex($acode, 2)
            EndSelect
        Next
    
        Return $sText
    EndFunc   ;==>_URLEncode
    #EndRegion ;**** Funktionen ****
    Alles anzeigen
  • Start, Logon, Logoff und Shutdown

    • Lashandan
    • 22. März 2018 um 10:11

    Hey Leute,

    vielen Dank für die super Unterstützung. :thumbup:

    Ein riesen Dank geht raus an Bitnugger, für die Geduld, die tollen Erklärungen und astreinen Codes! :klatschen:

    Was soll ich sagen, es funktioniert jetzt so wie es soll und ich bin sehr glücklich. :party:

    Habe allein durch diesen Thread so viel neues gelernt und freue mich es künftig weiter ein- und umsetzen zu können.

    Da der Punkt mit dem User aus der Anwendung noch offen ist, werde ich mich zeitnah wieder dazu melden.

    Nochmals tausend Dank für die Unterstützung:klatschen:

  • Start, Logon, Logoff und Shutdown

    • Lashandan
    • 21. März 2018 um 14:36
    Zitat von Bitnugger

    Du hast bei dem letzten Befehl am Ende der Zeile noch ein S, was da nicht hin gehört und ich sehe auch den Prompt nach diesem Befehl nicht, was bedeutet, dass du ihn nicht ausgeführt hast! Hättest du ihn ausgeführt, stünde da jetzt eine Fehlermeldung und eine Zeile tiefer wieder der Prompt!

    C:\>IF %ERRORLEVEL% reg query "HKCU\SOFTWARE\pSAG\proalpha-client-test\5.1\proALPHA Session" /v UserID /reg:64S

    FEHLER: Ungültige Syntax.

    Geben Sie "REG QUERY /?" ein, um die Syntax anzuzeigen.

    C:\>

    Nun gib mal in einer Eingabeaufforderung auf einem anderen Rechner im Netzwerk (psexec nicht vergessen) folgenden Befehl ein, warte ein paar Sekunden und wiederhole die Befehle (diesmal alle und ohne Fehler) auf INFRA.

    Code
    psexec \\INFRA netsh advfirewall firewall set rule group="Windows-Verwaltungsinstrumentation (WMI)" new enable=yes

    Beide Ausgaben dann wieder hier posten.

    Alles anzeigen

    Ich muss das Auslesen des Users der Anwendung vorerst zurückstellen. Ich greife das Thema wieder auf, wenn ich etwas mehr Zeit habe.

    Die Ansätze sind alle da...ich muss sie wohl nur mal in die richtige Reihenfolge bringen.

    Mir brennt jetzt noch eine andere Sache unter den Nägeln und ich beschreibe mal kurz meinen Fall:

    Ich habe den Code nochmal etwas verändert und mich dafür entschieden keine *.txt-Liste mehr zu nutzen, sondern die Abfrage der Rechner direkt per http-request zu erhalten.

    Das funktioniert auch alles schon sehr gut.

    Jetzt lasse ich das Script auf einer virtuellen Maschine laufen und sobald ich auf der Php-Seite einen Rechner erneut abfrage, geht er die Funktion durch und liefert mir auch das entsprechende Ergebnis.

    Ist die Warteliste allerdings leer, erhalte ich immer eine 1 zurück.

    Sobald ich einen weiteren Rechner neu abfrage, erscheint wieder eine 1, dann der entsprechende Rechner und dann wieder die 1.

    Habe ich n Rechner in der Warteliste, erscheint "n" und dann arbeitet das Script die Rechner ab.

    Ich muss also bei den Arrays irgendwelche Fehler gemacht haben.

    Ich unterlege das ganze mal mit Screenshots und aktuellem Code.

    PHP-Vorschau:

    pasted-from-clipboard.png

    Script mit Console:

    pasted-from-clipboard.png

    Aktueller Code:

    AutoIt
    ;-- 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 <WinHttp.au3>
    #include <Array.au3>
    #include <StringConstants.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!")
    
    While 1
    _CheckBootUp()
    WEnd
    
    Func _CheckBootUp()
        Local $hFile
        Local $aRechner = StringSplit(getData(), ",")
        $hFile = FileOpen($g_sLogFile, BitOR($FO_ANSI, $FO_APPEND))
        $oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
        $oHTTP.Open("POST", "http://sdestapp3:89/request.php", False)
        $oHTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
        For $i = 0 to $aRechner[$i]
            ConsoleWrite(@HOUR&":"&@MIN&":"&@SEC&" "&'Ping ' & $aRechner[$i] & " " & @CRLF)
            Ping($aRechner[$i], 300)
            If @error Then
                ConsoleWrite("Offline" & @CRLF)
                FileWrite($hFile, @YEAR&"-"&@MON&"-"&@MDAY&" "&@HOUR&":"&@MIN&":"&@SEC&";"&StringFormat('%s;%s;%s;%s;%s', $aRechner[$i], '', '', 'offline', '')&@CR)
                local $sData = "id=setRechnerdaten&data=" & StringFormat('%s;%s;%s;%s;%s', $aRechner[$i], '', '', 'offline', '')
                $oHTTP.Send($sData)
            Else
                ConsoleWrite("Online" & @CRLF)
                FileWrite($hFile, @YEAR&"-"&@MON&"-"&@MDAY&" "&@HOUR&":"&@MIN&":"&@SEC&";"&StringFormat('%s;%s;%s;%s;%s', $aRechner[$i], _GetUserName($aRechner[$i]),'' , 'online', _GetLastBootUp($aRechner[$i]))&@CR)
                local $sData = "id=setRechnerdaten&data=" & StringFormat('%s;%s;%s;%s;%s', $aRechner[$i], _GetUserName($aRechner[$i]),'' , 'online', _GetLastBootUp($aRechner[$i]))
                $oHTTP.Send($sData)
                if (@error) Then
                    Exit
                EndIf
            EndIf
        Next
        FileClose($hFile)
    ;~     MsgBox(BitOR($MB_ICONINFORMATION, $MB_SYSTEMMODAL, $MB_TOPMOST), @ScriptName, "Fertig",1)
    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 _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
        Return 'kein Benutzer angemeldet'
    EndFunc   ;==>_GetUserName
    
    Func _Exit()
        Exit
    EndFunc   ;==>_Exit
    
    func getData()
        $oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
        $oHTTP.Open("Post", "http://sdestapp3:89/request.php", False)
        $oHTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
        $sData = "id=getRechner"
        $oHTTP.Send($sData)
                if (@error) Then
                    Exit
                EndIf
        If $oHTTP.Status = $HTTP_STATUS_OK Then
            Return $oHTTP.ResponseText
        Else
            Return False
        EndIf
    EndFunc ;getData()
    Alles anzeigen
  • Start, Logon, Logoff und Shutdown

    • Lashandan
    • 15. März 2018 um 14:40

    Habe folgendes Ergebnis auf der Teststellung erhalten:

    Für die Testzwecke, lautet der Pfad leicht anders:

    Code
    HKCU\SOFTWARE\pSAG\proalpha-client-test\5.1\proALPHA Session

    pasted-from-clipboard.png

  • Start, Logon, Logoff und Shutdown

    • Lashandan
    • 15. März 2018 um 09:55
    Zitat von Bitnugger

    Das ist nicht wirklich ein Fehler... damit wird dir nur mitgeteilt, dass bereits eine Instanz dieses Dienstes ausgeführt wird!!!

    Teste mal dieses Script...

    Richtig wäre...

    $iError = RunWait(StringFormat('psexec \\\%s -h sc.exe start RemoteRegistry', $sComputerName))

    Habe dein neues Script getestet.

    Leider immer noch ohne das gewünschte Ergebnis.

    Ich habe auch das Gefühl, dass der RemoteRegistry Dienst getriggert wird auf dem/den Zielrechner/n aber danach kein "echtes" Auslesen des Keys stattfindet.

    Bin mittlerweile an dem Punkt, dass ich ein separates Programm auf den Clients ablege und dieses dann auf Anfrage den Key ausließt und zurück schreibt.

    TheDeath24

    Willkommen im Thema ;)

    CheckMK ist eine feine Sache und wir planen auch es in Betrieb zu nehmen - allerdings für ein breiteres Monitoring.

    Was ich allerdings schaffen will, ist eine einfache Webansicht mit allen Rechnern, die online sind, mit den dazugehörigen Benutzern etc.

    Somit kannst du pfeilschnell den Rechner finden und musst dich nicht erst durch CheckMK wuseln.

    Aber dennoch Danke für deinen Beitrag - CheckMK ist wirklich ein geniales Tool.

  • Start, Logon, Logoff und Shutdown

    • Lashandan
    • 13. März 2018 um 09:39
    Zitat von chesstiger

    Windows hat aus Kompatibilitätsgründen zwei separate "Ansichten" für die Registry. Das hängt mit 32/64 Bit zusammen. Wenn der Registry-Eintrag von einem 64-Bit-Programm ist, könnte dir eventuell helfen, dein AutoIt-Skript auch als 64 Bit auszuführen.

    Hey Chesstiger, vielen Dank für den Hinweis.

    Derzeit kann ich aber sagen, dass wir vor der nächsten Migration noch komplett mit einer 32Bit Umgebung in diesem Programm unterwegs sind.


    Zitat von Bitnugger

    Dann ändere mal die Zeile 95 in dem Script aus Post #28.

    AutoIt
    $sUserID = RegRead("\\" & $sComputerName & "\HKCU64\SOFTWARE\pSAG\proalpha-client-production\5.1\proALPHA Session", "UserID")
    ; oder so...
    $sUserID = RegRead("\\" & $sComputerName & (@OSArch = "X86" ? "\HKCU" : "\HKCU64") & "\SOFTWARE\pSAG\proalpha-client-production\5.1\proALPHA Session", "UserID")

    Auch wieder Danke an dich Bitnugger für deine viele Mühe und Geduld.

    Ich komme aber leider noch immer nicht zu dem gewünschten Ergebnis.

    Ich habe den Code nochmal ein kleines bisschen abgeändert:

    AutoIt
    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 -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
    Alles anzeigen

    Denn wenn ich es händisch über die Konsole eingebe, verzichte ich auf die Eingabe von UserName und Passwort.

    Das habe ich jetzt mal an das Script so übergeben.

    Nach dem Kompilieren, kommt ganz normal das Konsolenfenster hoch und die Abfrage des ersten Rechners startet.

    Nun kommt folgende Fehlermeldung.

    pasted-from-clipboard.png

    Ich bin mir einfach nicht sicher, ob das alles richtig läuft.

    So langsam gebe ich die Hoffnung auf, jemals an die gewünschte Information zu kommen...

  • Start, Logon, Logoff und Shutdown

    • Lashandan
    • 12. März 2018 um 14:22
    Zitat von Bitnugger

    Hier ein Beispiel, wie es bei mir funktioniert:

    Rechnername: ILLUMINATI

    IP-Adresse: 192.168.178.26

    psexec \\ILLUMINATI -h sc.exe start RemoteRegistry

    Habe es jetzt so mal in die Konsole eingegeben und komme damit zu einem Ergebnis

    pasted-from-clipboard.png

    Wenn ich nun das Script ausführe, kommt allerdings einer der Fehler:

    Code
    2018-03-12 14:10:12 : Rechnername            : Benutzername        : pSAG nicht installiert!    : 2018-03-12 07:44:41

    Ich kann aber mit einer Gewissheit von 100% sagen, dass das Programm installiert ist und auch der Eintrag in der Registry vorhanden ist.

    Hast du noch eine Ahnung, woran es liegen könnte?

  • Start, Logon, Logoff und Shutdown

    • Lashandan
    • 12. März 2018 um 11:16

    Ich habe jetzt noch folgenden Schritt unternommen:

    ich habe die PSTools unter System32 abgelegt, sodass ich sie bequemer über die Konsole aufrufen kann.

    Dann gebe ich folgendes ein:

    Code
    psexec \\RECHNERNAME -h sc.exe start RemoteRegistry

    Danach erscheint die Meldung:

    Code
    [SC] StartService FEHLER 1058:
    
    Der angegebene Dienst kann nicht gestartet werden. Er ist deaktiviert oder nicht mit aktivierten Geräten verbunden.
    
    sc.exe exited on RECHNERNAME with error code 1058.

    Vielleicht hilft das noch?

  • Start, Logon, Logoff und Shutdown

    • Lashandan
    • 12. März 2018 um 09:40
    Zitat von Lashandan

    Leider kommt die Abfrage von Benutzername etc. nicht hoch und wenn ich die Credentials direkt im Script hinterlege dann kommt es ebenfalls zu Fehlern.

    Code
    psexec (start) Error = 1326!

    Vielleicht noch was zu den Credentials:

    $sComputerName = 'Rechnername@Domain' 'Domain\Rechnername' 'Rechnername' 'Domain.Rechnername'

    $sUserName = 'Benutzername'

    $sPasswort = 'Passwort'

    leider kommt bei allen Varianten der selbe Fehler

  • Start, Logon, Logoff und Shutdown

    • Lashandan
    • 12. März 2018 um 09:01
    Zitat von Bitnugger

    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

    Wieder einmal vielen Dank für deine ausführliche Beschreibung.

    Lösung 3 ist tatsächlich auch die einzige, die für meinen Fall wirklich in Frage kommen wird.

    Allerdings habe ich noch Probleme mit dem Script.

    Leider kommt die Abfrage von Benutzername etc. nicht hoch und wenn ich die Credentials direkt im Script hinterlege dann kommt es ebenfalls zu Fehlern.

    Code
    psexec (start) Error = 1326!

    Und dann musst du mir bitte noch verraten, wie ich die Lösung 3 permanent hinterlegen kann.

    Habe versucht über die Konsole den Befehl psexec \\... auszuführen aber es bricht dann doch sehr schnell ab.

  • Start, Logon, Logoff und Shutdown

    • Lashandan
    • 7. März 2018 um 07:53

    Vielen Dank für die Erklärung und den Code.

    Allerdings habe ich jetzt ein kleines Problem bei dem Ergebnis.

    Das Script sollte eigentlich den Registry-Eintrag von jedem abzufragenden Rechner auslesen und zurückgeben.

    Aktuell, liest es nur meinen Registry-Eintrag aus und gibt für alle Rechner den selben Anmelder zurück.

    Wie löse ich das Problem?

  • Start, Logon, Logoff und Shutdown

    • Lashandan
    • 6. März 2018 um 09:23

    Tausend Dank dafür!

    Ich brauche wahrscheinlich noch eine ganze Weile um deinen gesamten Code zu verstehen.

    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?

    Und dann habe ich noch eine abschließende Frage.

    Kannst du evtl. noch folgenden Code einbauen und noch zusätzlich in der Datei (als extra Spalte) ausgeben lassen?

    AutoIt
    func getRegData()
        Local $sRegData = RegRead("HKEY_CURRENT_USER\SOFTWARE\pSAG\proalpha-client-production\5.1\proALPHA Session", "UserID")
        Return $sRegData
    EndFunc ;getRegData()

    Denn zusätzlich zu dem angemeldeten User, würde ich gern noch wissen, wie der letzte USER der Anmeldung in dem o.g. Programm lautet.

    Es kommt nicht selten vor, dass wir an einem Rechner nur eine Anmeldung haben aber für das Programm dann mehrere USER die sich anmelden.

    Um zum Zeitpunkt X zu ermitteln, welcher User an welchem Rechner arbeitet, ist diese Information ebenfalls von Wichtigkeit.

    Zitat von Bitnugger
    AutoIt
    ;-- 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
  • Start, Logon, Logoff und Shutdown

    • Lashandan
    • 2. März 2018 um 07:35

    Also mein Ziel ist es ja, den User mit in die Fileausgabe zu packen.

    Im nachfolgenden Code, hatte ich die Zeile mit "_FileWriteLog()" als die Stelle ausgemacht, die das Ausgabefile mit Daten versorgt.

    Aber mir ist es nicht möglich, aus

    AutoIt
    _FileWriteLog($hFile, StringFormat('%-26s : %s', $aRechner[$i], (@error ? 'offline' : _GetLastBootUp($aRechner[$i]))))

    ein einfaches

    AutoIt
    _FileWriteLog($hFile, StringFormat('%-26s : %s', $aRechner[$i], _GetUserName($strClient), (@error ? 'offline' : _GetLastBootUp($aRechner[$i]))))

    zu machen.

    Denn dann werden die nachfolgenden Informationen nicht weitergeschrieben.

    Und ich erhalte immernoch meinen den Username der das Script ausführt (also meinen)

    AutoIt
    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!")
            EndIf
    
        $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
    Alles anzeigen
    Zitat von Bitnugger

    Zeige mal bitte, wie du es versucht hast.

    Hier ein paar Möglichkeiten...

    AutoIt
    ;-- 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
  • Start, Logon, Logoff und Shutdown

    • Lashandan
    • 1. März 2018 um 13:51

    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()

    Zitat von Bitnugger

    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.

    AutoIt: CheckBootUp
    ;-- 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
    Alles anzeigen
  • Start, Logon, Logoff und Shutdown

    • Lashandan
    • 26. Februar 2018 um 15:31

    Sauber Leute!

    Jetzt bekomme ich erstmal eine ganze Liste an Ergebnissen.

    Nun will ich das ganze noch an den Server senden.

    Melde mich gern wieder, sobald ich das fertig habe.

    Hier der aktuelle Code (ohne Codeporn:P:(

    C
    #include <file.au3>
    #include <array.au3>
    #include <AutoItConstants.au3>
    #include <MsgBoxConstants.au3>
    
    #RequireAdmin
    If IsAdmin() Then MsgBox($MB_SYSTEMMODAL, "", "Das Skript läuft mit Adminrechten")
    
    ; Hotkeybelegung "Esctaste"
    HotKeySet("{ESC}", exitApp)
    
    Func exitApp()
        Exit
    EndFunc
    
    Global $sCount        = 1
    Global $sComputer     = getRow($sCount)
    
    structure()
    
    func getRow($sLine)
        $sDateiName = @ScriptDir &"\rechnerliste.txt"
        Local $hOpenFile = FileOpen($sDateiName, $FO_READ)
        if $hOpenFile = -1 Then
            Return False
        EndIf
        Local $sFileRead = FileReadLine($hOpenFile,$sLine)
        Return($sFileRead)
        FileClose($hOpenFile)
    EndFunc ;getRow()
    
     func hasRows($hFilehandle)
         ; sind überhaupt Zeilen vorhanden
         $sFileRead = FileReadLine($hFilehandle)
         if @error = -1 Then
             Return False
         Else
             Return True
         EndIf
     EndFunc ;hasRows()
    
    func structure()
        Local $sLine            = 1
        Local $sPath            = "\Windows\Skripte\"
        Local $sDateiName         = @ScriptDir &"\rechner.txt"
        Local $sDateiAusgabe    = @ScriptDir &"\ausgabe.txt"
        Local $hFilehandle         = FileOpen($sDateiName, $FO_UTF8)
    ;~     Local $hFileAusgabe        = FileOpen($sDateiAusgabe, $FO_UTF8 & $FO_APPEND)
    
        $sCount = 1
    
        While hasRows($hFilehandle)
            Local $sComputer     = getRow($sCount)
            Local $iPing         = Ping($sComputer, 300)
            If $iPing Then
                Local $hFileAusgabe        = FileOpen($sDateiAusgabe, $FO_UTF8 & $FO_APPEND)
                FileWrite($hFileAusgabe, $sComputer&";"&_GetLastBootUp($sComputer)&@CR)
                FileClose($hFileAusgabe)
    ;~             MsgBox(64, "Next", "Next-->"&$sComputer,1)
            Else
                Local $hFileAusgabe        = FileOpen($sDateiAusgabe, $FO_UTF8 & $FO_APPEND)
                FileWrite($hFileAusgabe, $sComputer&";"&"offline"&@CR)
                FileClose($hFileAusgabe)
    ;~             MsgBox(64, "Next", "Next-->"&$sComputer,1)
            EndIf
            $sCount = $sCount +1
            WEnd
        MsgBox(64, "Hinweis", "Fertig",-1)
    
    EndFunc ;structure()
    
    Func _GetLastBootUp($_sComputer=$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 StringRegExpReplace($sBootup, '(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2}).+', '\1-\2-\3 \4:\5:\6')
    EndFunc
    Alles anzeigen
  • Start, Logon, Logoff und Shutdown

    • Lashandan
    • 26. Februar 2018 um 11:56
    Zitat von BugFix

    Kann es sein, dass der WMI-Dienst bei dir nicht gestartet ist?

    Frag das mal ab mit: sc query winmgmt

    Wenn nicht aktiviert, starte mit: sc start winmgmt

    Der Dienst ist aktiv.


    Zitat von BananaJoe

    Mach mal die beiden -1 in der MsgBox(64, "BootUp", _GetLastBootUp(), -1, -1) raus , so daß nur noch MsgBox(64, "BootUp", _GetLastBootUp()) da steht.

    :Face:es lag echt an den -1,-1 Werten :Face:

    So ein dummer Fehler meinerseits!

    Danke für die Hinweise und eure Geduld :)

    Ich bastel jetzt mal alles zusammen und melde mich dann nochmal mit neuen Erkenntnissen oder wahlweise auch noch Fragen;)

  • Start, Logon, Logoff und Shutdown

    • Lashandan
    • 26. Februar 2018 um 10:36
    Zitat von BugFix

    Bei Abfrage des lokalen PC ist der Name vorbelegt (.). Es reicht also _GetLastBootUp(). Nur für andere PC im Netzwerk ist der PC-Name mit zu übergeben.

    Auf meinem PC (Win7 Pro x64) funktioniert es, wie gewollt.

    Netzzugriff kann ich mangels anderer Netzwerk-PC nicht testen. Jedoch muss in der Windows Firewall WMI eingehend zugelassen werden.

    - abfragen: netsh advfirewall firewall show rule name="Windows-Verwaltungsinstrumentation (WMI eingehend)"

    - erlauben: netsh advfirewall firewall set rule group="Windows-Verwaltungsinstrumentation (WMI)" new enable=yes

    Also ich habe die Funktion jetzt mal 1:1 eingesetzt und wollte sie für meinen Rechner testen.

    Habe mir dazu nur noch eine MsgBox erstellt...leider bekomme ich kein Ergebnis und keine Anzeige.

    Wo liegt mein Fehler?

    Code
    _GetLastBootUp()
    
    MsgBox(64, "BootUp", _GetLastBootUp(), -1, -1)
    
    Func _GetLastBootUp($_sComputer=".")
        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 StringRegExpReplace($sBootup, '(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2}).+', '\1-\2-\3 \4:\5:\6')
    EndFunc
    Alles anzeigen
  • Start, Logon, Logoff und Shutdown

    • Lashandan
    • 26. Februar 2018 um 07:50
    Zitat von BugFix

    Würde ich so machen:

    Bei LogOff/ShutDown/Restart:

    http://www.autoitscript.com/autoit3/docs/f…xitRegister.htm

    Bei Startup:

    In der Registry unter HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run führst du bei jedem Start ein Skript aus:

    - Auslesen Startzeit

    AutoIt
    Func _GetLastBootUp($_sComputer='.')
        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 StringRegExpReplace($sBootup, '(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2}).+', '\1-\2-\3 \4:\5:\6')
    EndFunc

    - Auslesen CurrentUser @UserName

    -- beides Eintragen in deine Logdatei

    Die LogOn Info bekommst du doch am Besten serverseitig über AD-Funktionen ausgelesen.

    Alles anzeigen

    BugFix - bekomme dein Script irgendwie nicht zum Laufen - muss ich noch irgendwas mitgeben?

  • Start, Logon, Logoff und Shutdown

    • Lashandan
    • 23. Februar 2018 um 14:24

    Hier mal mein Quellcode dazu.

    C
    #include <FileConstants.au3>
    #include <File.au3>
    #include <MsgBoxConstants.au3>
    #include <StringConstants.au3>
    #include <WinAPIFiles.au3>
    #include <WinHttp.au3>
    
    Global $iMaxRetry = 3
    ;~ Global $oMyError = ObjEvent("AutoIt.Error","MyErrFunc")
    Global $sEventLog = @ScriptDir &"\Eventlog.txt"
    Global $hEventhandle = FileOpen($sEventLog, $FO_UTF8 & $FO_APPEND)
    Global $commandLine = $CmdLine[1] ;logon logoff start shutdown
    
    ; Hotkeybelegung "Esctaste"
    HotKeySet("{ESC}", exitApp)
    
    Func exitApp()
        Exit
    EndFunc
    
    
    
    writeTxt()
    FileWrite($hEventhandle, @YEAR&"-"&@MON&"-"&@MDAY&" "&@HOUR&":"&@MIN&":"&@SEC&";"&$commandLine&@CR)
    Sleep(1000)
    Start()
    FileClose($hEventhandle)
    
    
    func writeTxt()
        ; Datei liegt im selben Verzeichnis wie das Skript
        $sDateiName         = @ScriptDir &"\log.txt"
        ; Öffnet die Datei - schreibt pro Eintrag eine neue Zeile
        ;~ $hFilehandle = FileOpen($sDateiName, $FO_UTF8 & $FO_OVERWRITE)
        $hFilehandle             = FileOpen($sDateiName, $FO_UTF8 & $FO_APPEND)
        Local $WSHNetwork = ObjCreate("Wscript.Network")
        Local $sUsername = $WSHNetwork.UserName
        Local $cRegData = getRegData()
        Local $cRegUser = getRegUser()
        Local $commandLine = $CmdLine[1] ;logon logoff start shutdown
    ;~     Local $commandLine = "logon"     ;logon logoff start shutdown
         FileWrite($hFilehandle, @Computername&";"&$sUsername&";"&$cRegData&";"&@YEAR&"-"&@MON&"-"&@MDAY&" "&@HOUR&":"&@MIN&":"&@SEC&";"&$commandLine&@CR)
        ; Schließen der Datei
        FileClose($hFilehandle)
    EndFunc ;writeTxt()
    
    func getRegData()
        Local $cRegData = RegRead("HKEY_CURRENT_USER\SOFTWARE\Softwarename", "UserID")
        Return $cRegData
    EndFunc ;getRegData()
    
    func getRegUser()
        Local $cRegUser = RegRead("HKEY_CURRENT_USER\Volatile Environment", "Username")
        Return $cRegUser
    EndFunc ; cRegUser()
    
    func isOnline()
        Local $sIpAdresse = @IPAddress1
    ;~     Local $test = "172.16.86.82"
        Local $sString = StringLeft($sIpAdresse,3)
    
        ; Prüfen, ob die IP-Adresse mit "172" beginnt
        if StringLeft($sIpAdresse,3) = "172" Then
            Return("Online")
        Else
            Exit
            Return("Offline")
        EndIf
    EndFunc ; isOnline()
    
    func Start()
        Local $sIpAdresse = @IPAddress1
    ;~     Local $test = "172.16.86.82"
        Local $sString = StringLeft($sIpAdresse,3)
        ; Prüfen, ob die IP-Adresse mit "172" beginnt
        if StringLeft($sIpAdresse,3) <> "172" Then
            Exit
        EndIf
        ; Statusmeldung (Online/Offline)
        ; Quellverzeichnis öffnen
        $sDateiName = @ScriptDir &"\log.txt"
        $hFilehandle = FileOpen($sDateiName)
    
        ; erste Zeile auslesen
        While hasRows($hFilehandle)
            $sOutput = getRow()
            If sendData($sOutput) Then
                ; Wenn eine Zeile vorhanden ist und der Status "online" ist, lösche die erste Zeile
                deleteFirstRow()
            Else
                $iAttempts = 1
                While $iAttempts <= $iMaxRetry
                    if sendData($sOutput) Then
                        deleteFirstRow()
                        ExitLoop
                    EndIf
                    $iAttempts = $iAttempts +1
                WEnd
                ExitLoop
            EndIf
        WEnd
    EndFunc ; stealData()
    
     func hasRows($hFilehandle)
         ; sind überhaupt Zeilen vorhanden
         $sFileRead = FileReadLine($hFilehandle)
         if @error = -1 Then
             Return False
         Else
             Return True
         EndIf
     EndFunc ;hasRows()
    
    func getRow()
        $sDateiName = @ScriptDir &"\log.txt"
        Local $hOpenFile = FileOpen($sDateiName, $FO_READ)
        if $hOpenFile = -1 Then
            Return False
        EndIf
        $sFileRead = FileReadLine($hOpenFile)
        FileClose($hOpenFile)
        Return($sFileRead)
    EndFunc ;getRow()
    
    func deleteFirstRow()
        $sDateiName = @ScriptDir &"\log.txt"
        _FileWriteToLine($sDateiName, 1, "", 1)
    EndFunc ;deleteFirstRow()
    
    func sendData($sOutput)
        ; Öffnen der Zieldatei
        $sDateiName = @ScriptDir &"\Output.txt"
        $hFilehandle = FileOpen($sDateiName, $FO_UTF8 & $FO_APPEND)
    
        ; Schreibe String in $sDateiName
        FileWrite($hFilehandle, $sOutput&@CR)
    
        ; Schließen der Datei
        FileClose($hFilehandle)
    
        $oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
        $oHTTP.Open("POST", "http://xxx.php", False)
        $oHTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
        $sData = "data="&$sOutput
        $oHTTP.Send($sData)
                if (@error) Then
                    Exit
                EndIf
    
        If $oHTTP.Status = $HTTP_STATUS_OK Then
            Return True
        Else
            Return False
        EndIf
    EndFunc ;sendData()
    Alles anzeigen

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™