Habe folgendes Ergebnis auf der Teststellung erhalten:
Für die Testzwecke, lautet der Pfad leicht anders:
Habe folgendes Ergebnis auf der Teststellung erhalten:
Für die Testzwecke, lautet der Pfad leicht anders:
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.
psexec \\INFRA netsh advfirewall firewall set rule group="Windows-Verwaltungsinstrumentation (WMI)" new enable=yes
Beide Ausgaben dann wieder hier posten.
Alles anzeigenWillkommen 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.
Wir nutzen das bei uns in der Firma. Und wir haben extra im Büro einen Fernsehr mit der Weboberfläche von CheckMK, dort dargestellt mit 2 Spalten.
Links: Allgemeine Netzwerkinfos Rechts: PC´s die Online sind und welcher User online ist und wer sich auf dem Terminalserver eingeloggt hat.
Wir haben das seit 2 Jahren und sind immer noch nicht am ende mit einrichten.
Alles anzeigenDu 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.
Codepsexec \\INFRA netsh advfirewall firewall set rule group="Windows-Verwaltungsinstrumentation (WMI)" new enable=yes
Beide Ausgaben dann wieder hier posten.
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:
Script mit Console:
Aktueller Code:
;-- 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
Ohne den Source angesehen zu haben - sozusagen aus der holen Hand : Array [0] = nutzbarer Inhalt und NICHT die Anzahl der im Array benutzten Datensätze --> Schleifendurchlauf = Datensätze -1 ? Oder im Zweifel auch umgekehrt?
Gruß
Peter
StringSplit liefert dir im ersten Index die Anzahl der Splits, wenn du das Flag $STR_NOCOUNT nicht als dritten Parameter mit angibst... in dem Fall sollte Zeile 38 so aussehen...
Hier das korrigierte Script:
;-- TIME_STAMP 2018-03-21 17:23:17 v 0.1
#RequireAdmin
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Change2CUI=y
#AutoIt3Wrapper_Res_requestedExecutionLevel=requireAdministrator
#AutoIt3Wrapper_Add_Constants=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#Region ;**** Includes ****
#include-once
#include <MsgBoxConstants.au3>
#include <StringConstants.au3>
#include <File.au3>
#include <WinHttp.au3>
#EndRegion ;**** Includes ****
If Not IsAdmin() Then Exit MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL, $MB_TOPMOST), @ScriptName, "Das Skript muss mit Adminrechten gestartet werden!")
If Not HotKeySet("{ESC}", _Exit) Then Exit MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL, $MB_TOPMOST), @ScriptName, "Globales HotKey 'ESC' konnte nicht gesetzt werden!")
Global $g_sLogFile = @ScriptDir & "\CheckBootUp.txt"
While 1
_CheckBootUp()
Sleep(1 * 1000) ; 1000 ms = 1 Sekunde
WEnd
Func _CheckBootUp()
Local $oHTTP, $sData, $aRechner, $hFile
$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 Not @error And $oHTTP.Status = $HTTP_STATUS_OK Then Then
$aRechner = StringSplit($oHTTP.ResponseText, ",")
$hFile = FileOpen($g_sLogFile, BitOR($FO_ANSI, $FO_APPEND))
For $i = 1 To $aRechner[0]
If $aRechner[$i] <> '' Then
ConsoleWrite(@HOUR & ":" & @MIN & ":" & @SEC & " " & 'Ping ' & $aRechner[$i] & " " & @CRLF)
Ping($aRechner[$i], 300)
If @error Then
ConsoleWrite("Offline" & @CRLF)
FileWrite($hFile, StringFormat('%s-%s-%s %s:%s:%s\t%s;%s;%s;%s;%s', _
@YEAR, @MON, @MDAY, @HOUR, @MIN, @SEC, $aRechner[$i], '', '', 'offline', '') & @CRLF)
$sData = StringFormat('id=setRechnerdaten&data=%s;%s;%s;%s;%s', $aRechner[$i], '', '', 'offline', '')
Else
ConsoleWrite("Online" & @CRLF)
FileWrite($hFile, StringFormat('%s-%s-%s %s:%s:%s\t%s;%s;%s;%s;%s', _
@YEAR, @MON, @MDAY, @HOUR, @MIN, @SEC, $aRechner[$i], _GetUserName($aRechner[$i]), '', 'online', _GetLastBootUp($aRechner[$i])) & @CRLF)
$sData = StringFormat('id=setRechnerdaten&data=%s;%s;%s;%s;%s', $aRechner[$i], _GetUserName($aRechner[$i]), '', 'online', _GetLastBootUp($aRechner[$i]))
EndIf
$oHTTP.Send($sData)
EndIf
Next
FileClose($hFile)
EndIf
EndFunc ;==>_CheckBootUp
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
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}).+'\d, '\1-\2-\3 \4:\5:\6'\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
Alles anzeigen
For $i = 0 To $aRechner[0]
Wenn in [0] die Anzahl steht dann meinst du doch sicherlich For $i = 1 To $aRechner[0].
Wenn in [0] die Anzahl steht dann meinst du doch sicherlich For $i = 1 To $aRechner[0].
Ja, habe es bereits gesehen und korrigiert... im Script hatte ich es aber richtig.
Hey Leute,
vielen Dank für die super Unterstützung.
Ein riesen Dank geht raus an Bitnugger, für die Geduld, die tollen Erklärungen und astreinen Codes!
Was soll ich sagen, es funktioniert jetzt so wie es soll und ich bin sehr glücklich.
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