bodyparts
Goto Top

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ß
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/contentid/162485

Ausgedruckt am: 05.11.2024 um 07:11 Uhr

happy-gregor
happy-gregor 11.03.2011 um 13:52:02 Uhr
Goto Top
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
bodyparts
bodyparts 11.03.2011 um 14:09:55 Uhr
Goto Top
hi...

wenn ich die ip pinge, ist das nicht verlässlich, da der dhcp dort "mitspielt".

Ich muss über den Namen gehen.

Aber wie baue ich das in eine Schleife ein, die dann zb 3 namen über springt.

Es würde auch gehen, wenn ich den namen prüfen, kommt ein ping dann runter, ist es der Name zb alpha123 dann kein Shotdown.

Die PCnamen sind fortlaufend... alpha001 bis alpha 400, alpha230 und alpah233 dürfen nicht rebootet werden.

Gruß
manuel-r
manuel-r 11.03.2011 um 14:33:28 Uhr
Goto Top
Per VBScript eigentlich nicht so schwer zu lösen:
  • 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
Damit sind die Rechner binnen Sekunden herunter gefahren

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.
bodyparts
bodyparts 11.03.2011 um 14:40:11 Uhr
Goto Top
@manuel-r, dass hört sich gut an, ich weiß nur nicht wie ich das umsetze.

War auch dem Wege eine Batch zu schreiben. Kannst du mir das etwas ausführlich erklären?

Gruß
manuel-r
manuel-r 11.03.2011 um 14:50:40 Uhr
Goto Top
Ok, weil heute Freitag ist will ich mal nicht so sein face-wink

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  
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
muftypeter
muftypeter 11.03.2011 um 14:51:54 Uhr
Goto Top
Hallo,
um wieviele Clients geht es denn?
Gibt es ein AD?

Textfile mit Rechnernamen einlesen und ein File auf dem Rechner (boot.ini?) prüfen.
Falls da, Rechner shutdown senden.

Das mit der GPO ist auch eine Möglichkeit. Dann hald zwei OU.

Grüße vom Peter
bodyparts
bodyparts 11.03.2011 um 14:57:15 Uhr
Goto Top
danke dir "Freitag"... ne manuel,

aber ne AD Abfrage sehe ich nicht, benötige ich die?

Gruß
manuel-r
manuel-r 11.03.2011 um 14:59:06 Uhr
Goto Top
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.
bodyparts
bodyparts 11.03.2011 um 15:04:12 Uhr
Goto Top
hallo Peter, ja es gibt eine OU und es sind ca. 400 pc´s, drei muss ich ausschliessen und denn rest halt gucken ob an

Gruß

@Manuel, ahh, werd ich testen...
bodyparts
bodyparts 11.03.2011 um 15:09:58 Uhr
Goto Top
Zitat von @manuel-r:
Ok, weil heute Freitag ist will ich mal nicht so sein face-wink

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  
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


wofür steht chr(34) ?

gruß
bastla
bastla 11.03.2011 um 16:41:34 Uhr
Goto Top
Hallo bodyparts!
wofür steht chr(34) ?
Für ein Anführungszeichen - Du kannst die Zeile auch so schreiben:
strShutdown = "shutdown -s -f -t 10 -c ""Der Computer wird scriptgesteuert heruntergefahren.."""
Grüße
bastla
Oli-87
Oli-87 12.03.2011 um 23:28:52 Uhr
Goto Top
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
TuXHunt3R
TuXHunt3R 13.03.2011 um 14:01:24 Uhr
Goto Top
Hätte sicher auch Vorteile, wenn ein paar Ihre Rechner laufen lassen.... So können diese Clients über Nacht bereits mit Updates versorgt werden *grins*
bodyparts
bodyparts 18.03.2011 um 14:31:21 Uhr
Goto Top
hi...

jetzt komme ich wieder zum "Projekt"...

Ich möchte erstmal prüfen, wieviele Rechner überhaupt an sind.

Diese Prüfung soll auf einem Server ausgeführt werden.

Da die Rechner einen Namen in Form alpha001 bis alpha400 haben, brauche ich eine Schleife die jeden Host auf erreichbarkeit prüft.

Mein Problem ist das hochzählen von 001 plus 1 soll ergeben 002, bin mir nicht sicher wie man mit den zwei 00 davor umgeht.

Das ergebniss würde ich mir per Mail zukommen lasse, muss also in eine Datei geschrieben werden.

Gruß
bastla
bastla 18.03.2011 um 14:57:44 Uhr
Goto Top
Hallo bodyparts!

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!
)
[Edit] Bin offensichtlich schon so auf Batch eingestellt ... [/Edit]

Jetzt aber VBS:
Prefix = "alpha"  
For i = 1001 To 1400
    Rechnername = Prefix & Right(i, 3)
    'Aktion hier  
Next
Grüße
bastla
bodyparts
bodyparts 18.03.2011 um 15:06:57 Uhr
Goto Top
danke Bastla,

ich würde jetzt ein:

ping %prefix% -n 1 | findstr "TTL" && echo %prefix% >>d:\\logs\erreichbare_clients.txt

zur Aktion setzten.

Kann man das eleganter machen?
BigWim
BigWim 18.03.2011 um 15:09:14 Uhr
Goto Top
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
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 face-wink
bastla
bastla 18.03.2011 um 17:17:06 Uhr
Goto Top
Hallo bodyparts!
Kann man das eleganter machen?
Kann man/frau vor allem richtig machen face-wink:
ping !Rechnername! -n 1 | findstr "TTL">nul && >>d:\\logs\erreichbare_clients.txt echo !Rechnername!
Grüße
bastla
bastla
bastla 18.03.2011 um 17:37:58 Uhr
Goto Top
Hallo BigWim!

Sollte jedenfalls grundsätzlich so klappen ... face-smile

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!  
    )
)
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 "ping" (fällt aber bei nur wenigen Ausnahmen auch kaum ins Gewicht).
Ach ja, eine "Anmerkung" face-wink 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  
würde ich eher
Set "IsOnline="  
ping -n 1 %Rechner% | find /i "Antwort von" >NUL: && Set IsOnline=Ja  
if not defined IsOnline goto :eof
verwenden, da eine "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
bodyparts
bodyparts 19.03.2011 um 10:38:57 Uhr
Goto Top
richtig sehe grade die Rechner vari....
BigWim
BigWim 21.03.2011 um 08:43:42 Uhr
Goto Top
Guten Morgen Bastla,

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 face-wink

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,
aber Du hast Recht: Bei der Veröffentlichung solcher Scripte sollte zumindest darauf hingewiesen werden.

Zuerst nach der Ausnahme zu fragen erspart übrigens einen "ping" (fällt aber bei nur wenigen Ausnahmen
auch kaum ins Gewicht).
Unschlagbar richtig face-wink

verwenden, da eine "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 ....
Und wieder etwas gelernt.

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