103148
Goto Top

PCs in einer Domäne Abends gezielt runter fahren

Hallo,

ich habe schon etwas gesucht, aber nict so richtig was gefunden.

In einer w2k8 Domäne habe ich ca. 200 PC´s XP und W7.
Alle mit dem Namen FirmaCxxx, C steht für Client und xxx der Zähler von 001 - 500, aktiv sind ca. 200 PC´s.

Diese möchte ich gerne mit einem kleinen Tool gegen 21:00Uhr prüfen und wenn dieser an ist mit einer Meldung runter fahren.

Den shutdown Befehl kenne ich aber ich kann ihn nich in eine "Schleife" binden.

Es gibt dann noch paar PC´s die dürfen nicht runter gefahren werden zb FirmaC360 und FirmaC361.

Gruß

Content-ID: 203769

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

Ausgedruckt am: 22.11.2024 um 17:11 Uhr

Penny.Cilin
Penny.Cilin 22.03.2013 um 07:37:29 Uhr
Goto Top
Hallo,

ich würde die Clients in eine Text-Datei ablegen und dieses mittel der For-Schleife dann auslesen und runterfahren.
Somit schließt Du die Clients aus, welche nicht runtergefahren werden sollen.

Es gibt hier einige Threads bzgl. auslesen einer Text-Datei mit anschließender Aktion.

Wie Du schon geschrieben hast, hast Du Dir den Shutdown-Befehl schon angeschaut.


Gruß Penny
Casa85
Casa85 22.03.2013 um 07:39:07 Uhr
Goto Top
Ist dies nicht per GPO möglich?

Computerkonfiguration->Systemsteuerungseinstellungen->Geplante Aufgaben?

Gruß
64748
64748 22.03.2013 um 08:03:43 Uhr
Goto Top
Guten Morgen zusammen,
Zitat von @Casa85:
Ist dies nicht per GPO möglich?

Computerkonfiguration->Systemsteuerungseinstellungen->Geplante Aufgaben?

Gruß
selbst wenn das geht, dann ist das zu unflexibel. Alle PCs die nicht herunter gefahren werden sollen (auch kurzfristig) müssten in eine eigene OU. Das ist so nicht umsetzbar.

Ich würde das mit einer Batch-Datei, aber ohne for-Schleife machen. einfach für jeden Client eine Zeile anlegen
shutdown -s -f -m \\FirmaC001 -C "Feierabend, ab nach Hause!" -t 60
shutdown -s -f -m \\FirmaC002 -C "Feierabend, ab nach Hause!" -t 60
... usw.
Der Vorteil ist, wenn ein Kollege zu Dir sagt, "ich muss die kommende Nacht durcharbeiten", dann brauchst Du dessen PC nur in der Batch-Datei auszukommentieren.

Markus
mkuchen
mkuchen 22.03.2013 um 09:15:35 Uhr
Goto Top
Zitat von @64748:
Guten Morgen zusammen,
> Zitat von @Casa85:
> ----
> Ist dies nicht per GPO möglich?
>
> Computerkonfiguration->Systemsteuerungseinstellungen->Geplante Aufgaben?
>
> Gruß
selbst wenn das geht, dann ist das zu unflexibel. Alle PCs die nicht herunter gefahren werden sollen (auch kurzfristig)
müssten in eine eigene OU. Das ist so nicht umsetzbar.

Natürlich ist es das!

Ich würde das mit einer Batch-Datei, aber ohne for-Schleife machen. einfach für jeden Client eine Zeile anlegen
shutdown -s -f -m \\FirmaC001 -C "Feierabend, ab nach Hause!" -t 60
> shutdown -s -f -m \\FirmaC002 -C "Feierabend, ab nach Hause!" -t 60
> ... usw.
Der Vorteil ist, wenn ein Kollege zu Dir sagt, "ich muss die kommende Nacht durcharbeiten", dann
brauchst Du dessen PC nur in der Batch-Datei auszukommentieren.


Wozu 200 Zeilen Code schreiben?

Man muss nicht über Peking nach Rom. Die GPOs sind da schon völlig ausreichend.
64748
64748 22.03.2013 aktualisiert um 09:22:36 Uhr
Goto Top
Zitat von @mkuchen:
...
Wozu 200 Zeilen Code schreiben?

Man muss nicht über Peking nach Rom. Die GPOs sind da schon völlig ausreichend.
Wenn man das mit dem Windowseditor macht, dann hat man ein Problem. So eine Batch-Datei legt man einmal in Excel an und bearbeitet sie weiter in einem richtigen Editor.

mkuchen, wenn Du meinst, dass das per GPO zu lösen ist (und zwar flexibel), dann beschreib mal bitte das genaue Vorgehen, das interessiert mich nämlich.

Markus
DerWoWusste
DerWoWusste 22.03.2013 um 10:21:16 Uhr
Goto Top
Moin.
@64748
Alle PCs die nicht herunter gefahren werden sollen (auch kurzfristig) müssten in eine eigene OU. Das ist so nicht umsetzbar
Wie kommst Du denn darauf? Noch nie was von Sicherheitsfilterung gehört? face-smile

Einen Task zu verteilen ist eine einfache, gute Lösung, da somit Probleme mit der Konnektivität ausgeschlossen werden.
64748
64748 22.03.2013 um 10:29:59 Uhr
Goto Top
Zitat von @DerWoWusste:
...
@64748
...
Wie kommst Du denn darauf? Noch nie was von Sicherheitsfilterung gehört? face-smile
Nö, meine Kenntnisse enden z.Zt. bei Server 2003, und dort habe ich sowas nicht vorgefunden face-smile

Einen Task zu verteilen ist eine einfache, gute Lösung, da somit Probleme mit der Konnektivität ausgeschlossen werden.
Mich würde nun interessieren, ob das auch kurzfristig wirkt (mit der Sicherheitsfilterung). Also Beispiel, ein Kollege lässt einen Prozess auf seinem Rechner über Nacht durchlaufen und sagt dem Admin kurz vor Feierabend bescheid. Kann man dann auf diese Weise den einzelnen Rechner vom Shutdown ausschließen? Ich kenne Gruppenrichtlinien ja nur so, dass sie nach dem soundosvielten Neustart greifen..... und das wäre in meinem Beispiel ja eher hinderlich face-wink

Markus
DerWoWusste
DerWoWusste 22.03.2013 um 10:37:56 Uhr
Goto Top
Sicherheitsfilterung ging schon mit Win2k - einfach mal belesen. Task Deployment über GPPs geht ab xp. Die Tasks werden per Background refresh eingetragen, kein Neustart erforderlich.
64748
64748 22.03.2013 um 10:40:58 Uhr
Goto Top
Zitat von @DerWoWusste:
Sicherheitsfilterung ging schon mit Win2k - einfach mal belesen. Task Deployment über GPPs geht ab xp. Die Tasks werden per
Background refresh eingetragen, kein Neustart erforderlich.
Ok, danke, das werde ich mir ansehen wenn ich es mal brauche.

Markus
StyX82
StyX82 22.03.2013 um 11:08:57 Uhr
Goto Top
Hallo,

du kannst das eigentlich gut mit einer geplanten Aufgabe per GPO machen.
Das einzige was du zusätzlich machen müsstest, wäre einen WMI-Filter erstellen, wo du die besagten paar PCs ausschliesst.

In etwa so: SELECT * FROM Win32_ComputerSystem WHERE Name != 'NAME'

Gruß

StyX-
DerWoWusste
DerWoWusste 22.03.2013 um 11:15:56 Uhr
Goto Top
Hallo Styx.

GPPs haben zusammenklickbare WMI-Filter ("Item level targeting"), das wird also ein Klacks sein.
103148
103148 22.03.2013 um 15:13:12 Uhr
Goto Top
cool, sehr nette Ansätze!

Das Verteilen per GPO gefällt mir etwas besser bzw eleganter.
Obwol ich Batches liebe....

Also einfach den Shutdown Befehl als Batch und dann per GPO als geplante Aufgabe verteilen.

unter Ausschluss der Liste mit den Rechnern die nicht runter gefahren werden dürfen.
Da läuft auf paar XP Dosen kleine Tools, gehört für mich eher auf ein Server... aber egal


Jetzt habe ich ein kleines Problem mit den WMI Filter... @DerWoWusste, kannst du mir das etwas näher erklären?

Gruß
DerWoWusste
DerWoWusste 22.03.2013 aktualisiert um 15:45:47 Uhr
Goto Top
Da läuft auf paar XP Dosen kleine Tools, gehört für mich eher auf ein Server
Wovon sprichst Du? Da laufen keine Tools sondern Tasks, die einfach den shutdown-Befehl starten.
WMI-Filter siehe http://technet.microsoft.com/en-us/library/cc733022.aspx oder als Bild
b5c039362ccd3a3d62961c444433d0dd
bzw.
ff4f11fa75922aee5139d9da3df9bf23
102534
102534 22.03.2013 um 19:31:54 Uhr
Goto Top
Hallo,

wie wärs wenn du Aufgaben anlegst um z.B. 08:30, den Shutdowntimer auf eine halbe Stunden und wenn der Anwender "durcharbeitet" kann er eine shutdown -a Batch ausführen die auf dem Desktop liegt?

Gruß

win-dozer
format-c
format-c 23.03.2013 um 02:09:07 Uhr
Goto Top
Zitat von @103148:
Den shutdown Befehl kenne ich aber ich kann ihn nich in eine "Schleife" binden.

Auch wenn die Lösung mittels GPO eine bessere sein mag, und nur, um deine Frage direkt zu beantowrten, wäre eine folgende Umsetzung denkbar:
for /f %%i in ('net view ^| find /I "FirmaC" ^| findstr /V /G:C:\TEMP\ausschlussliste.txt') do shutdown -m %%i -s -t 600 -c "Dieser Rechner wird demnächst heruntergefahren. Zum Abbrechen starten Sie doNotShutdown.bat auf dem Desktop."  
Was mich an der ganzen Geschichte am meisten stört, ist dass der Countdown vor dem Herunterfahren ab Windows Vista aufwärts nicht mehr angezeit wird, und der Anwender somit nicht weiß, wieviel Zeit ihm noch bleibt: 90 Minuten oder 9 Sekunden. Schön ist so eine Lösung dann nicht mehr.


Gruß
format-c
Scanner
Scanner 25.03.2013 um 15:45:37 Uhr
Goto Top
Benutz doch die "psshutdown.exe" und machs so. Die Domäne auslesen was für Computer vorhanden sind.
die Computer die nicht runtergefahren sollen aus der Liste entfernen und dann die Computer nach einer bestimmten Wartezeit herunter fahren. in meinem Beispiel bleiben die Server oben und die Workstations fahren herunter.

hier mal der Code dazu
Startdatei -> SearchComputer

' +++ Sucht alle Computer in der Domaene und speichert sie in einer Datei
' +++ dsquery computer <- findet alle Computer im Activ Directory
' +++ -limit 200 <-- Das Standart limit liegt bei 100 Einträgen.
' +++ -o rdn <-- Nur der Computername wir ausgegeben
str_run = "dsquery computer -limit 200 -O rdn > Computer_in_Domaene.txt"
set wshell = CreateObject("WScript.Shell")
' +++ Startet eine DOS Box und führt dann dort den Eintrag in str_run aus.
' +++ /c fuert den Befehl/ befehle aus und endet dann.
wshell.Run "%ComSpec% /c " & str_run,,True
Set wshell = nothing

' +++ Aufruf des Dateihandlings um die Server (rechner die nicht heruntergefahren werden sollen) aus der Liste zu entfernen
Set wshShell = WScript.CreateObject ("WSCript.shell")
wshshell.run ("Dateihandling.vbs")

Dateihandling <-(sortieren der Rechner)


'+++ Variablen Deklaration
Dim objFs1, objFs2, objFs3 ' FileSystemObject Objekt
Dim strDateiname1, strDateiname2, strDateiname3
Dim strMaschines, strServer
Dim objTextStream1, objTextStream2, objTextStream3 ' Textstream Objekt
Dim strBoolean

' +++ FileSystemObjecte anlegen
Set objFs1 = CreateObject("Scripting.FileSystemObject")
Set objFs2 = CreateObject("Scripting.FileSystemObject")
Set objFs3 = CreateObject("Scripting.FileSystemObject")

'+++ Datei Pfade und Namen deklarieren
'+++ 1 fuer die Computer in der Domaene, 2 fuer die Serverliste
'+++ 3 ist fuer die Aufnahme der Workstations in der domaene
strDateiname1 = "Computer_in_Domaene.txt"
strDateiname2 = "Server.txt"
strDateiname3 = "Workstation.txt"


' +++ Textstream oeffnen, erlaubt Zugriff auf den Inhalt der Datei
' +++ objTextStream1 = Computer in Domaene
Set objTextStream1 = objFs1.OpenTextFile(strDateiname1,1)

'+++ Datei zur Aufnahme der Workstations erstellen
Set objTextStream3 = objFs3.CreateTextFile(strDateiname3, 8)


'+++Computerliste durchlaufen und kontrollieren ob es ein Server ist.
'+++ Wenn es kein server ist, dann in die Workstaton Datei eintragen
While Not objTextStream1.AtEndOfStream
strBoolean = False
strMaschines = objTextStream1.ReadLine

' +++ Textstream oeffnen, erlaubt Zugriff auf den Inhalt der Datei
' +++ objTextStream2 = Server
Set objTextStream2 = objFs2.OpenTextFile(strDateiname2,1)

While Not objTextStream2.AtEndOfStream
strServer = objTextStream2.ReadLine
If strMaschines = strServer Then
strBoolean = True
End if

Wend
'+++ Schliessen um ihn zu leeren
objTextStream2.Close

'+++ wenn es kein Server ist dann ab damit in die datei.
If strBoolean = False Then
'+++ Computer in Workstationliste eintragen
'+++ erst den text formatiern und die " entfernen.
'+++ dann den String mit einen Zeilenumbruch in Datei schreiben:
strMaschines = Replace(strMaschines, Chr(34), "")
objTextStream3.Write strMaschines & vbCrLf
End If

Wend


' +++ Textstream schliessen
objTextStream3.Close
objTextStream1.Close

' +++ Resourcen freigeben
Set objTextStream1 = Nothing
Set objTextStream2 = Nothing
Set objTextStream3 = Nothing
Set objFs1 = Nothing
Set objFs2 = Nothing
Set objFs3 = Nothing

' +++ Aufruf des Shutdon progs um alle Rechner die Online sind runter zu fahren.
Set wshShell = WScript.CreateObject ("WSCript.shell")
wshshell.run ("shutdown_online.vbs")

Set wshshell = nothing

shutdown_online <- schaun welcher Rechner online ist und ihn dann auf die Liste zum herunterfahren schreiben.

'+++ Variablen deklaration
Dim objFs1, objFs2 '+++ FileSystemObject Objekt
Dim strDateiname1, strDateiname2
Dim objTextStream1, strMaschines '+++ Textstream Objekt
Dim str_run '+++ Zur Aufnahme eines DOS Box Befehls
Dim i '+++ Zaehler zur Kontrolle ob ein Rechner Online ist.
i=0 '+++ Zaehler


'+++ Datei Pfade und Namen deklarieren
'+++ 1 = Die Rechner die online bzw aktive sind
'+++ 2 = Alle Workstations in der Domäne
strDateiname1 = "online.txt"
strDateiname2 = "Workstation.txt"

' +++ FileSystemObjecte anlegen
Set objFs1 = CreateObject("Scripting.FileSystemObject")
Set objFs2 = CreateObject("Scripting.FileSystemObject")

'+++ Textstream oeffnen, erlaubt Zugriff auf den Inhalt der Datei
'+++ 1 = Die Rechner die online sind
'+++ 2 = Alle Workstations in der Domäne

Set objLogFile = objFS1.CreateTextFile(strDateiname1,8)
Set objTextStream1 = objFs2.OpenTextFile(strDateiname2,1)

While Not objTextStream1.AtEndOfStream

strMaschines = objTextStream1.ReadLine

'+++ Pingen um heraus zu bekommen ob der Rechner online ist
Set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}")._
ExecQuery("select * from Win32_PingStatus where address = '"_
& strMaschines & "'")

'+++ Wenn der Rechner an ist, kommt er in die Online Datei
For Each objStatus in objPing
If objStatus.StatusCode=0 Then
objLogFile.Write(strMaschines & VbCrLf)
i=1 '+++ Merker, das mind. ein Rechner online ist.
End If
Next

Wend

'+++ Kontrolliert ob ueberhaupt ein Rechner online war.
'+++ Wenn nicht wird eine Bemerkung in die Datei geschrieben und alles Beendet.
if i=0 then
'+++ Durchlauf wenn kein Rechner Online war

'+++ Bemerkung in die Datei schreiben
objLogFile.Write("Keine Computer Online!" & VbCrLf)

'+++ Stream schliessen
objTextStream1.Close
objLogFile.Close

'+++ Dateihaendling
Set wshell = WScript.CreateObject("WScript.Shell")
'+++ Benennt die Online Dateim zur Doku um.
str_run = "ren online.txt online_%date%.txt"
'+++ Startet eine DOS Box und führt dann dort den Eintrag in str_run aus.
wshell.Run("%ComSpec% /c " & str_run)
'+++ Nicht mehr benoetigte Datei Loeschen
str_run = "del Computer_in_Domaene.txt"
wshell.Run("%ComSpec% /c " & str_run)
'+++ Nicht mehr benoetigte Datei Loeschen
str_run = "del Workstation.txt"
wshell.Run("%ComSpec% /c " & str_run)


'+++ Objekte freigeben
Set objFs1 = Nothing
Set objFs1 = Nothing
Set wshshell = Nothing

Else
'+++ Wird durchlaufen wenn mind. 1 Rechner online war.

'+++ Stream schliessen
objTextStream1.Close
objLogFile.Close

'+++ Objekte freigeben
Set objFs1 = Nothing
Set objFs1 = Nothing

'+++ Aufruf des shutdown Progs
Set wshShell = WScript.CreateObject ("WSCript.shell")
str_run ="C:\SHUTDOWN_DOM\shutdown.bat"
wshShell.run ("%ComSpec% /c " & str_run)

Set wshShell = nothing

End if


shutdown <- die Datei die das eigentliche shutdown ausführt.

psshutdown @online.txt -c -m "Ihr PC wird vom blablabla herruntergefahren. " -t 1800 >> Doku.txt