Kann ausgeschalteten Rechner anpingen

ukr

Cadet 1st Year
Registriert
Aug. 2023
Beiträge
10
habe folgendes Problem. Wenn ich einen PC, der heruntergefahren ist, anpinge erhalte ich mit meinem Programm


[CODE]
@echo on
ping 192.168.178.112
echo Errorlevel = %errorlevel%
if %errorlevel%==0 (
echo Rechner an
) else (
echo Rechner aus
)
pause
[/CODE]
[B]folgende Meldung:[/B]
Ping wird ausgeführt für 192.168.178.112 mit 32 Bytes Daten:
Antwort von 192.168.178.110: Zielhost nicht erreichbar.
Antwort von 192.168.178.110: Zielhost nicht erreichbar.
Antwort von 192.168.178.110: Zielhost nicht erreichbar.
Antwort von 192.168.178.110: Zielhost nicht erreichbar.

Ping-Statistik für 192.168.178.112:
Pakete: Gesendet = 4, Empfangen = 4, Verloren = 0
(0% Verlust),

D:\Bat-Dateien>echo Errorlevel = 0
Errorlevel = 0

D:\Bat-Dateien>if 0 == 0 (echo Rechner an ) else (echo Rechner aus )
Rechner an

D:\Bat-Dateien>pause
Drücken Sie eine beliebige Taste . . .

[B]Ich kann dann den Rechner nicht aufwecken.
Wenn ich den Rechner aber in den Ruhezustand versetze, dann erhalte ich die Meldung:[/B]

Ping wird ausgeführt für 192.168.178.112 mit 32 Bytes Daten:
Zeitüberschreitung der Anforderung.
Zeitüberschreitung der Anforderung.
Zeitüberschreitung der Anforderung.
Zeitüberschreitung der Anforderung.

Ping-Statistik für 192.168.178.112:
Pakete: Gesendet = 4, Empfangen = 0, Verloren = 4
(100% Verlust),

D:\Bat-Dateien>echo Errorlevel = 1
Errorlevel = 1

D:\Bat-Dateien>if 1 == 0 (echo Rechner an ) else (echo Rechner aus )
Rechner aus

D:\Bat-Dateien>pause
Drücken Sie eine beliebige Taste . . .

[B]Ich kann dann den Rechner aufwecken. Woran liegt das?[/B]
 
Zuletzt bearbeitet:
Wake On Lan eingeschaltet? Warten deine Dose auf das Magic Paket?
 
Wie meinst du das, was soll ich abstellen?
Ergänzung ()

tRITON schrieb:
Wake On Lan eingeschaltet? Warten deine Dose auf das Magic Paket?
Selbstverständlich eingeschaltet. Ich meinte, warum kann ich den ausgeschalteten Rechner anpingen, nicht aber den im Ruhezustand.
 
Ich seh da keinen "erfolgreichen" Ping....

bei der Zeitüberschreitung antwortet keiner auf den Ping, und bei Zielhost nicht erreichbar, sagt dir dein Gerät mit der 110, das er die 112 nicht erreicht...

und formatiere bitte deinen Text...dann kann man auch "erkennen" was du meinst bzw. was Fragen sind und was "Daten" sind.
 
  • Gefällt mir
Reaktionen: prh und kartoffelpü
Meine Frage ging dahin, dass obwohl der Rechner nicht erreichbar ist, obwohl der errorlevel = 0 ist (womit der Rechner ja eigentlich anzupingen sein müsste),.
 
und man kann mit Ping nicht "testen" ob der Rechner "da" ist oder nicht, das geht erst nachdem der WOL gesendet wurde und der Netzwerkstack dadurch hochgefahren wird.

@kartoffelpü you are not alone....
Deswegen schreib ichs auch nochmal lieber TE : Formatiere deinen Text im Ausgangspost, diese "Code/Verlinkungs"-Geschichte ist sch...
 
Ich versuchs nochmal:
habe folgendes Problem. Wenn ich einen PC, der heruntergefahren ist, anpinge erhalte ich mit meinem Programm

@
Code:
@echo on
ping 192.168.178.112
echo Errorlevel = %errorlevel%
if %errorlevel%==0 (
echo Rechner an
) else (
echo Rechner aus
)
pause
folgende Meldung:
Ping wird ausgeführt für 192.168.178.112 mit 32 Bytes Daten:
Antwort von 192.168.178.110: Zielhost nicht erreichbar.
Antwort von 192.168.178.110: Zielhost nicht erreichbar.
Antwort von 192.168.178.110: Zielhost nicht erreichbar.
Antwort von 192.168.178.110: Zielhost nicht erreichbar.

Ping-Statistik für 192.168.178.112:
Pakete: Gesendet = 4, Empfangen = 4, Verloren = 0
(0% Verlust),

D:\Bat-Dateien>echo Errorlevel = 0
Errorlevel = 0

D:\Bat-Dateien>if 0 == 0 (echo Rechner an ) else (echo Rechner aus )
Rechner an

D:\Bat-Dateien>pause
Drücken Sie eine beliebige Taste . . .

Ich kann dann den Rechner nicht aufwecken.
Wenn ich den Rechner aber in den Ruhezustand versetze, dann erhalte ich die Meldung:

Ping wird ausgeführt für 192.168.178.112 mit 32 Bytes Daten:
Zeitüberschreitung der Anforderung.
Zeitüberschreitung der Anforderung.
Zeitüberschreitung der Anforderung.
Zeitüberschreitung der Anforderung.

Ping-Statistik für 192.168.178.112:
Pakete: Gesendet = 4, Empfangen = 0, Verloren = 4
(100% Verlust),

D:\Bat-Dateien>echo Errorlevel = 1
Errorlevel = 1

D:\Bat-Dateien>if 1 == 0 (echo Rechner an ) else (echo Rechner aus )
Rechner aus

D:\Bat-Dateien>pause
Drücken Sie eine beliebige Taste . . .

Ich kann dann den Rechner aufwecken. Woran liegt das?
Ergänzung ()

MadMax_87 schrieb:
und man kann mit Ping nicht "testen" ob der Rechner "da" ist oder nicht, das geht erst nachdem der WOL gesendet wurde und der Netzwerkstack dadurch hochgefahren wird.

@kartoffelpü you are not alone....
Deswegen schreib ichs auch nochmal lieber TE : Formatiere deinen Text im Ausgangspost, diese "Code/Verlinkungs"-Geschichte ist sch...
Ich kann doch mit Ping erfahren, ob ein Rechner erreichbar ist oder nicht. Wenn der Netzwerkstack hochgefahren ist, dann kann ich ihn doch anpingen oder nicht?
 
....
In deinem ersten Fall ist der Rechner aus!
Daher ist die Aussage deines "Programms" errorlevel=0 gleich "Rechner an" falsch!
Weil er eben nicht "an" ist...

Was soll dein Programm bezwecken?

Die Antwort zu deiner Ping-Stack Frage hast du ja schon zitiert...
Und zum Thema erreichbar: zieh mal das NT-Kabel ab, mach den ping und vergleiche den output von "Kabel ab,runtergefahren und Ruhezustand".
 
ping verhält sich an dieser Stelle leider nicht so wie man denken würde. Der errorlevel lässt sich nicht zuverlässig auswerten, weil der errorlevel von ping sich darauf bezieht ob eine Antwort eingegangen ist oder nicht - egal wie diese ausgesehen hat. Nur bei einem Timeout = nichts hat geantwortet gibt es errorlevel=1.

Für dieses Problem gibt es mehrere Lösungsansätze. Zum einen kann man statt des errorlevels die tatsächliche Ausgabe von ping parsen und zB nach dem Stichwort "TTL" suchen. Leider ist ping lokalisiert und somit kann es sprachenübergreifend zu Problemen führen, wenn man die batch zB auf ein anderes System kopiert. "TTL" ist zwar relativ sicher, aber Sprachen mit anderen Schriftzeichen können da einen Strich durch die Rechnung machen. Ok, wie wahrscheinlich es ist, dass man das auf ein kyrillisches Windows kopiert, sei mal dahingestellt.

Wie so oft ist in solchen Fällen allerdings PowerShell vorzuziehen. PowerShell hält sich deutlich strikter an gängige Konventionen in der Programmierung. Mit Test-Connection 8.8.8.8 -Quiet erhält man ein simples "False" oder "True" als Rückmeldung, je nachdem ob der Ping tatsächlich erfolgreich war oder nicht.

Wenn's unbedingt in Batch sein soll, könnte man das zB so machen:

Code:
@ECHO OFF
PowerShell -Command "if (-Not (Test-Connection 8.8.8.8 -Quiet) ) { exit 1}"
IF "%errorlevel%"=="1" (
    ECHO OFFLINE
) ELSE (
    ECHO ONLINE
)

Wie beschrieben liefert Test-Connection hier ein True oder False zurück, was im PS-Command mittels if (negiert) geprüft und mit exit 1 quittiert wird, wenn der Test fehlschlägt - sonst kommt per default errorlevel 0 raus.
 
Vielen Dank für Deine informative Antwort (endlich mal). Meine Frage ging aber eigentlich dahin, warum ein Rechner, der heruntergefahren ist, diese vielleicht auch falsche Antwort liefert (Errorlevel = 0, Zielhost nicht erreichbar), während der Rechner, wenn er im Standby-Modus ist, die Antwort (Errorlevel = 1, Zeitüberschreitung der Anforderung) liefert. Hat die Netzwerkkarte bei den beiden Rechner-Zuständen einen anderen Funktions-Level? Vielleicht kann mir das jemand erklären?
 
Ähnliche Information wie @Raijin hatte ich auch schon in #8 gegeben, dass der Return-code von ping einfach "komisch" ist. Du musst dein Script anpassen, damit du dich auf das Ergebnis verlassen kannst.

Und zum Unterschied der beiden Antworten hatte ich in #6 auch schon was verlinkt...
 
  • Gefällt mir
Reaktionen: Raijin
ukr schrieb:
Vielleicht kann mir das jemand erklären?
Das hat @kartoffelpü eigentlich schon getan und ist in dem Link erklärt:

kartoffelpü schrieb:
Unterschied zwischen "Zielhost nicht erreichbar" und "Zeitüberschreitung der Anforderung" erklärt: https://sid-500.com/2017/01/20/ping-zeitueberschreitung-der-anforderung/


Vielleicht noch ein paar ergänzende Informationen dazu:

Netzwerkkommunikation ist komplexer als man denkt. Es gibt verschiedene Ebenen, die sogenannten OSI-Layer, auf die ich aber nicht näher eingehen möchte. Tatsache ist, dass ein "Ping" wie ein Brief an "Liebe Oma Erna" (=Ziel-IP) ist, den man anschließend in einen Briefumschlag mit der (MAC-)Adresse steckt. Um eben diese MAC-Adresse zu ermitteln, fragt der PC vor dem Abschicken des Pings erstmal per Rundruf ins Netzwerk (=Broadcast) "Hey Oma Erna, wo wohnst du?!?" und Oma Erna antwortet mit ihrer Adresse, die du dann auf den Briefumschlag schreibst und ihn dem Postbeamten in die Hand drückst.

Nun gibt es aber mehrere Situationen wie zB

1) Du hast Omas Adresse bekommen, schickst den Brief ab und bekommst nie eine Antwort (= Timeout). Was ist da los? Kann Oma nicht lesen? Hat sie vergessen zu antworten? Will sie nicht antworten? Kann sie nicht antworten? Ist Oma im Krankenhaus und hat den Brief noch gar nicht gelesen? Oder ist Oma tot?!?!?
Ping = Timeout = Error 1

2) Du hast Omas Adresse gar nicht erst bekommen, du hast also "no route to host" bzw. "Ziel ist nicht erreichbar". Das kann auch unterwegs passieren, also wenn du zwar Omas Adresse hast, aber der Postboste dann vor der Wohnung steht und ein anderer Name an der Tür steht. Aber immerhin weißt du, dass Oma so nicht erreichbar ist, du weißt also warum du keine Antwort von Oma bekommst, weil der Brief ja gar nicht angekommen ist.
Ping = Zielhost nicht erreichbar = Error 0


Natürlich hinkt die Analogie mit Oma Erna ein wenig und man weiß auch bei 2) nicht ob Oma noch lebt oder ob sie tot ist. Das ist aber sogesehen ein Problem, das sich im OSI-Modell weiter oben abspielt, also die Ebenen, in denen man anfängt, das Resultat des Pings zu beurteilen. Für den Ping ist seine Arbeit getan, er hat dir eine Antwort geliefert (error 0) und was du draus machst, ist dein Bier. Ich weiß, dieses Verhalten wirkt befremdlich, ist aber technisch gesehen absolut korrekt.

Deswegen ist Ping für diesen Zweck ungeeignet und man sollte lieber auf das oben dargestellte Beispiel mit dem PowerShell cmdlet "Test-Connection" arbeiten, das zwar auch nichts anderes macht als einen Ping abzusetzen, aber explizit mit dem Ziel, ein up/down zu ermitteln, wobei mit up = "Ziel antwortet rechtzeitig" und down = "Alles andere" einhergeht.
 
  • Gefällt mir
Reaktionen: cyberpirate und kartoffelpü
Zurück
Oben