ichhalt
Goto Top

PCs automatisch abschalten - Servergesteuert

Clients über Serverseitige Policy herunterfahren

Hallo Zusammen,
Ich bin auf der Suche nach einer Gruppenrichtlinie für Windows Server 2003, mit der ich PCs (Windows XP Clients) zu einer bestimmten Uhrzeit herunterfahren kann. Weiß jemand etwas und kann mir weiterhelfen?

Content-Key: 87990

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

Ausgedruckt am: 28.03.2024 um 13:03 Uhr

Mitglied: SarekHL
SarekHL 19.05.2008 um 18:59:47 Uhr
Goto Top
Ich bin auf der Suche nach einer Gruppenrichtlinie für Windows Server 2003, mit der ich PCs (Windows XP Clients) zu einer bestimmten Uhrzeit herunterfahren kann.


Eine Gruppenrichtlinie wüßte ich da nicht, aber wie wäre es mit einer Batchdatei nach dem Muster

shutdown -f -s -m \\Computername 

die Du auf dem Server als geplanten Task einrichtest?
Mitglied: IchHalt
IchHalt 19.05.2008 um 19:04:46 Uhr
Goto Top
Die Sache ist die, dass mehrere PCs heruntergefahren werden sollen... eigl alle Clients die in einer bestimmten OU zu finden sind... Muss man eventuell vorher Prüfen - wenn es denn so geht - ob der PC noch an ist oder kann man die GP einfach so drauf pushen und wenn der PC nicht da ist, wirkt die Richtlinie nicht? Bin auch nich so der Scripting Guru dass ich mir ne ADM datei selbst erstellen kann...
Mitglied: colinardo
colinardo 19.05.2008, aktualisiert am 18.10.2012 um 18:35:43 Uhr
Goto Top
Gehe mal auf mein Tutorial hier im Forum : Benutzerdefinierten Task für Taskplaner per GPO verteilen (mit erweiterten Einstellungen)

Die GPO kopiert einen Eintrag in den lokalen Taskplaner der Clients die dann zum angegebenen Zeitpunkt herunterfahren. Mit dieser Lösung fahren die Rechner nur herunter wenn vorher der Rechner 1 Stunde idle war. Das kannst du aber mit dem Shutdown-Befehl anpassen, und z.B noch eine Meldung an den Rechner schicken das der jetzt gleich herunterfährt, so der Benutzer falls er noch am PC sitzt die Möglichkeit hat das ausschalten abzubrechen (Befehl shutdown /a).

Ich denke das sollte deine Lösung sein ....

face-wink Uwe
Mitglied: moesch123
moesch123 19.05.2008 um 19:23:59 Uhr
Goto Top
Hallo,

ich muss SarekHL recht geben und würde auch mit dem shutdown Befehl arbeiten.

viel Skripten ist dafür nicht wirklich nötig.

einfach eine Batch-Datei erstellen die alle Rechner enthält die in der OU enthalten sind. Diese Datei dann für die Gewünschte Uhrzeit in den Tastmanager des Servers legen und gut ist.

Der Server wird die Datei dann ausführen und alle Rechner runterfahren.

Wenn man sich dann alles noch in eine log Datei schreiben läßt kann man sogar noch nachvollziehen, welche Rechner runtergefahren wurden, und welche er nicht finden konnte.

Die Rechner die aus sind, die bleiben auch aus und auf die hat dieser Befehl keine Wirkung.

Was ich nicht weiß ist, ob man den Shutdown Befehl so umstellen kann das er eine OU runterfährt ohne das ich alle Rechner einzelnd ansteuern muss.

Gruß

Micha
Mitglied: IchHalt
IchHalt 19.05.2008 um 19:35:32 Uhr
Goto Top
Vielen Dank Softmeister,
denke auch, dass dies meine Lösung sein wird. werde das die Tage mal auf der Arbeit austesten.

Gruß und Dank
Patrick
Mitglied: IchHalt
IchHalt 20.05.2008 um 16:19:42 Uhr
Goto Top
Hallo Nochmal.
Also ich habe das nun mal ausprobiert. Beim übertragen des Tasks setzt er den Usernamen allerdinfs auf den aktuell angemeldeten Benutzer. Doch der Benutzer hat nicht genügend rechte.
-> schtasks.exe /change /tn "Shutdown" /ru "System"

Diesen Teil habe ich nach der Erklärung so verstanden, dass er es verhindern soll. Dies passiert aber nicht. Bitte noch mal um hilfe.

Gruß und Dank,
Patrick
Mitglied: colinardo
colinardo 20.05.2008 um 17:00:50 Uhr
Goto Top
Der Befehl funktioniert leider nur wenn der Benutzer der sich am Rechner anmeldet, Admin Rechte auf der Maschine besitzt.
Mitglied: 60730
60730 20.05.2008 um 18:10:55 Uhr
Goto Top
Servus,

Von Sysinternals - um nicht zu sagen Microsoft - gibt es ein nettes Tool - das nennt sich...

*Tadaaa* - wer hätte es gedacht PSEXEC
Das würde ich auf einem Server installieren (kopieren) - und auf dem Server ein Skript schreiben, dass er die ausgewählten Clients per Taskplaner herunterfährt.
Mitglied: colinardo
colinardo 20.05.2008 um 19:52:45 Uhr
Goto Top
Servus,

Von Sysinternals - um nicht zu sagen
Microsoft - gibt es ein nettes Tool - das
nennt sich...

*Tadaaa* - wer hätte es gedacht
[http://www.technet.microsoft.com/en-us/sysinternals/bb897553.aspx
PSEXEC]
Das würde ich auf einem Server
installieren (kopieren) - und auf dem Server
ein Skript schreiben, dass er die
ausgewählten Clients per Taskplaner
herunterfährt.


dann aber direkt mit psshutdown aus der gleichen Suite mit folgendem Befehl:
psshutdown.exe -k -c -t 60 -m "Rechner wird laut Policy nun heruntergefahren!"  \\[RECHNER-NAME]  

mit der Option "-c" hat ein Benutzer falls er noch am PC sitzt, die Möglichkeit den Shutdown abzubrechen und so genug Zeit seine Arbeit zu speichern.

obiger Link geht leider nicht, hier der korrekte : PSTools
Mitglied: colinardo
colinardo 20.05.2008 um 20:50:42 Uhr
Goto Top
Habe hier mal ein VBS-Script erstellt das alle Rechner in einer OU zusammenstellt und dann jeden Rechner in dieser herunterfährt:
Das Script in den Taskplaner des Servers mit den Rechten eines Domänen-Admins ausführen lassen der auf den Clients Admin Rechte hat.

Die OU und die Domäne musst du natürlich an deine Gegebenheiten anpassen...

Set colItems = GetObject("LDAP://ou=FirmenComputer, dc=testlab, dc=de")  
set objShell = CreateObject("Wscript.Shell")  
colItems.Filter = Array("Computer")  

For each objItem in colItems
      sdcommand = "shutdown /s /t 60 /m \\" & objItem.CN  
      objShell.Run sdcommand
Next
Mitglied: IchHalt
IchHalt 20.05.2008 um 22:32:48 Uhr
Goto Top
Habe hier mal ein VBS-Script erstellt das
alle Rechner in einer OU zusammenstellt und
dann jeden Rechner in dieser
herunterfährt:
Das Script in den Taskplaner des Servers mit
den Rechten eines Domänen-Admins
ausführen lassen der auf den Clients
Admin Rechte hat.

Die OU und die Domäne musst du
natürlich an deine Gegebenheiten
anpassen...

Also is das dann ein Servertask, der vom Server aus ausgeführt wird? Muss nur halt unter nem Administrator ausgeführt werden?

Gruß + Dank
Patrick
Mitglied: colinardo
colinardo 20.05.2008 um 22:47:35 Uhr
Goto Top
Das ist keine Lösung per Gruppenrichtlinienobjekt sondern ein Task auf dem Server !!
Kopiere den Inhalt des Scripts in eine Datei mit der Endung *.vbs, passe es deinen Gegebenheiten an und dann legst einen Task auf dem Server mit diesem Script an und lässt das zur angegebenen Zeit ausführen. Das Script sucht per "ADSI" im Active Directory nach PC-Objekten in der angegebenen Organizational Unit und sendet per Shell-Befehl eine Shutdown Sequenz jeden Rechner der sich in der OU befindet.
Normalerweise haben Benutzer die der Gruppe "Domänen Admins" angehören auf allen Clients Lokale Adminrechte, so das die Angabe eines Benutzers der dieser Gruppe angehört für die Ausführung des Tasks ausreichend ist.
Mitglied: IchHalt
IchHalt 21.05.2008 um 13:03:10 Uhr
Goto Top
Hab das mit dem VBS-Script mal ausprobiert. Wenn ich das Script starte, gibt er folgenden Fehler aus:

Skript: \\Skriptpfad
Zeile: 1
Zeichen: 1
Fehler: ein solches Objekt ist auf dem Sever nicht vorhanden
Code: 80072030
Quelle: (Null)

Gruß und Dank
Patrick
Mitglied: colinardo
colinardo 21.05.2008 um 13:24:30 Uhr
Goto Top
Du hast wahrscheinlich die angaben der Domäne falsch abgeändert ErrorCode: 0x80072030L LDAP_NO_SUCH_OBJECT ERROR_DS_NO_SUCH_OBJECT Object does not exist. -- wenn hier etwas nicht stimmt findet das Script das Objekt im ActiveDirectory nicht:
  • Set colItems = GetObject("LDAP://ou=OrganizationalUnit, dc=testlab, dc=de")
in der ersten Zeile steht hinter "ou=" deine gewünschte Organizational Unit und dann folgen die DNS-Bezeichnungen deiner Umgebung wie hier z.B. die Domäne "testlab.de" -> "dc=testlab, dc=de".
Wenn die Bezeichnung der OU Sonderzeichen wie z.B. (,+"\<>;= ) enthält musst du dem Zeichen einen Backslash voranstellen.
Wenn du damit nicht zurecht kommst schreib mir deine Daten (OU ,Domäne ,etc) und ich passe Dir das Script an deine Umgebung an ....

face-wink Uwe
Mitglied: IchHalt
IchHalt 21.05.2008 um 13:35:36 Uhr
Goto Top
Ahh schonmal nen kleinen Fehler gefunden. Kann ich innerhalb einer OU dann auch auf eine Gruppe verlinken? Der Task soll nur bei bestimmten Mitgliedern einer Gruppe durchgeführt werden. Habe folgende Strukur: Domäne\OU "Verwaltung"\ OU "Groups" \Gruppe "shutdown"

Gruß und Dank
Patrick
Mitglied: colinardo
colinardo 21.05.2008 um 13:52:57 Uhr
Goto Top
Hast du die Computer-Objekte in einem Gruppen-Objekt untergebracht ??
Mitglied: colinardo
colinardo 21.05.2008 um 14:32:24 Uhr
Goto Top
Wenn die Computer-Accounts in einer Gruppe im Active Directory liegen musst du das Script wie folgt ändern: (und wieder daran denken die DOMÄNE im Abschnitt GetObject anzupassen)
Set WshNetwork = WScript.CreateObject("WScript.Network")  
strServerName = WshNetwork.ComputerName
Set objGruppe = GetObject("LDAP://cn=shutdown, OU=Groups, OU=Verwaltung, dc=DOMÄNE, dc=TLD")  
set objShell = CreateObject("Wscript.Shell")  
objGruppe.GetInfo
members = objGruppe.GetEx("member")  
for each strMember in members
	Set oMember = GetObject("LDAP://" & strServerName & "/" & strMember)  
        classArray = oMember.objectClass
	if (classArray(UBound(classArray)) = "computer") Then  
            sdcommand = "shutdown /s /t 60 /m \\" & oMember.CN  
            objShell.Run sdcommand
        end if
next
	
Mitglied: IchHalt
IchHalt 21.05.2008 um 15:49:10 Uhr
Goto Top
funktioniert die Zuweisung nur Pro Gerät im Netz oder auch Userbezogen? In der OU hatte ich nämlich ursprünglich User drin stehen.

mit Getobject "cn" kann ich also eine Gruppe in einer OU ansprechen?
members = objGruppe.GetEx("member") sage ich ihm dass das Script für die Mitglieder dieser Gruppe ausgeführt werden soll?
Set oMember = GetObject("LDAP://" & strServerName & "/" & strMember) -> muss ich hier noch etwas ändern?
if (classArray(UBound(classArray)) = "computer") -> was sagt das "computer" aus?

Hab vorher noch nie etwas mit scripten oder ähnlichem gemacht, nur ein WENIG Batch...
Bin ja auch noch nen Azubi ;)

Gruß und Dank
Patrick
Mitglied: colinardo
colinardo 21.05.2008 um 18:14:28 Uhr
Goto Top
OK, wenn du noch nie so richtig gescriptet hast verstehe ich deine Probleme, wusste ich leider nicht.
Was du aber vorhast geht so wie du dir das vorstellst nicht. Du möchtest Rechner einer bestimmten OU herunterfahren -> OK aber warum möchtest du das dann bestimmten Usern zuordnen, das will mir nicht in die Birne. Ich denke es geht primär darum Strom zu sparen wenn am Abend jemand vergessen hat seinen PC auszuschalten, oder verstehe ich dich da falsch !?

Das obige Script macht folgendes:
Mit CN=xxx wird ein bestimmtes Objekt im AD angesprochenorganizational units mit OU und die Domänen suffixe eben mit DC. Das script legt damit ein Objekt an womit auf dessen Eigenschaften in dem Fall die Gruppe zugegriffen werden kann. Eine Eigenschaft sind eben die Mitglieder dieser Gruppe. Da diese als Array zurückgegeben werden (mehrere Mitglieder) holt sich das script zu jedem Mitglied eine Referenz zu diesem aus dem AD und überprüft ob es sich bei dem Mitgliedsobjekt um ein Computeraccount handelt, denn User lassen sich schlecht herunterfahren face-wink(höchstens mit nem schlag auf die Birne). Wenn es sich um einen PC handelt wird der Name dessen an den Shutdown-Befehl übergeben und heruntergefahren.
Du versuchst wahrscheinlich das ganze als GPO-Objekt zu verwirklichen was aber mit dieser Methode nicht beabsichtigt ist. Da du anfangs gesagt hattest das du PC's einer bestimmten OU runterzu.... Geht das mit diesem Script elegangt weil es sich die Infos aus dem AD holt und du somit keine zweite Liste der Rechner die du runterdengeln willst führen musst. ALSO KEIN GPO OBJEKT ANLEGEN SONDERN TASKPLANER STARTEN , NEUEN TASK ANLEGEN(AUF DEM SERVER NICHT AUF DEN CLIENTS).
Ich lege dir ans Herz dich dringend mal mit dem Scripting auseinander zu setzen, denn als Admin wirst du an jeder Ecke darauf stossen, zumindest wenn dir jemand mal ne Aufgabe stellt die sich eben nicht mit Mausschubbsen erledigen lässt.

Falls noch Fragen sind bitte als private message an mich, dann müllen wir hier den post nicht so zu...

Grüße ... und koch nicht zu viel Kaffee für die lieben Kollegen face-smile
Uwe
Mitglied: colinardo
colinardo 21.05.2008 um 18:24:23 Uhr
Goto Top
Im letzten Script brauchst du nur im ersten GetObject-Befehl den Pfad auf dein Gruppen-Objekt setzen alles andere kannst du so lassen. Alle Rechner die du herunterfahren willst müssen Mitglied in dieser Gruppe sein..
Mitglied: d0ckw0rka
d0ckw0rka 13.11.2012 aktualisiert um 12:05:51 Uhr
Goto Top
Zitat von @colinardo:
mit der Option "-c" hat ein Benutzer falls er noch am PC sitzt, die Möglichkeit den Shutdown abzubrechen und so
genug Zeit seine Arbeit zu speichern.

obiger Link geht leider nicht, hier der korrekte : PSTools


Hallo,

nur eine kleine Anmerkung meinerseits, da ich das von "früher" auch so kannte, es aber mit Windows 7 leider so nicht mehr funktioniert

Diese Methode funktioniert NICHT mit Windows 7 Clients (der OP hat ja angegeben, dass er WinXP-Clients hat), also es wird dem User keine Möglichkeit geboten, den Shutdown-Vorgang abzubrechen.

http://forum.sysinternals.com/psshutdown-c-not-working-for-windows-7-cl ...

P.S.: Normalerweise betreibe ich keine Grabschändung, bin allerdings erst kürzlich über diesen Thread gestoßen und dachte vlt. interessiert es ja wen face-smile