bkl157

VBScript - Startscript

Hallo und Guten Morgen in die Runde.

Da sich meine VBScript - Kenntnisse leider auf einem bescheidenen Stand befinden, bitte ich um Unterstützung bei der Anpassung / Erweiterung dieses Anmeldescripts.

Ziel ist es den PC automatisiert, bei nicht erreichen beider „checkPC01 + checkPC02“ Ip-Adressen, herunterzufahren.

1. PC startete automaisch (Bioseinstellung)
2. VBA Startscript wird über Autostart abgerufen
3. es sollte eine kontinuierliche Prüfung auf Erreichbarkeit beider IP’s stattfinden
4. so bald beide IP’s zusammen über einen Zeitraum von x Minuten nicht erreichbar sind, sollte PC herunterfahren

Vielen Dank im Voraus


Set WSHShell = WScript.CreateObject("WScript.Shell")  

Dim checkPC01, checkPC02
Dim objResult
' Überprüfungsrechner  
checkPC01 = "192.xxx.xxx.xxx"		'PC01  
checkPC02 = "192.xxx.xxx.xxx"		'PC02  

' Überprüfe ob checkPC01 online ist  
Do Until Ping_Network(checkPC01)
	objResult = WSHShell.sendkeys("{NUMLOCK}{NUMLOCK}")  
	WScript.Sleep(60000)	' Eine Minute warten		  
Loop
' checkPC01 ist online  
WScript.Sleep(60000)	' Warte eine weitere Minute  


' Überprüfe ob checkPC02 online ist  
Do Until Ping_Network(checkPC02)
	objResult = WSHShell.sendkeys("{NUMLOCK}{NUMLOCK}")  
	WScript.Sleep(60000)	' Eine Minute warten  
Loop
' checkPC02 ist online  
WScript.Sleep(60000)	' Eine Minute warten  


' Einschlafen verhindern...  
Do While Ping_Network(checkPC01)	'...solange der checkPC01 online ist  
	If Ping_Network(checkPC02)= False Then	' checkPC02 ist offline gegangen  
		Do Until Ping_Network(checkPC02)	' Überprüfe fortwährend ob checkPC02 online ist  
			objResult = WSHShell.sendkeys("{NUMLOCK}{NUMLOCK}")	' Aktion ausführen  
			WScript.Sleep(60000)	' Eine Minute warten  
		Loop
		' checkPC02 ist online  
		WScript.Sleep(60000)	' Eine Minute warten, bis alle Dienste geladen sind  
	Else
		objResult = WSHShell.sendkeys("{NUMLOCK}{NUMLOCK}")	' Aktion ausführen  
	End If
	Wscript.Sleep(300000)	' Fünf Minuten warten  
Loop

' checkPC01 ist nicht mehr online => PC herunterfahren  
Dim strShutdown
' -s = shutdown, -t 10 = 10 Sekunden, -f = Proramm beenden erzwungen  
strShutdown = "shutdown.exe -s -t 10 -f"  
WSHShell.Run strShutdown, 0, false

Function Ping_Network(sHost)    
	Dim oPing, oRetStatus
	Set oPing = GetObject("winmgmts:").ExecQuery ("select * from Win32_PingStatus where address = '" & sHost & "'")  
	For Each oRetStatus In oPing
		If IsNull(oRetStatus.StatusCode) Or oRetStatus.StatusCode <> 0 Then
			Ping_Network= False 
		Else
			Ping_Network= True
		End If
	Next
	Set oPing = Nothing
End Function
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 673340

Url: https://administrator.de/forum/vbscript-pc-startscript-automatisierung-673340.html

Ausgedruckt am: 14.06.2025 um 12:06 Uhr

pasu69
Lösung pasu69 12.06.2025 um 11:03:41 Uhr
Goto Top
Ich habe keine Ahnung vom Scripten, bin aber gerade vollkommen fasziniert von diversen KI.
Ich habe Dein Problem mal Grok vorgelegt, hier ist das Ergebnis:

Das Skript hat einige Probleme und erfüllt nicht vollständig die Anforderungen, insbesondere die Bedingung, dass der PC heruntergefahren wird, wenn beide IP-Adressen über einen bestimmten Zeitraum (x Minuten) nicht erreichbar sind. Hier ist eine Analyse und eine überarbeitete Version des Skripts:
Probleme im aktuellen Skript:
Logikfehler bei der Prüfung beider IPs:
Das Skript prüft checkPC01 und checkPC02 nacheinander in separaten Schleifen. Es gibt keine Logik, die überprüft, ob beide IPs gleichzeitig nicht erreichbar sind über einen definierten Zeitraum.

Der Shutdown erfolgt sofort, sobald checkPC01 nicht mehr erreichbar ist, ohne checkPC02 oder einen Zeitraum zu berücksichtigen.

Fehlende Zeitraumprüfung:
Es gibt keinen Mechanismus, der die Nicht-Erreichbarkeit beider IPs über einen Zeitraum von x Minuten überprüft.

Unnötige NUMLOCK-Aktion:
Das Skript verwendet sendkeys("{NUMLOCK}{NUMLOCK}"), vermutlich um den Bildschirmschoner oder Energiesparmodus zu verhindern. Dies ist jedoch keine zuverlässige Methode, da es hardwareabhängig ist und nicht immer funktioniert.

Schleifenstruktur:
Die Schleifenstruktur ist ineffizient und schwer zu warten. Sie prüft die IPs nacheinander, anstatt eine kombinierte Prüfung durchzuführen.

Fehlende Fehlerbehandlung:
Das Skript berücksichtigt keine Ausnahmen (z. B. Netzwerkprobleme oder ungültige IPs).

Timeout für Shutdown:
Der Shutdown-Befehl wird ohne Prüfung der Dauer der Nicht-Erreichbarkeit ausgeführt.

Anforderungen:
Der PC startet automatisch (via BIOS, nicht Teil des Skripts).

Ein VBA-Skript (bzw. VBS in diesem Fall) wird über Autostart ausgeführt.

Kontinuierliche Prüfung der Erreichbarkeit von checkPC01 und checkPC02.

Shutdown, wenn beide IPs über einen Zeitraum von x Minuten nicht erreichbar sind.

Überarbeitetes Skript:
Das folgende VBS-Skript löst die Probleme und erfüllt die Anforderungen:
Option Explicit
Dim WSHShell, checkPC01, checkPC02, objResult
Dim maxOfflineMinutes, offlineCounter, checkInterval

' Konfiguration  
checkPC01 = "192.168.1.100" ' IP-Adresse von PC01  
checkPC02 = "192.168.1.101" ' IP-Adresse von PC02  
maxOfflineMinutes = 5       ' Zeitraum in Minuten, nach dem Shutdown erfolgt  
checkInterval = 60000       ' Prüfintervall in Millisekunden (1 Minute)  

Set WSHShell = WScript.CreateObject("WScript.Shell")  
offlineCounter = 0 ' Zähler für Minuten, in denen beide IPs offline sind  

' Hauptprüfschleife  
Do
    If Not (Ping_Network(checkPC01) And Ping_Network(checkPC02)) Then
        ' Beide IPs sind nicht erreichbar  
        offlineCounter = offlineCounter + 1
        If offlineCounter >= maxOfflineMinutes Then
            ' Shutdown, wenn beide IPs für maxOfflineMinutes nicht erreichbar sind  
            Dim strShutdown
            strShutdown = "shutdown.exe -s -t 10 -f"  
            WSHShell.Run strShutdown, 0, False
            WScript.Quit
        End If
    Else
        ' Mindestens eine IP ist erreichbar, Zähler zurücksetzen  
        offlineCounter = 0
    End If
    
    ' Bildschirmschoner verhindern (optional, alternative Methode)  
    WSHShell.Run "cmd.exe /c echo . | clip", 0, True ' Alternative zu NUMLOCK  
    
    WScript.Sleep checkInterval ' Wartezeit zwischen Prüfungen  
Loop

' Funktion zur Netzwerkprüfung  
Function Ping_Network(sHost)
    Dim oPing, oRetStatus
    Set oPing = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery _  
        ("SELECT * FROM Win32_PingStatus WHERE Address = '" & sHost & "'")  
    For Each oRetStatus In oPing
        If IsNull(oRetStatus.StatusCode) Or oRetStatus.StatusCode <> 0 Then
            Ping_Network = False
        Else
            Ping_Network = True
        End If
    Next
    Set oPing = Nothing
End Function

Verbesserungen im neuen Skript:
Kombinierte Prüfung beider IPs:
Das Skript prüft in einer Schleife, ob beide IPs gleichzeitig erreichbar sind (Ping_Network(checkPC01) And Ping_Network(checkPC02)). Wenn nicht, wird ein Zähler (offlineCounter) erhöht.

Zeitraumprüfung:
Der offlineCounter zählt die Minuten, in denen beide IPs nicht erreichbar sind. Wenn dieser die eingestellte Zeit (maxOfflineMinutes) erreicht, wird der Shutdown ausgelöst.

Konfigurierbare Parameter:
maxOfflineMinutes: Zeitraum, nach dem der Shutdown erfolgt (z. B. 5 Minuten).

checkInterval: Intervall zwischen den Prüfungen (z. B. 1 Minute).

Alternative zu NUMLOCK:
Statt sendkeys wird ein harmloser Befehl (clip) ausgeführt, um den Energiesparmodus zu verhindern. Dies ist zuverlässiger und weniger invasiv.

Einfachere Struktur:
Eine einzige Schleife prüft beide IPs und handhabt die Logik, was den Code übersichtlicher macht.

Fehlerbehandlung:
Die Ping_Network-Funktion bleibt robust, und die Schleife ist so gestaltet, dass sie stabil läuft.

Hinweise zur Nutzung:
IP-Adressen anpassen: Ersetze checkPC01 und checkPC02 durch die tatsächlichen IP-Adressen.

Zeitraum anpassen: Stelle maxOfflineMinutes auf den gewünschten Zeitraum ein.

Autostart einrichten: Speichere das Skript als .vbs-Datei (z. B. shutdown_check.vbs) und füge es zum Autostart hinzu (z. B. unter C:\Users\[Benutzer]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup).

Testen: Teste das Skript in einer kontrollierten Umgebung, um sicherzustellen, dass der Shutdown korrekt ausgelöst wird.
----

Mich würde wirklich interessieren, ob das KI generierte Script so in Ordnung ist? Ich habe die Tage viele Windows und Linux Scripts erstellen lassen, die alle wunderbar funktionieren und bin echt verblüfft.

Schöne Restwoche
pasu
BKL157
BKL157 12.06.2025 um 11:21:24 Uhr
Goto Top
Vielen Dank für deine Mühe - Ich werde es nachher mal Testen und gebe hier Rückinfo.
Grok - > Ok, habe da noch diverse andere offene Anfragen face-smile
DivideByZero
DivideByZero 12.06.2025 um 12:36:08 Uhr
Goto Top
Moin,

inzwischen sind KIs da wirklich weit vorne, damit dann ggf. auch testen. Idealerweise versteht man aber wenigstens ein bisschen was von dem, was da so vor sich geht oder fragt die KI danach, das Skript ausführlich zu dokumentieren/ zu erläutern.

Denn in Deinem Skript ist direkt der erste Loop infinite:
' Überprüfe ob checkPC01 online ist    
Do Until Ping_Network(checkPC01)
	objResult = WSHShell.sendkeys("{NUMLOCK}{NUMLOCK}")    
	WScript.Sleep(60000)	' Eine Minute warten		    
Loop

Hier wird in eine Schleife eingetrefen und solange gewartet, bis PC01 per Ping erreichbar ist. Was aber, wenn PC01, aus welchen Gründen auch immer, nicht läuft? Dann hängt das Skript da den ganzen Tag/ auf ewig und läuft nicht weiter. Heruntergefahren wird dann auch nichts, weil die Exit-Bedingung ("Until Ping_Network(checkPC01)") gar nicht erfüllt wird.

Was Grok da so baut, ist interessant, aber auch nicht fehlerfrei.

shutdown -f: siehe learn.microsoft.com/de-de/windows-server/administration/windows-commands/shutdown.
-f = force, der Shutdown kann zum Datenverlust führen, da nicht gewartet wird, wenn wichtige Prozesse länger brauchen, um erst ihre Daten zu schreiben. Sofern nicht gewollt, sollte der Parameter daher weggelassen werden.

maxOfflineMinutes: Zeitraum, nach dem der Shutdown erfolgt (z. B. 5 Minuten).
checkInterval: Intervall zwischen den Prüfungen (z. B. 1 Minute).
Die Beschreibung ist falsch. maxOfflineMinutes ist das dort definierte Vielfache von checkInterval. Wenn checkInterval auf 120000 = 2 Minuten gesetzt wird, maxOfflineMinutes bei 5 bleibt, dann wird 5*2 = 10 Minuten gewartet.

Das nur auf die Schnelle als Beispiel, warum KI super ist, wenn man nicht programmieren kann, aber warum zugleich das Ergebnis immer hinterfragt und überprüft werden sollte - und wenn das mangels know-how nicht geht, dann wenigstens intensiv getestet.

Gruß

DivideByZero
BKL157
BKL157 12.06.2025 aktualisiert um 12:42:54 Uhr
Goto Top
leider erhalte ich beim Start des Scrips folgenden Fehler:

Zeile: 3
Zeichen: 1
Fehler: Anweisung erwartet
Code: 8000A0400
Quelle: Kompilierungsfehler in MS VBScript
BKL157
BKL157 12.06.2025 aktualisiert um 12:53:06 Uhr
Goto Top
@DivideByZero - Danke für die Informationen und das Aufzeigen der Punkte
DivideByZero
DivideByZero 12.06.2025 um 13:11:24 Uhr
Goto Top
leider erhalte ich beim Start des Scrips folgenden Fehler:

Was immer Du da machst, das Skript ist es nicht 😉
Alles in eine Textdatei kopieren, als test.vbs abspeichern, wscript test.vbs auf der Kommandozeile zum Testen.

Du kannst eine MessageBox einblenden lassen, damit Du siehst, da passiert etwas, z.B.

' Hauptprüfschleife    
Do
    MsgBox("pinge PCs")  
    If Not (PingSSR(checkPC01) And PingSSR(checkPC02)) Then
        ' Beide IPs sind nicht erreichbar    
        MsgBox("Beide IPs sind nicht erreichbar")  
pasu69
pasu69 12.06.2025 um 15:14:35 Uhr
Goto Top
Zitat von @DivideByZero:

Das nur auf die Schnelle als Beispiel, warum KI super ist, wenn man nicht programmieren kann, aber warum zugleich das Ergebnis immer hinterfragt und überprüft werden sollte - und wenn das mangels know-how nicht geht, dann wenigstens intensiv getestet.


Ich finde es schon faszinierend, wie weit die sind. Vor allem, weil man dann auch die auftauchenden Fehler weiter analysieren lassen kann und das Script dann angepasst wird. Wenn ich bedenke, wie viel man dafür googlen müsste, spart das immens Zeit, vor allem für Leute wie mich, die schlichtweg nicht programmieren können (und auch kein Interesse daran haben, es zu lernen face-smile).

Gruß
pasu
BKL157
BKL157 12.06.2025 um 15:46:45 Uhr
Goto Top
Vielen Dank zusammen - hat alles geklappt (Fehlermeldung saß vor diem Bildschirm face-smile
DivideByZero
DivideByZero 12.06.2025 um 16:01:06 Uhr
Goto Top