Jump to content

Powermanagement dynamisch über AD oder Skriptgesteuert


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo erstmal,

 

ich stehe vor folgendem Problem und brauch mal die Meinung eines Profis.

 

Da mehr als die Hälfte der Nutzer ihren PC nach der Arbeit anlassen suche ich nach einer Lösung alle Clients automatisch zu einer definierten Uhrzeit runterzufahren.

 

Allerdings soll die Möglichkeit bestehen, dass vereinzelt Rechner anbleiben, auf denen eventuell wichtige Jobs oder ähnliches über Nacht laufen.

 

Ich stelle mir das so vor, dass man eine Art Blacklist erstellt und alle Rechner, außer die in der Liste automatisch herunterfahren werden. Bei über 2000 Clients klingt das aber eher nach einem quick&dirty Skript Gefrickel, da diese Liste ja dynamisch ist uns sich täglich ändern kann.

 

Hat Jemand eine Idee, wie man sowas am besten (mit möglichst wenig Aufwand und möglichst zentral im AD) limplementieren kann?

 

Ich freue mich über Anregungen und Ideen.

Link zu diesem Kommentar

Die Datei in in einem Script öffnen und Zeile für Zeile auslesen

Überprüfen ob der Rechnername in einer zweiten Datei vorkommt (Deine Blacklist) und falls nicht, einfach ein

shutdown -s -f -m \\Rechnername

an jeden Rechner senden.

 

ist jetzt nicht ganz ein shutdown -s-f-m... aber erfüllt auch seinen Zweck ;)

 


sUser = "domaene\user"
sPassword = "pssword"
fname = "clients.txt"
fblacklist = "blacklist.txt"
slev = 12
 Set oFSO = CreateObject("Scripting.FileSystemObject")
 Set oShell = WScript.CreateObject("WScript.Shell")
 Set objLines = CreateObject("Scripting.Dictionary")
 oShell.CurrentDirectory = _
 oFSO.GetParentFolderName(WScript.ScriptFullName)
 fblacklist = oFSO.GetFolder(".")& "\" & fblacklist
 Set oBlr = oFSO.OpenTextFile(fblacklist)
  sblacklist =  oBlr.Readall
  oBlr.Close
  fname = oFSO.GetFolder(".")& "\" & fname
 Set oTS = oFSO.OpenTextFile(fname)
   Do Until oTS.AtEndOfStream 
     sClient = Trim(oTS.ReadLine)
     If InStr(sblacklist, sClient) > 0 Then
     Else
     objLines.Add sClient, True
     End if
   Loop
oTS.Close
For Each sClient in objLines.Keys
      Set oLocator = CreateObject("WbemScripting.SWbemLocator")
     On Error Resume next
     Set oConnection = oLocator.ConnectServer(sClient, _
     "root\cimv2", sUser, sPassword)
     Set oWindows = oConnection.ExecQuery("Select " & _
     "Name From Win32_OperatingSystem")
       For Each oSys In oWindows
         oSys.Win32ShutDown(slev)
       Next 
	Err.Clear
Next


 

Bei diesem Script werden die Dateien clients und blacklist, die im gleichen Verzeichnis wie das Script liegen, miteinander verglichen. Das Delta kommt in ein Dictionary Objekt, das dann benutzt wird per wmi den Rechner runterzufahren.

 

Hoffe, das hilft ein bisschen weiter...

 

 

Gruß

 

Dirk

 

PS: Irgendwie habe ich das Gefühl als hätte ich eine ähnliche Frage heute schonmal gesehen...

Link zu diesem Kommentar

Guten Morgen,

 

danke erst mal für die Antworten.

@d.stegemann: Das Skript kann dann von einem beliebiegen Rechner ausgeführt werden oder? Hauptsache die Usercredentials sind die eines (Domänen-)Administrators...

 

Es muss also nur noch auf der Clientseite ein Skript "liegen", dass den Nutzer danach fragt, ob der Rechner anbleiben soll und im Falle dann den Rechnernamen in einem entsprechenden File speichert. Oder wär es einfacher, den Namen in einer DB zu speichern und dann auf dem Rechner, der das ShutdownSkript ausführt eine DB-Abfrage zu starten, die dann täglich um z-B. 19:30 die Blacklist neu erstellt. Eigentlich würd ich das am liebsten ohne Datenbank realisieren. Hast Du vllt auch noch ne Idee, wie ich das am besten machen kann? Sorry, bin nicht so der Programmierer ;)

Link zu diesem Kommentar
Guten Morgen,

 

danke erst mal für die Antworten.

@d.stegemann: Das Skript kann dann von einem beliebiegen Rechner ausgeführt werden oder? Hauptsache die Usercredentials sind die eines (Domänen-)Administrators...

 

wenn ich mich recht besinne hat die Gruppe der Administratoren auf dem Zielsystem das Recht eine Maschine remote herunterzufahren..

 

Es muss also nur noch auf der Clientseite ein Skript "liegen", dass den Nutzer danach fragt, ob der Rechner anbleiben soll und im Falle dann den Rechnernamen in einem entsprechenden File speichert.

 

Kann man so machen. Frage ist natürlich wie du das Script an die Maschinen bringst.

 

Oder wär es einfacher, den Namen in einer DB zu speichern und dann auf dem Rechner, der das ShutdownSkript ausführt eine DB-Abfrage zu starten, die dann täglich um z-B. 19:30 die Blacklist neu erstellt. Eigentlich würd ich das am liebsten ohne Datenbank realisieren. Hast Du vllt auch noch ne Idee, wie ich das am besten machen kann? Sorry, bin nicht so der Programmierer ;)

 

Das mit der Datenbank hat natürlich den Charme, das du für die User ein zentrales (Web)interface bereitstellen könntest. Ich finde aber auch Jaksa's Idee ganz gut...

 

Gruß

 

Dirk

Link zu diesem Kommentar

Wobei die Weblösung ein Nachteil hat: was passiert wenn der User vergisst die Website aufzurufen um bescheid zu geben. Geht so lange gut bis eines Tages der Chef sein Rechner heruntergefahren bekommt.

 

Ein Popup der um T -30 nachfragt ob man wirklich noch arbeiten möchte finde ich sinnvoller (kannst aber nur Du entscheiden). Falls der User auf "JA" klickt, kannst Du ihn in die Blacklist eintragen.

Die Frage ist: wie kommt das Popup auf den Client?

Auf Anhieb fällt mir nur das alte gute AT, ansonsten gabs hier schon mal solche Diskusion: http://www.mcseboard.de/windows-forum-ms-backoffice-31/geht-task-per-gpo-verteilen-115852.html

 

Gruß.

Jaksa

Link zu diesem Kommentar

Hallo,

 

also ich denke ich werden den Weg über das Webportal nehmen und im Intranet dann einen Link dafür publizieren. Ist technisch sowie organisatorisch das einfachste.

 

@jaksa

Kann man das Problem nicht einfach umgehen, indem entweder in t-x ein PopUp per net send als Scheduled Task an alle Clients sendet und/oder die Hostnamen von VIPs per default in die Blacklist einträgt...?

 

@all

Ich bin wie bereits erwähnt nicht so bewandert auf dem Gebiet der Programmierung (ausser ein bischen java, php und sql Grundlagen). Wie kann ich denn auf dem Zielrechner relativ einfach auf eine Datenbank zugreifen und mir so die Blacklist erstellen lassen?

Link zu diesem Kommentar
@all

Ich bin wie bereits erwähnt nicht so bewandert auf dem Gebiet der Programmierung (ausser ein bischen java, php und sql Grundlagen). Wie kann ich denn auf dem Zielrechner relativ einfach auf eine Datenbank zugreifen und mir so die Blacklist erstellen lassen?

 

Mein Regulator isch kann nisch janz folschen...;)

 

Wenn ich dich richtig verstanden habe, wolltest du das ganze per Webinterface lösen oder nicht?

 

Dann würden also die User, deren Rechner nicht runtergefahren werden sollen selber am Interface aktiv werden müssen. Mit "java, php und sql Grundlagen" bist du da doch bestens gerüstet. Es muss ja nicht immer asp sein...

 

Gruß

 

Dirk

Link zu diesem Kommentar
Hallo,

Kann man das Problem nicht einfach umgehen, indem entweder in t-x ein PopUp per net send als Scheduled Task an alle Clients sendet und/oder die Hostnamen von VIPs per default in die Blacklist einträgt...?

Kannst Du machen. Wie ich bereits sagte, Du kennst Deine Anforderung am besten.

 

Ich bin wie bereits erwähnt nicht so bewandert auf dem Gebiet der Programmierung (ausser ein bischen java, php und sql Grundlagen). Wie kann ich denn auf dem Zielrechner relativ einfach auf eine Datenbank zugreifen und mir so die Blacklist erstellen lassen?

 

Damit bist Du schon fitter als die meisten Admins, die ich kenne ;)

Immerhin weisst Du schon was eine Schleife, Variable etc. ist und das bisschen VB Syntax kann man ja lernen

 

Du kannst auch die Rechnernamen in eine Datei schreiben, in diesem Fall muss es ja keine Datenbank sein. Wenn Du Dich für die WebServer Variante entscheidest, dann schreibt sowieso der Server in die DB und nicht die Clients.

 

Gruß,

Jaksa

Link zu diesem Kommentar
Wie kann ich denn auf dem Hostrechner relativ einfach auf eine Datenbank zugreifen und mir so die Blacklist erstellen lassen?

 

 

Das könnte so aussehen...

 


Dim SqlConn, oFSO
Set SqlConn = CreateObject("ADODB.Connection")
Set oFSO = CreateObject("Scripting.FileSystemObject")

fblacklist = "blacklist.txt"
tpath = oFSO.GetParentFolderName(WScript.ScriptFullName)
tfile = tpath & "\" & fblacklist
If Not oFSO.FileExists(tfile) Then
Set blacklist = oFSO.CreateTextFile(tfile, True)
Else
oFSO.DeleteFile tfile
Set blacklist = oFSO.CreateTextFile(tfile, True)
End If 
SqlConn.ConnectionString="Driver={SQL Server};" & "Server=Server;" & _
"Database=database;" & "Uid=user;" & "Pwd=password;" 

query = "Select client_name as Name, lastshut from client where lastshut" & _
">= Dateadd(hh, -20, Getdate())" 
SqlConn.Open
set rs = SqlConn.Execute(query)
Do until rs.eof
blacklist.WriteLine("" & rs("Name") & "")
rs.movenext
Loop
SqlConn.Close
blacklist.close
Set SqlConn = Nothing
Set oFSO = Nothing

 

Dafür bräuchtest du dann auch eine Tabelle. Meine trägt den Namen "Client" mit den Spalten "client_name", "id" und "lastshut" lastshut hat als default Wert getdate(). In die Blacklist kommen alle Systeme, deren Timestamp sich in den letzten 20 Stunden geändert hat. Kann man mit Sicherheit schöner machen... Soll aber auch nur ein Beispiel sein :)

Das ganze ist bei mir untern nem SQL 2000.

 

Abweichungen zu anderen RDBMS sind normal. Wenn du also eine MySQL oder was anderes einsetzt, wird dein Connectionstring natürlich ein anderer sein.

 

Gruß

 

Dirk

Link zu diesem Kommentar

moin,

 

Damit bist Du schon fitter als die meisten Admins, die ich kenne

danke, ich fühl mich geehrt ;)

 

Du kannst auch die Rechnernamen in eine Datei schreiben, in diesem Fall muss es ja keine Datenbank sein. Wenn Du Dich für die WebServer Variante entscheidest, dann schreibt sowieso der Server in die DB und nicht die Clients.

Ja, das der Webserver in die DB schreibt und nicht die Clients ist klar. Ich überleg nur grad, ob man nicht auch bei der Lösung mit dem Webinterface auf eine DB verzichten kann, indem der Webserver über SSI oder php die Hostnamen in ein Textfile schreibt. Ist sowas möglich?

 

="Driver={SQL Server};"

Muss ich das "SQL Server" anpassen oder nur danach die Anpassungen vornehmen (pw,db,erv,etc)?

 

Zu dem Shutdownskript habe ich auch noch zwei Fragen:

 

1. Funktioniert das nur in einer Domäne oder auch in einem "normalen" Netz?Habe jetzt grad leider keine Testdomäne zu Hand ;) Würde mir sonst aber evtl. eine virtuelle bauen (klingt nach Aufwand, bähh).

 

2. Noch eine Frage zu einer Stelle im Code:

If InStr(sblacklist, sClient) > 0 Then
   Else
   objLines.Add sClient, True
End if

So wie ich die das verstehe, wird geprüft, ob eine Zeile in der Blacklist mit einer Zeile in der Clientlist übereinstimmt. Wenn ja, wird ein Wert zurückgegeben, der die Anzahl der Übereinstimmungen angibt (also >0) und dann kommt Then [nix] und anschließend der else-Zweig, in dem dann der Client hinzugefügt wird.

 

Aber der Else-Zweig wird doch nur ausgeführt wenn es keine Übereinstimmungen gibt oder? Hab da grad ein kleines Verständnisproblem...:confused:

Link zu diesem Kommentar

Tach mojito81,

 

Ja, das der Webserver in die DB schreibt und nicht die Clients ist klar. Ich überleg nur grad, ob man nicht auch bei der Lösung mit dem Webinterface auf eine DB verzichten kann, indem der Webserver über SSI oder php die Hostnamen in ein Textfile schreibt. Ist sowas möglich?

 

Kann man. Ich bin mir aber nicht sicher wie sich das bei deinen ca. 2000 Clients mit dem Zugriff auf ein Textfile verhält

 

Muss ich das "SQL Server" anpassen oder nur danach die Anpassungen vornehmen (pw,db,erv,etc)?

Wenn du einen MS SQL 2000 oder SQL2005 benutzt, müsstest du nur die pw... anpassen.

Für Connectionstrings zu anderen rdbms mußt du mal googeln. Schlagwort wäre dann sowas wie dsnless Connection String (asp)

 

Zu dem Shutdownskript habe ich auch noch zwei Fragen:

 

1. Funktioniert das nur in einer Domäne oder auch in einem "normalen" Netz?Habe jetzt grad leider keine Testdomäne zu Hand ;) Würde mir sonst aber evtl. eine virtuelle bauen (klingt nach Aufwand, bähh).

 

2. Noch eine Frage zu einer Stelle im Code:

 

So wie ich die das verstehe, wird geprüft, ob eine Zeile in der Blacklist mit einer Zeile in der Clientlist übereinstimmt. Wenn ja, wird ein Wert zurückgegeben, der die Anzahl der Übereinstimmungen angibt (also >0) und dann kommt Then [nix] und anschließend der else-Zweig, in dem dann der Client hinzugefügt wird.

 

Aber der Else-Zweig wird doch nur ausgeführt wenn es keine Übereinstimmungen gibt oder? Hab da grad ein kleines Verständnisproblem...:confused:

 

zu 1.

 

Das sollte auch so funktionieren. Brauchst dann halt einen lokalen Admin. Versuch macht klug ;)

 

zu 2.

Nicht ganz. es wird nicht die Anzahl der Übereinstimmungen angegeben, sondern die Position, an der die Übereinstimmung ist. Das If then Else Konstrukt macht etwas, was dem "Wenn dann sonst" in Excel sehr ähnelt. Naja die bei Excel haben ja auch vielleicht ein bisschen gespickt ;)

Also mal in substituierter Form...

 

Inhalt blacklist

gnumpf

gnaddelwarz

hurz

 

Inhalt client

gnumpf

test

 

 

Durchlauf 1

 

If  Instr (blacklist, gnumpf) >0 ' ja da 1' then
 mach nix 'Also nix machen.
else
 Schreib ins Dictionary 'wird jetzt nicht ausgeführt
End if

 

 

Durchlauf 2

 


If  Instr (blacklist, test) >0 ' 0, da nicht gefunden' then
 'wird jetzt nicht ausgeführt
else
Schreib ins Dictionary ' neue Zeile mit Inhalt test
End if

 

Ich hoffe, das macht den Code ein wenig transparenter.

 

 

Gruß

 

Dirk

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...