mojito81 10 Geschrieben 23. Februar 2009 Melden Teilen Geschrieben 23. Februar 2009 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. Zitieren Link zu diesem Kommentar
jaksa 10 Geschrieben 23. Februar 2009 Melden Teilen Geschrieben 23. Februar 2009 Was ich machen würde: Das Ergebnis von Net View in Datei umleiten 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. Quick & Dirty, aber es funktioniert Gruß, Jaksa Zitieren Link zu diesem Kommentar
d.stegemann 10 Geschrieben 23. Februar 2009 Melden Teilen Geschrieben 23. Februar 2009 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... Zitieren Link zu diesem Kommentar
mojito81 10 Geschrieben 24. Februar 2009 Autor Melden Teilen Geschrieben 24. Februar 2009 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 ;) Zitieren Link zu diesem Kommentar
d.stegemann 10 Geschrieben 24. Februar 2009 Melden Teilen Geschrieben 24. Februar 2009 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 Zitieren Link zu diesem Kommentar
mojito81 10 Geschrieben 24. Februar 2009 Autor Melden Teilen Geschrieben 24. Februar 2009 Also, an die Sache mit dem Webinterface hatte ich auch gedacht... Wär halt einfach und schön zentral, allerdings brauch man extra ne DB. Finde die Idee von Jaksa auch sehr gut, stehe aber noch vor dem Problem, wie ich die Blacklist dann am besten erzeuge und zentral speichere. Zitieren Link zu diesem Kommentar
d.stegemann 10 Geschrieben 24. Februar 2009 Melden Teilen Geschrieben 24. Februar 2009 Hallo mojito81, ich persönlich würde erstmal zu der Weblösung tendieren... Aber ich glaube keiner hier kennt deine Umgebung so gut wie du selbst. Vielleicht stehen dir ja noch ganz andere Möglichkeiten zur Verfügung. Gruß Dirk Zitieren Link zu diesem Kommentar
jaksa 10 Geschrieben 24. Februar 2009 Melden Teilen Geschrieben 24. Februar 2009 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 Zitieren Link zu diesem Kommentar
mojito81 10 Geschrieben 24. Februar 2009 Autor Melden Teilen Geschrieben 24. Februar 2009 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? Zitieren Link zu diesem Kommentar
d.stegemann 10 Geschrieben 24. Februar 2009 Melden Teilen Geschrieben 24. Februar 2009 @allIch 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 Zitieren Link zu diesem Kommentar
mojito81 10 Geschrieben 24. Februar 2009 Autor Melden Teilen Geschrieben 24. Februar 2009 Sorry, meine natürlich nicht den Zielrechner, sondern den Host, auf dem das VBS Skript zum Shutdown läuft... Zitieren Link zu diesem Kommentar
jaksa 10 Geschrieben 24. Februar 2009 Melden Teilen Geschrieben 24. Februar 2009 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 Zitieren Link zu diesem Kommentar
d.stegemann 10 Geschrieben 24. Februar 2009 Melden Teilen Geschrieben 24. Februar 2009 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 Zitieren Link zu diesem Kommentar
mojito81 10 Geschrieben 25. Februar 2009 Autor Melden Teilen Geschrieben 25. Februar 2009 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: Zitieren Link zu diesem Kommentar
d.stegemann 10 Geschrieben 25. Februar 2009 Melden Teilen Geschrieben 25. Februar 2009 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 Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.