sarekhl
Goto Top

Batch oder VBS: Solange Pausieren, bis Ping auf eine bestimmte Adresse erfolgreich ist

Hallo zusammen,

ich suche einen Codeschnipsel entweder für eine Batch- oder für eine VBA-Datei, die eine Schleife solange ausführt, bis eine bestimmte Adresse per Ping erreichbar ist. Konkret möchte ich das in ein beim PC-Start (vor der Anmeldung) auszuführendes Script einbauen, um sicherzustellen, dass der Server erreichbar ist, bevor bei der Anmeldung versucht wird, das servergespeicherte Profil zu laden.


Danke im Voraus,
Sarek \\/_

Content-ID: 282601

Url: https://administrator.de/contentid/282601

Ausgedruckt am: 25.11.2024 um 21:11 Uhr

emeriks
emeriks 11.09.2015 um 09:55:15 Uhr
Goto Top
Hi,
mit Laserkanonen auf Klingonen Spatzen schießen face-wink

Warum nicht einfach per GPO einstellen "Immer auf das Netzwerk warten"?
GPO: Bei Anmeldung auf Netzwerk warten

E.
beidermachtvongreyscull
Lösung beidermachtvongreyscull 11.09.2015 aktualisiert um 10:11:21 Uhr
Goto Top
Was soll denn Dein Script machen?

Kollege emeriks hat schon Recht mit seiner Möglichkeit.
Dabei bleibt der Client aber im Ganzen stehen, bis eine bestimmte Zeit zur Richtlinienverarbeitung abgelaufen ist.

Wenn Du das Script als Login_Script hinterlegst, kannst Du das so bauen, dass der Rechner dennoch weiter in betriebsbereiten Zustand geht, und alles andere per Script nachholt, wenn der gewünschte Server online ist.
Winfried-HH
Winfried-HH 11.09.2015 aktualisiert um 10:08:08 Uhr
Goto Top
Zitat von @emeriks:

Warum nicht einfach per GPO einstellen "Immer auf das Netzwerk warten"?
GPO: Bei Anmeldung auf Netzwerk warten

Vielleicht weil das nicht richtig funktioniert. Hier ist auch erklärt, warum nicht.

Ich hatte das Problem auch schon mal .. also an den Script wäre ich auch interessiert
emeriks
emeriks 11.09.2015 um 10:10:27 Uhr
Goto Top
Dabei bleibt der Client aber im Ganzen stehen, bis eine bestimmte Zeit zur Richtlinienverarbeitung abgelaufen ist.
Stimmt so nicht. Der Client wartet nur mit seiner eigenen GPO-Verarbeitung und erlaubt Anmeldungen erst, wenn das Netz steht. Wobei es auch hier sicher ein max. Timeout gibt.

Weil das nicht richtig funktioniert. Hier ist auch erklärt, warum nicht.
Auch diese Aussage ist - absolut getroffen - falsch. Es funktioneirt tadellos in vielen unserer Umgebungen und das schon seit Jahren bei unterschiedlichen Betriebssystemen.
emeriks
emeriks 11.09.2015 um 10:12:18 Uhr
Goto Top
Weiterhin:
Wenn das über das Script funktionieren soll, dann müsste man konsequenterweise auf synchrone Scriptbearbeitung im Vordergrund umschalten, was ganz sicher nicht zur Performancesteigerung beim Startup- und Anmeldeprozess führt. Nicht zu empfehlen.
SarekHL
SarekHL 11.09.2015 um 10:17:47 Uhr
Goto Top
Zitat von @beidermachtvongreyscull:

Was soll denn Dein Script machen?

Einfach in einer Schleife bleiben bis der Server anpingbar ist. "Stehenbleiben" darf die Kiste dabei natürlich nicht, er soll ja die Netzwerkinitialisierung fortsetzen.

Wenn Du das Script als Login_Script hinterlegst, kannst Du das so bauen, dass der Rechner dennoch weiter in betriebsbereiten Zustand geht, und alles andere per Script nachholt, wenn der gewünschte Server online ist.

Also Login-Script wäre das vermutlich zu spät. Wenn er beim Login den Server nicht erreicht, meldet er sich mit einem temporären Profil an. Das will ich ja gerade nicht.


Zitat von @emeriks:

Auch diese Aussage ist - absolut getroffen - falsch. Es funktioneirt tadellos in vielen unserer Umgebungen und das schon seit Jahren bei unterschiedlichen Betriebssystemen.

Nun ja, offenbar muss es aber nicht funktionieren. Und wenn Stefan vom MCSE-Board und Winfried von hier die gleichen Probleme haben, scheint es auch nicht an mir zu liegen, dass es nicht geht.
SarekHL
SarekHL 11.09.2015 aktualisiert um 10:22:51 Uhr
Goto Top
Zitat von @emeriks:

Weiterhin:
Wenn das über das Script funktionieren soll, dann müsste man konsequenterweise auf synchrone Scriptbearbeitung im Vordergrund umschalten, was ganz sicher nicht zur Performancesteigerung beim Startup- und Anmeldeprozess führt. Nicht zu empfehlen.

Das stört nicht. Es geht um Schaufenster-PCs. Die starten morgens um 5 Uhr von alleine. Viel schlimmer ist es, wenn da ein temporäreres Profil geladen wird, dann klappt nämlich die gesamte Anzeige nicht.

Also noch einmal die Frage, vor allem an unsere Scripter: Wie müsste ein solches Script aussehen? Statt hier umfangreich zu begründen, dass das keine gute Lösung ist, lasst es mich doch einfach mal testen. Manchmal ist eine allgemein schlechte Lösung (weil sie z.B. die Performance drückt) in bestimmten Situationen (wenn es z.B. gar nicht auf Performance ankommt) doch ganz ok.
emeriks
emeriks 11.09.2015 um 10:25:54 Uhr
Goto Top
Na ja, wenn man richtig liest ...
Es funktioniert defacto.

Du schreibst "bis eine bestimmte Adresse per Ping erreichbar ist". Dies stellt genauso wenig eine Garantie dar, wie das in diesem MCSEboard Link beschrieben ist. Wenn, dann müsstest Du das AD abfragen, ob funktional, und erst dann weitermachen. Sonst gewinnst Du nix.
emeriks
emeriks 11.09.2015 um 10:30:20 Uhr
Goto Top
Also noch einmal die Frage, vor allem an unsere Scripter: Wie müsste ein solches Script aussehen? Statt hier umfangreich zu begründen, dass das keine gute Lösung ist, lasst es mich doch einfach mal testen. Manchmal ist eine allgemein schlechte Lösung (weil sie z.B. die Performance drückt) in bestimmten Situationen (wenn es z.B. gar nicht auf Performance ankommt) doch ganz ok.

Wie schon geschrieben. Stell auf Synchrone Scriptabarbeitung um. Dann verpasse dem Computer dieses Script als Startup Script. Er sollte nicht weitermachen (u.a. Login anbieten), bis das Script beendet ist.

Vbscript Ping Beispiel

Wenn Du diese Funktion übernimmst dann
do
  Wscript.Sleep 100
loop until Ping
SarekHL
SarekHL 11.09.2015 um 10:32:35 Uhr
Goto Top
Zitat von @emeriks:

Du schreibst "bis eine bestimmte Adresse per Ping erreichbar ist". Dies stellt genauso wenig eine Garantie dar, wie das in diesem MCSEboard Link beschrieben ist. Wenn, dann müsstest Du das AD abfragen, ob funktional, und erst dann weitermachen.

Das vernachlässigen wir mal. Wenn das Script durch ist, dauert es bis zum Benutzeranmeldung eh noch ein paar Sekunden - und bis dahin sollte auch das AD abfragbar sein.

Wie gesagt: Laßt es mich doch einfach probieren. Dazu müsste ich aber erst mal wissen, wie das Script an sich aussehen müsste.


Übrigens: Mit

auf synchrone Scriptbearbeitung im Vordergrund umschalten

meinst Du Einstellung Computerkonfiguration/Administrative Vorlagen/System/Skripts/Startskripts asynchron ausführen ?
emeriks
emeriks 11.09.2015 aktualisiert um 10:58:47 Uhr
Goto Top
Wie gesagt: Laßt es mich doch einfach probieren. Dazu müsste ich aber erst mal wissen, wie das Script an sich aussehen müsste.
Da habe ich doch son was geschrieben?

Übrigens: Mit

auf synchrone Scriptbearbeitung im Vordergrund umschalten

meinst Du Einstellung Computerkonfiguration/Administrative Vorlagen/System/Skripts/Startskripts asynchron ausführen ?
Korrekt. Das müsstest Du dann deaktivieren.

do
  Wscript.Sleep 100
loop until Ping("hostname oder ipadresse")  

Wscript.Quit

Function Ping( myHostName )
' This function returns True if the specified host could be pinged.  
' myHostName can be a computer name or IP address.  
' The Win32_PingStatus class used in this function requires Windows XP or later.  
' This function is based on the TestPing function in a sample script by Don Jones  
' http://www.scriptinganswers.com/vault/computer%20management/default.asp#activedirectoryquickworkstationinventorytxt  

    ' Standard housekeeping  
    Dim colPingResults, objPingResult, strQuery

    ' Define the WMI query  
    strQuery = "SELECT * FROM Win32_PingStatus WHERE Address = '" & myHostName & "'"  

    ' Run the WMI query  
    Set colPingResults = GetObject("winmgmts://./root/cimv2").ExecQuery( strQuery )  

    ' Translate the query results to either True or False  
    For Each objPingResult In colPingResults
        If Not IsObject( objPingResult ) Then
            Ping = False
        ElseIf objPingResult.StatusCode = 0 Then
            Ping = True
            exit function
        Else
            Ping = False
        End If
    Next

    Set colPingResults = Nothing
End Function
SarekHL
SarekHL 11.09.2015 um 11:06:38 Uhr
Goto Top
Zitat von @emeriks:

Wie gesagt: Laßt es mich doch einfach probieren. Dazu müsste ich aber erst mal wissen, wie das Script an sich aussehen müsste.
Da habe ich doch son was geschrieben?

Ja, aber da hatte ich schon geantwortet. Das Script hast Du nachträglich in Deinen Beitrag editiert, oder?
emeriks
emeriks 11.09.2015 um 11:09:25 Uhr
Goto Top
Das Script hast Du nachträglich in Deinen Beitrag editiert, oder?
Nur noch Zeile 29 hinzugefügt. Unkritisch.
nextized
nextized 11.09.2015 um 14:31:35 Uhr
Goto Top
Batch Version

@echo off

:: Anzahl der maximalen Loops, bis der Prozess beendet wird (300 x 1s = 5 Minuten)
set maxloop = 300

for /l %%i in (1, %maxloop%) do (
	ping %server% -n 1 >nul 2>nul
	if errorlevel 0 goto :continue
) 

:continue
:: Server gefunden, Ausführung fortsetzen
114757
114757 12.09.2015 aktualisiert um 09:46:41 Uhr
Goto Top
Powershell:
while(!(Test-Connection 'www.google.de' -quiet -count 1)){sleep(1)}  

Gruß jodel32