kamper
Goto Top

Server abschalten, wenn alle Clients offline sind?

Hilfe bei der Erstellung eines shutdown Skriptes unter Windows Server 2008 R2

Hallo zusammen,

ich habe bei mir Zuhause einen kleinen Server eingerichtet, welchen ich als File-, Print-, Backupserver nutze. Da ich Student bin, habe ich die Möglichkeit genutzt über das Hochschulprogramm mir Windows Server 2008 r2 zu beschaffen. Ich betreibe den Server also zum Testen, Lernen und verzweifeln ;)
In Zukunft wird unser Hausnetzwerk weiter ausgebaut. Derzeit versorgt der Server etwa 10 Geräte mit Daten.

Da ich aber den Server nicht den ganzen Tag laufen lassen möchte, habe ich mich an die Programmierung eines kleines Batchskripts gemacht.

Ich habe mir als erstes überlegt, wie ich überprüfen kann, ob alle Clients offline sind. Hier zu nutze ich erst mal einen simplen Pingtest:

ping 192.168.2.10 || ping 192.168.2.20 [...] || ping 192.168.2.90 || shutdown -s -f -t 00

Dieser klappt an sich auch. Jedoch gibt es 2 Laptops, welchen ich keine feste IP vergeben kann.

Hier zu meinem Problem:
Danach dachte ich, net view gibt eine Liste aller im Netzwerk verfügbaren Computer aus. Wie kann ich diese ausgegebenen Infos in einem Skript verwenden UND eine Ping-Anfrage an eine feste IP Adresse schicken.


Also nochmal in Kurzform:

Server soll Netzwerk nach PCs und Netzwerkgeräten scannen. Falls keines erreichbar ist, soll der Server nach der Zeit X abschalten. Das Skript soll alle Y Minuten durchlaufen (Dieses könnte man ja einfach über die Taskaufgaben regeln).

Gestartet wir dieser wieder normal über WOL.


Ich würde mich über Hilfe sehr freuen. Google und die Forensuche habe ich bereits gequält, jedoch komme ich nicht hinter die Abfrage des net view Ergebnisses.
Bitte Steinigt mich nicht, wenn ich die Frage im falschen Unterforum gestellt habe. Dies ist mein erster Post. Ich nutze diese Site aber immer wieder gerne um Probleme zu lösen.

Vielen Dank im Voraus.

Content-ID: 178395

Url: https://administrator.de/forum/server-abschalten-wenn-alle-clients-offline-sind-178395.html

Ausgedruckt am: 26.12.2024 um 01:12 Uhr

LordXearo
LordXearo 04.01.2012 um 19:36:53 Uhr
Goto Top
Hallo,

und was ist mit dem Vorschlag einen DNS Server einzurichten und den Computernamen anzupingen?

Gruß

Xearo
39916
39916 04.01.2012 um 22:36:43 Uhr
Goto Top
Hallo Kamper,

nmap für Windows ist hier das richtige für Dich.

Viele Grüße,
Martin
bastla
bastla 05.01.2012 um 14:32:39 Uhr
Goto Top
Hallo Kamper und willkommen im Forum!

Um aus einer "net view"-Ausgabe alle gefundenen Geräte(namen) zu erhalten, könnntest Du eine Schleife der Art
for /f "delims=\" %%i in ('net view^|findstr "\\"') do
verwenden.

Um eine beliebige Anzahl von Namen bzw Adresssen per "ping" zu überprüfen, würde ich einen Schalter und je eine Schleife etwa so verwenden:
@echo off & setlocal
set "Server=Servername"  
set "AlleAus=true"  
for %%i in (192.168.2.10 192.168.2.20 192.168.2.90) do ping -n 1 %%i>nul && set "AlleAus="  
for /f "delims=\" %%i in ('net view^|findstr "\\"^|findstr /i /v "%Server%"') do ping -n 1 %%i>nul && set "AlleAus="  
if defined AlleAus shutdown -s -f -t 00
In Zeile 2 ist "Servername" durch den Namen Deines Servers zu ersetzen - benötigt wird der Name, da der Server im "net view"-Ergebnis aufscheint.

Es schadet übrigens nicht, wenn ein Rechner mit statischer Adresse auch "namentlich" noch mal geprüft wird - mit "ping -n 1" wird nur 1 Datenpaket anstatt der defaultmäßigen 4 verschickt, wodurch die oben skizzierte (ungetestete) Variante noch immer schnneller sein sollte, als Deine ursprüngliche Version ...

Grüße
bastla
Kamper
Kamper 05.01.2012 um 15:36:25 Uhr
Goto Top
Vielen Danke für die schnellen Antworten. Ich werde die Lösungsvorschläge am Wochenende ausprobieren.
Kamper
Kamper 08.01.2012 um 15:11:32 Uhr
Goto Top
Hallo bastla,

ich habe soeben dein Skript unter unterschiedlichen Bedingungen ausprobiert.


Senario 1: min 1 Client verfügbar:

C:\Users\Administrator\Desktop>set "Server=server"  
C:\Users\Administrator\Desktop>set "AlleAus=true"  
C:\Users\Administrator\Desktop>for %i in (192.168.2.10 192.168.2.20 192.168.2.80) do ping -n 1 %i  1>nul  && set "AlleAus="  
C:\Users\Administrator\Desktop>ping -n 1 192.168.2.10  1>nul  && set "AlleAus="  
C:\Users\Administrator\Desktop>ping -n 1 192.168.2.20  1>nul  && set "AlleAus="  
C:\Users\Administrator\Desktop>ping -n 1 192.168.2.80  1>nul  && set "AlleAus="  
C:\Users\Administrator\Desktop>for /F "delims=\" %i in ('net view|findstr "\\"|findstr /i /v "server"') do ping -n 1 %i  1>nul  && set "AlleAus="  
Systemfehler 6118 aufgetreten.
Die Liste der Server in dieser Arbeitsgruppe ist zurzeit nicht verfügbar.
C:\Users\Administrator\Desktop>if defined AlleAus shutdown -s -f -t 00
C:\Users\Administrator\Desktop>pause
Drücken Sie eine beliebige Taste . . .

Er setzt trotz erfolgreichem anpingen der ersten ip auf "AllesAus"
Und hat bei netview möglicherweise ein Firewallproblem. In die Richtung muss ich noch suchen.


Senario 2: Server ist komplett vom Netzwerk getrennt:

C:\Users\Administrator\Desktop>set "Server=server"  
C:\Users\Administrator\Desktop>set "AlleAus=true"  
C:\Users\Administrator\Desktop>for %i in (192.168.2.10 192.168.2.20 192.168.2.80) do ping -n 1 %i  1>nul  && set "AlleAus="  
C:\Users\Administrator\Desktop>ping -n 1 192.168.2.10  1>nul  && set "AlleAus="  
C:\Users\Administrator\Desktop>ping -n 1 192.168.2.20  1>nul  && set "AlleAus="  
C:\Users\Administrator\Desktop>ping -n 1 192.168.2.80  1>nul  && set "AlleAus="  
C:\Users\Administrator\Desktop>for /F "delims=\" %i in ('net view|findstr "\\"|findstr /i /v "server"') do ping -n 1 %i  1>nul  && set "AlleAus="  
C:\Users\Administrator\Desktop>if defined AlleAus shutdown -s -f -t 00
C:\Users\Administrator\Desktop>pause
Drücken Sie eine beliebige Taste . . .

Hier tritt kein Fehler auf. Herunterfahren tut er aber trotzdem nicht :S
Irgendwo muss noch ein Fehler sein.

Das was ich an dem Skript geändert habe:
"@echo off" auf "on"
"Servername" ersetzt
und zum Schluss noch ein Pause eingefügt, als ich merkte das es nicht funktioniert um den Log zu erstellen.

Da ich mich leider mit netview gar nicht und mit batch skripts nur einwenig auskenne wäre ich um weitere Hilfe sehr dankbar.

Gruß
Kamper
Kamper
Kamper 08.01.2012 um 15:18:56 Uhr
Goto Top
Hallo Xearo,

der DNS leuft über einen normalen Router. Das würde ich auch gerne so lassen, da eben der Server nicht immer verfügbar sein muss/ist.
Das mit den PC Namen werde ich noch ausprobieren.

Vielen Dank für die Antwort.

Gruß,
Kamper
bastla
bastla 08.01.2012 um 15:35:33 Uhr
Goto Top
Hallo Kamper!
Er setzt trotz erfolgreichem anpingen der ersten ip auf "AllesAus"
Eigentlich wird nicht auf "AllesAus" gesetzt, sondern die Variable %AlleAus% gelöscht (da eben der erfolgreiche "ping" beweist, dass nicht "alle aus" sind ...

Zur Kontrolle kannst Du vor und nach der Zeile 5 jeweils eine Zeile
set AlleAus
einfügen, um den Status der Variablen anzuzeigen.
Herunterfahren tut er aber trotzdem nicht :S
Wenn der "shutdown"-Befehl in der vorherigen Variante funktioniert hat, sollte er es auch jetzt tun (dass der Batch mit Admin-Rechten ausgeführt wird, setze ich mal voraus) - der Grund für das "Nicht-Herunterfahren" kann also eigentlich nur der Inhalt der Variablen %AlleAus% sein - kontrolliere den bitte anhand der oben gezeigten zusätzlichen Zeilen!

Eine andere Schreibweise für
ping -n 1 %%i>nul && set "AlleAus="
wäre noch
ping -n 1 %%i|findstr "TTL">nul && set "AlleAus="
- damit wird nicht anhand des Errorlevels (der allerdings ab XP funktionieren sollte) geprüft, sondern die Ausgabe auf den Textteil "TTL" (den es nur bei einem erfolgreichen "ping" gibt) hin untersucht ...

Grüße
bastla
Kamper
Kamper 10.01.2012 um 18:30:23 Uhr
Goto Top
Hallo, wollte mich nochmal zurückmelden und ein großes Dankeschön los werden.

Im besonderen Maße gilt der Dank bastla. Ohne Ihn würde ich wahrscheinlich immer noch rumdoktern.

Habe am Sonntagabend das Skript lauffähig bekommen.
Hier die bei mir funktionierende Version:

@echo on & setlocal
set "Server=server"  
set "AlleAus=true"  
for %%i in (192.168.2.10 192.168.2.20 192.168.2.80) do ping -n 1 %%i|findstr "TTL">nul && set "AlleAus="  
for /f "delims=\" %%i in ('net view^|findstr "\\"^|findstr /i /v "%Server%"') do ping -n 1 %%i|findstr "TTL">nul && set "AlleAus="  
if defined AlleAus shutdown -s -f -t 00

Warum die Prüfung nicht über das Errorlevel geht, weiß ich nicht. Es ist ja auch jetzt nicht mehr wichtig. Führen ja mehrere Wege nach Rom face-smile

Grüße Kamper