Clients per Ping runterfahren
Hallo,
ich möchte den Befehl shutdown nutzen, um Clienst im Netzwerk ab einer Uhrzeit runter zufahren.
Es lassen immer wieder User ihren Rechner an.
Das kostet unnötig Strom.
Meine idee:
shutdown -s -f -t 0 -m \\%computername%
Jetzt soll aber per Ping Befehl geprüft werden, ob der Rechner an ist.
Für den Befehl muss der Name des PCs genommen werden, da es Ausnahmen gibt.
Der Bereich der IP bewegt sich im 192.168.178.2-254 es sind alles XP Pro Maschinen.
Wie kann man jetzt prüfen und dann den Namen nutzen, da sich die PCs im DHCP Netz befinden macht die IP kein Sinn.
Es gibt 3 Ausnahmen diese PC´s dürfen nicht runter gefahren werden.
Gruß
ich möchte den Befehl shutdown nutzen, um Clienst im Netzwerk ab einer Uhrzeit runter zufahren.
Es lassen immer wieder User ihren Rechner an.
Das kostet unnötig Strom.
Meine idee:
shutdown -s -f -t 0 -m \\%computername%
Jetzt soll aber per Ping Befehl geprüft werden, ob der Rechner an ist.
Für den Befehl muss der Name des PCs genommen werden, da es Ausnahmen gibt.
Der Bereich der IP bewegt sich im 192.168.178.2-254 es sind alles XP Pro Maschinen.
Wie kann man jetzt prüfen und dann den Namen nutzen, da sich die PCs im DHCP Netz befinden macht die IP kein Sinn.
Es gibt 3 Ausnahmen diese PC´s dürfen nicht runter gefahren werden.
Gruß
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Kommentar vom Moderator Biber am 11.03.2011 um 17:30:07 Uhr
Beitrag verschoben von "Unix/Linux Netzwerk" nach "Batch & Skripte".
Content-ID: 162485
Url: https://administrator.de/forum/clients-per-ping-runterfahren-162485.html
Ausgedruckt am: 22.12.2024 um 16:12 Uhr
21 Kommentare
Neuester Kommentar
ich würde die einzelnen ip pingen, oder eine datei auf der $c abfragen. je nach rückmeldung dann den shutdown ausführen oder halt die nächste ip abfragen. ansonsten kannst du den shutdown auf jede maschine loslassen. der shutdown setzt nur das command remote ab und geht dann zu nächsten namen. pro name brauchst du so ca. 3 sekunden. shutdown ist aber nicht das beste prog. das psshutdon von ms macht da schon eine bessere falle
Per VBScript eigentlich nicht so schwer zu lösen:
Oder per GPO einen geplanten Task verteilen, der ein Script zum Shutdown auf jedem einzelnen Rechner ausführt. Dann muss du halt innerhalb dieses Scripts prüfen ob der Computername sich auf der Ausschlussliste befindet. Mach ich hier so und funktioniert prächtig.
- zuerst alle Computernamen im AD aus der OU "Computer" (oder wo sie bei dir stehen) holen
- für jeden Wert der Ergebnisliste (Array) prüfen ob es der Name eines Rechners ist, der nicht herunter gefahren werden darf. Falls ja - nächster Rechnername
- den Client mit seinem DNS-Namen anpingen
- wenn Antwort kommt Shutdown auslösen
- wenn keine Antwort kommt - nächster Rechner
Oder per GPO einen geplanten Task verteilen, der ein Script zum Shutdown auf jedem einzelnen Rechner ausführt. Dann muss du halt innerhalb dieses Scripts prüfen ob der Computername sich auf der Ausschlussliste befindet. Mach ich hier so und funktioniert prächtig.
Ok, weil heute Freitag ist will ich mal nicht so sein
Ich hab jetzt einige Zeilen herausgenommen, die für deinen Anwendungsfall nicht notwendig sind und ein paar kleine Änderungen eingebaut. In der Form ist es ungetestet.
Manuel
Set WshShell = WScript.CreateObject("WScript.Shell")
Set WshSysEnv = WshShell.Environment("PROCESS")
strComputername = lcase(WshSysEnv("COMPUTERNAME"))
'prüfen ob computername ausgeschlossen ist
if strComputername = "alpha230" then
wscript.quit
end if
if strComputername = "alpha232" then
wscript.quit
end if
'shutdown auslösen
strShutdown = "shutdown -s -f -t 10 -c " & chr(34) & "Der Computer wird scriptgesteuert heruntergefahren.." & chr(34)
WshShell.Run StrShutdown , 1, True
Manuel
aber ne AD Abfrage sehe ich nicht, benötige ich die?
Die ist deshalb nicht da, weil das die Variante mit Script und Task per GPO verteilen ist. Das läuft ja dann auf jeden Rechner lokal. Also muss das Script nur prüfen ob der Rechner auf dem es läuft ausgeschlossen ist oder nicht. Die anderen Rechner interessieren nicht.
Hi,
warum schreibst du nicht einfach ne ganz einfache batchdatei, die nur den Rechner runterfährt und führst die per GeplanteTasks um eine bestimmte Uhrzeit aus?
Gut ich meine, das einmal einzurichten ist mühseelig, aber dafür brauchste dann nicht mehr dabei zu schauen. Und sobald ein Rechner mal Netzwerkprobleme hat uns sich nicht mehr anpingen lässt, kommst du mit der obengenannten Methode nicht mehr weiter.
Lieben Gruß
Oli
warum schreibst du nicht einfach ne ganz einfache batchdatei, die nur den Rechner runterfährt und führst die per GeplanteTasks um eine bestimmte Uhrzeit aus?
Gut ich meine, das einmal einzurichten ist mühseelig, aber dafür brauchste dann nicht mehr dabei zu schauen. Und sobald ein Rechner mal Netzwerkprobleme hat uns sich nicht mehr anpingen lässt, kommst du mit der obengenannten Methode nicht mehr weiter.
Lieben Gruß
Oli
Hallo bodyparts!
Die Schleife würde etwa so aussehen:
[Edit] Bin offensichtlich schon so auf Batch eingestellt ... [/Edit]
Jetzt aber VBS:
Grüße
bastla
Die Schleife würde etwa so aussehen:
@echo off & setlocal enabledelayedexpansion
set "Prefix=alpha"
for /L %%i in (1001,1,1400) do (
set "Nr=%%i"
set "Rechnername=%Prefix%!Nr:~-3!"
echo Aktion fuer !Rechnername!
)
Jetzt aber VBS:
Prefix = "alpha"
For i = 1001 To 1400
Rechnername = Prefix & Right(i, 3)
'Aktion hier
Next
bastla
Moin bodyparts,
ich habe mich an der Variante "Auslesen der OU" versucht - in Batch.
[Edit]
Jetzt wollte ich wieder schnell sein und hab die Erklärung vergessen.
Definition der Ausnahmeliste durch Leerzeichen getrennt
OU-Pfad der Clients
Auswahleinschränkung. Wenn ich z. B. nur die Rechner haben möchte, die mit X333 anfangen möchte:
[/Edit]
Schönes Wochenende
Markus
@bastla
Bin gespannt auf die Verbesserungvorschläge
ich habe mich an der Variante "Auslesen der OU" versucht - in Batch.
[Edit]
Jetzt wollte ich wieder schnell sein und hab die Erklärung vergessen.
Definition der Ausnahmeliste durch Leerzeichen getrennt
Set Ausnahmeliste=XXXXwpwdk120302 XXXXwpwdk148210
OU-Pfad der Clients
Set OU="OU=Desktops,OU=Clients,OU=Institut,DC=XXXXdpk1,DC=XXXX,DC=intern"
Auswahleinschränkung. Wenn ich z. B. nur die Rechner haben möchte, die mit X333 anfangen möchte:
Set LDapFilter=(SAMAccountName=X333*)
[/Edit]
@echo off & setlocal
Set Ausnahmeliste=XXXXwpwdk120302 XXXXwpwdk148210
Set OU="OU=Desktops,OU=Clients,OU=Institut,DC=XXXXdpk1,DC=XXXX,DC=intern"
Set LDapFilter=(SAMAccountName=XXXX*)
for /f "tokens=2 delims=,=" %%a in ('dsquery * %OU% -filter "%LDAPFilter%" -limit 0') do call :MachWat %%a
goto :eof
:MachWat
Set Rechner=%1
Set IsOnline=Nein
ping -n 1 %Rechner% | find /i "Antwort von" >NUL: && Set IsOnline=Ja
if /i "%IsOnline%"=="nein" goto :eof
Set IsAusnahme=Nein
echo %Ausnahmeliste% | find /i "%Rechner%" >NUL: && Set IsAusnahme=Ja
if /i "%IsAusnahme%" == "ja" goto :eof
echo %Rechner% ist %IsOnline% und keine Ausnahme
echo Ausschalten
Schönes Wochenende
Markus
@bastla
Bin gespannt auf die Verbesserungvorschläge
Hallo BigWim!
Sollte jedenfalls grundsätzlich so klappen ...
Da ich eher zur Vorsicht neige, würde ich etwas mehr Anführungszeichen spendieren und für die Ausnahmen andere Trennzeichen (zB "@" oder ":" verwenden), und zwar auch vor dem ersten und nach dem letzten Namen - Sinn der Aktion: Damit kann ich sicher ausschließen, dass ein Rechner mit kürzerem Namen deshalb als Ausnahme betrachtet wird, weil sein Name in einem längeren Rechnernamen enthalten ist (dürfte hier aber eigentlich kein Problem sein).
Ansonsten vielleicht noch ein alternativer Ansatz (ungetestet):
Die Zeilen 7 bis 11 ließen sich natürlich auch kompakter (= in einer Zeile) schreiben, aber die wäre dann doch etwas lang ...
Zuerst nach der Ausnahme zu fragen erspart übrigens einen "
Ach ja, eine "Anmerkung" noch zu Deinem Code:
Anstelle von
würde ich eher
verwenden, da eine "
Grüße
bastla
Sollte jedenfalls grundsätzlich so klappen ...
Da ich eher zur Vorsicht neige, würde ich etwas mehr Anführungszeichen spendieren und für die Ausnahmen andere Trennzeichen (zB "@" oder ":" verwenden), und zwar auch vor dem ersten und nach dem letzten Namen - Sinn der Aktion: Damit kann ich sicher ausschließen, dass ein Rechner mit kürzerem Namen deshalb als Ausnahme betrachtet wird, weil sein Name in einem längeren Rechnernamen enthalten ist (dürfte hier aber eigentlich kein Problem sein).
Ansonsten vielleicht noch ein alternativer Ansatz (ungetestet):
@echo off & setlocal
Set "Ausnahmeliste=@XXXXwpwdk120302@XXXXwpwdk148210@"
Set "OU=OU=Desktops,OU=Clients,OU=Institut,DC=XXXXdpk1,DC=XXXX,DC=intern"
Set "LDapFilter=(SAMAccountName=XXXX*)"
for /f "tokens=2 delims=,=" %%a in ('dsquery * "%OU%" -filter "%LDAPFilter%" -limit 0') do (
echo %Ausnahmeliste%|findstr /i /c:"@%%a@">NUL || (
ping -n 1 %%a | find /i "Antwort von" >NUL && echo %%a ist online und keine Ausnahme --^> ausschalten!
)
)
Zuerst nach der Ausnahme zu fragen erspart übrigens einen "
ping
" (fällt aber bei nur wenigen Ausnahmen auch kaum ins Gewicht).Ach ja, eine "Anmerkung" noch zu Deinem Code:
Anstelle von
Set IsOnline=Nein
ping -n 1 %Rechner% | find /i "Antwort von" >NUL: && Set IsOnline=Ja
if /i "%IsOnline%"=="nein" goto :eof
Set "IsOnline="
ping -n 1 %Rechner% | find /i "Antwort von" >NUL: && Set IsOnline=Ja
if not defined IsOnline goto :eof
defined
"-Abfrage auch innerhalb einer Schleife ohne "delayedExpansion" funktioniert - der zugewiesene Wert ist egal, es soll ja nur der Zustand des "Schalters" ("flags") geprüft werden ....Grüße
bastla
Guten Morgen Bastla,
aber Du hast Recht: Bei der Veröffentlichung solcher Scripte sollte zumindest darauf hingewiesen werden.
Ich gebe zu, dass ich mir ein zwei kleine Tipps erhofft habe, obwohl es ja nicht meine Anfrage war, aber so eine ausführliche Kommentierung. Mindestens ein ebenso großes Dankeschön für Deine Mühe!
Grüße
Markus
Sollte jedenfalls grundsätzlich so klappen
Da war ich mir (fast) sicher. Habe es ja hier getestet.Da ich eher zur Vorsicht neige, würde ich etwas mehr Anführungszeichen spendieren
am Wochenende habe ich jetzt endlich auch mal verstanden, für was das gut und für die Ausnahmen andere Trennzeichen, und zwar auch vor dem ersten und nach dem letzten Namen - Sinn der
Aktion: Damit kann ich sicher ausschließen, dass ein Rechner mit kürzerem Namen deshalb als Ausnahme betrachtet wird,
weil sein Name in einem längeren Rechnernamen enthalten ist (dürfte hier aber eigentlich kein Problem sein).
Mandantenfähig. Soweit muß ich hier zum Glück nicht denken. Da wir ein Namenskonzept haben, sollte das bei uns hier kein Problem sein,Aktion: Damit kann ich sicher ausschließen, dass ein Rechner mit kürzerem Namen deshalb als Ausnahme betrachtet wird,
weil sein Name in einem längeren Rechnernamen enthalten ist (dürfte hier aber eigentlich kein Problem sein).
aber Du hast Recht: Bei der Veröffentlichung solcher Scripte sollte zumindest darauf hingewiesen werden.
Zuerst nach der Ausnahme zu fragen erspart übrigens einen "
auch kaum ins Gewicht).
Unschlagbar richtig ping
" (fällt aber bei nur wenigen Ausnahmenauch kaum ins Gewicht).
verwenden, da eine "
der zugewiesene Wert ist egal, es soll ja nur der Zustand des "Schalters" ("flags") geprüft werden ....
Und wieder etwas gelernt.defined
"-Abfrage auch innerhalb einer Schleife ohne "delayedExpansion" funktioniert -der zugewiesene Wert ist egal, es soll ja nur der Zustand des "Schalters" ("flags") geprüft werden ....
Ich gebe zu, dass ich mir ein zwei kleine Tipps erhofft habe, obwohl es ja nicht meine Anfrage war, aber so eine ausführliche Kommentierung. Mindestens ein ebenso großes Dankeschön für Deine Mühe!
Grüße
Markus