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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 673340
Url: https://administrator.de/forum/vbscript-pc-startscript-automatisierung-673340.html
Ausgedruckt am: 14.06.2025 um 12:06 Uhr
9 Kommentare
Neuester Kommentar
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:
----
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
Ich habe Dein Problem mal Grok vorgelegt, hier ist das Ergebnis:
Quelle: Grok KI
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:
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.
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
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:
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.
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
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.checkInterval: Intervall zwischen den Prüfungen (z. B. 1 Minute).
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
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")
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.
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
Gruß
pasu
Schön, dann fehlt nur noch: Wie kann ich einen Beitrag als gelöst markieren?