llaprosper 10 Geschrieben 18. Oktober 2007 Melden Teilen Geschrieben 18. Oktober 2007 Hi, ich habe hier ein Script gefunden, welches ich echt super gebrauchen könnte. Es prüft, welche User noch nicht ihr Standard PW im AD geändert haben, in dem es probiert mit dem im Script definierten PW auf einen anderen Rechner ein Netzlaufwerk zu mappen! Wenn das mappen klappt, hat der User noch das Standard PW. Eigentlich echt genial. Nur bei mir wird in der Textdatei nichts angezeigt, obwohl etliche Ihr PW noch nicht geändert haben. Die Datei wird IMHO auch viel zu schnell erzeugt (1 Sek.) Bei ca. 500 Usern finde ich das wohl viel zu schnell. Vielleicht könnt Ihr ja mal ein Blick auf das Script werfen, ob da irgend ein Fehler drin ist. Ich habe einen Ordner auf meinen PC frei gegeben für alle, und der soll dann gemappt werden. 'Hier die einzelnen Variablen definieren 'DN der OU, die durchsucht werden soll strDN = "OU=,DC=xxx,DC=xxx,DC=xxx" 'Pfad zum Logfile, in dem die User mit Standardkennwort eingetragen werden strLogPath = "c:\logfile.txt" 'UNC-Pfad, der zum Test gemappt werden soll strTestUNC = "\\meinpc\testshare" 'Wie sieht das Standardkennwort aus? strPass = "xxxx" 'AB HIER NICHTS MEHR VERÄNDERN! '=========================================================================== Set objOU = GetObject ("LDAP://" & strDN) objOU.Filter = Array("User") Set objNet = CreateObject ("WScript.Network") Set objFso = CreateObject("Scripting.FileSystemObject") Set objTs = objFso.OpenTextFile(strLogPath, 2, True) objTs.WriteLine Now objTs.writeline("Folgende Benutzer verwenden noch " _ & "das initiale Kennwort:") Set WshShell = WScript.CreateObject("WScript.Shell") On Error Resume Next For Each user In objOU ' Usernamen ausgeben WScript.Echo user.Name ' Test: Laufwerk verbinden objNet.MapNetworkDrive "X:", strTestUNC, _ , user.SamAccountName, strPass ' Fehler aufgetreten? If Err.Number = 0 Then ' Nein, User protokollieren objTs.writeline(user.Samaccountname) Else ' Ja, Fehler anzeigen WScript.Echo "Fehler " & Err.number _ & " (" & Err.Description & ") " _ & "bei User: " & user.Name Err.Clear End If objNet.RemoveNetworkDrive "X:" Next Zitieren Link zu diesem Kommentar
ducke 11 Geschrieben 18. Oktober 2007 Melden Teilen Geschrieben 18. Oktober 2007 Die Unterstriche sind Zeilenumbrüche und müssen entfernt werden. Ausserdem würde ich ein Netzwerkshare nutzen und nicht lokal. Zitieren Link zu diesem Kommentar
llaprosper 10 Geschrieben 19. Oktober 2007 Autor Melden Teilen Geschrieben 19. Oktober 2007 Wenn ich die Unterstriche raus nehme, kommt eine Fehlermeldung! Zeile 19 Zeichen 54 Fehler: ')' erwartet Code: 800A03EE Quelle: Kompilierungsfehler in Microsoft VBScribt. Das war vorher nicht. Und mit einen Netzwerkshare, ohne Unterstrich wegnehmen klappt es auch nicht. Das Logfile schreibt keinen einzigen User rein! Zitieren Link zu diesem Kommentar
Bkolbe 10 Geschrieben 19. Oktober 2007 Melden Teilen Geschrieben 19. Oktober 2007 wenn du die Unterstriche entfernen willst, muss du die Zeilen wieder zusammenfügen, etwa so: Kommando Parameter weitererParameter _ & wassonstnoch dasteht & _ Ende der Zeile Kommando Parameter weiterPArameter & wassonstnoch dasteht & Ende der Zeile Lösch mal das "ON Error Resume next" aus dem Skript, dann werden auch evtl auftretende Fehler angezeigt ich bin mir nicht sicher ob mit der Zeile "objOU.Filter=Array("User") auch wirklich die User gefiltert werden. Ich würde hier ansetzen und schauen, ob in dem Objekt auch wirklich User sind. For each user in objOU(.filter) wscript.echo(user) next evtl. probier mal ob mit dem Angeben des Filters (der klammerwert) was bewirkt wird. In dem Bereich bin ich noch nicht besonders Sattelfest beim Scripting. Aber mal was anderes: Warum haben bei Euch noch Benutzer das Initalpasswort? Man kann doch das über das Häckchen "Benutzer muss das Passwort bei nächster Anmeldung ändern" erzwingen, dass Sie ein neues Passwort benutzen müssen? Zitieren Link zu diesem Kommentar
llaprosper 10 Geschrieben 19. Oktober 2007 Autor Melden Teilen Geschrieben 19. Oktober 2007 Frag besser nicht. Bin neu in der Firma und musste schon des öfteren den Kopf schütteln. Die User sind hier sehr "mächtig" Sie wollen halt das Stand. PW behalten, da es so schön einfach ist!!:rolleyes: Langsam kann ich die IT-Leitung aber umstimmen, auf ein bischen mehr Sicherheit wert zu legen. Ist übrigens keine kleine Klitsche, sondern fast 500 User! Wenn ich nur "ON Error Resume next" lösche, kommt auch keine Fehlermeldung! Hmmm klappt auch nicht so recht. Mit "For each user in objOU(.filter)" macht er einen error: Zeile 21 Zeichen1 Unzulässiger oder nicht ausreichend definierter Hinweis. Was macht eigentlich die Zeile objOU.Filter = Array("User") Was bedeutet in diesem Fall "User"? Angabe einer OU? Und was meinst Du mit "Ich würde hier ansetzen und schauen, ob in dem Objekt auch wirklich User sind. " In welchem Objekt? Das Script läuft ja ohne diese Änderungen schön durch, nur wird im erzeugten Log kein User angelegt. Da es so schnell geht, denke ich, dass irgendwie keine User angepackt werden, oder? Zitieren Link zu diesem Kommentar
Bkolbe 10 Geschrieben 19. Oktober 2007 Melden Teilen Geschrieben 19. Oktober 2007 da hab ich etwas unglücklich geschrieben: versuch erstmal nur "for user in objOU" im zweiten Schritt dann das .Filter dran. Bischen doof geschrieben, sorry. Ich hab noch ein anderen Fehler bei mir gefunden: schreibe wscript.echo(user.name) Set objOU = GetObject ("LDAP://" & strDN) Mit diesem Befehl wird die OU abgerufen, in der deine User stehen. Es wird ein Objekt erzeugt, nämlich objOU. objOU.Filter = Array("User") Damit soll ein Filter gesetzt werden, der nur Objekte der Klasse "User" anzeigt. Ob das so funktioniert weiß ich nicht genau, hier ist mein Scripting wissen nicht fest genug. Ich würde versuchen und prüfen ob nach der ersten Zeile auch wirklich was in dem Objekt "objOU" drinsteht, also ob er erfolgreich auf die OU zugreifen kann und enthaltenen Objekte einliest. Fertig sieht das ganze dann so aus: 'Hier die einzelnen Variablen definieren 'DN der OU, die durchsucht werden soll strDN = "OU=,DC=xxx,DC=xxx,DC=xxx" 'Pfad zum Logfile, in dem die User mit Standardkennwort eingetragen werden strLogPath = "c:\logfile.txt" 'UNC-Pfad, der zum Test gemappt werden soll strTestUNC = "\\meinpc\testshare" 'Wie sieht das Standardkennwort aus? strPass = "xxxx" 'AB HIER NICHTS MEHR VERÄNDERN! '=========================================================================== Set objOU = GetObject ("LDAP://" & strDN) For each user in objOU wscript.echo(user.name) next versuch den Codeschnippsel mal, ob was bei rauskommt. Als zweiten Schritt füge dann ncoh die Zeile mit dem "Filter" ein, dann sollten nur ncoh Benutzernamen ausgegeben werden so nebenbei, wenn du einsteigen möchtest in das Thema scripting kann ich Dir zwei Bücher empfehlen: "WIndows Scritping lernen" von Dr. Holger Schwichtenberg und danach dann "Windows Scripting. Automatisierte Systemadministration mit dem Windows Script Host und der Windows PowerShell " auch von Holger Schwichtenberg. sind beide bei Addison-Wesley erschienen. Zitieren Link zu diesem Kommentar
llaprosper 10 Geschrieben 19. Oktober 2007 Autor Melden Teilen Geschrieben 19. Oktober 2007 Du sprichst mir gerade aus der Seele!! Ich will es auf jeden Fall lernen, da ich auch schon ein paar schöne Scripte für diverse AD Abfragen (natürlich fertige) verwende. Wir haben ein Firmenkonto bei Amazon, wo ich mir jedes Buch bestellen kann!! Da kommt natürlich Dein Tipp gerade richtig!!! Der Rest wird gleich oder Montag mal getestet. Jo nicht schlecht mit dem Codeschnipsel. Damit poppt schon mal das Fenster auf und es werden mir die OU´s angezeigt. Aber nicht die enthaltenen Objekte!! Liegt da der Fehler? Als zweiten Schritt füge dann ncoh die Zeile mit dem "Filter" ein, dann sollten nur ncoh Benutzernamen ausgegeben werden.[/Quote]Damit zeigt er mir genau das selbe an. versuch erstmal nur "for user in objOU" im zweiten Schritt dann das .Filter dran.[/Quote]Mit dem Filter kommt wieder ein Error Unzulässiger oder nicht ausreichend definierter Hinweis. Zitat: objOU.Filter = Array("User") Damit soll ein Filter gesetzt werden, der nur Objekte der Klasse "User" anzeigt. Ob das so funktioniert weiß ich nicht genau, hier ist mein Scripting wissen nicht fest genug Laut Google hast du damit Recht!! Zitieren Link zu diesem Kommentar
llaprosper 10 Geschrieben 22. Oktober 2007 Autor Melden Teilen Geschrieben 22. Oktober 2007 Also, das Script funktioniert wunderbar. Ich muß allerdings in jeder einzelnen OU den Pfad bis zur OU=User den Pfad angeben. Das ist natürlich ****. Ich möchte eigentlich, das er Automatisch ab dem obersten Pfad alle User in den verschiedenen OU´s sucht. Eigentlich verstehe ich das Script auch so. Wieso brauche ich denn sonst z.B. objOU.Filter = Array("User")? Habt Ihr dafür eine Lösung? Zitieren Link zu diesem Kommentar
Bkolbe 10 Geschrieben 22. Oktober 2007 Melden Teilen Geschrieben 22. Oktober 2007 Nachdem du geschrieben hast, es werden nur die OUs angezeigt, habe ich mir schon gedacht dass es deswegen nicht geht, da dein Script die OUs nciht rekursiv durchsucht. Um durch alle untergeordneten OUs zu gehen, muss man eine zusätzliche Prozedur / Funktion einbauen, die das dann macht. Sobald dein Skript eine untergeordnete OU findet, muss die abfrage erneut gestartet werden und zwar mit dem neuen Pfad. Das Spiel wiederholt sich so lange bis er in der letzten untergeordneten OU war und durch den gesammten Baum gegangen ist. Wenn du jetzt nicht das komplette Skript umschreiben willst, mach aus dem Hauptteil eine Prozedur und rufe diese für jede OU auf, in der Benutzer stehen: 'Hier die einzelnen Variablen definieren 'DN der OU, die durchsucht werden soll strDN = "OU=,DC=xxx,DC=xxx,DC=xxx" 'Pfad zum Logfile, in dem die User mit Standardkennwort eingetragen werden strLogPath = "c:\logfile.txt" 'UNC-Pfad, der zum Test gemappt werden soll strTestUNC = "\\meinpc\testshare" 'Wie sieht das Standardkennwort aus? strPass = "xxxx" 'AB HIER NICHTS MEHR VERÄNDERN! '=========================================================================== pruefeBenutzer strDN, strLogPath, strTestUNC, strPass strDN = "<neuer OU PFad>" pruefeBenutzer strDN, strLogPath, strTestUNC, strPass strDN = "<neuer OU PFad2>" pruefeBenutzer strDN, strLogPath, strTestUNC, strPass sub pruefeBenutzer(strDN, strLogPath, strTestUNC, strPass) Set objOU = GetObject ("LDAP://" & strDN) objOU.Filter = Array("User") Set objNet = CreateObject ("WScript.Network") Set objFso = CreateObject("Scripting.FileSystemObject") Set objTs = objFso.OpenTextFile(strLogPath, 2, True) objTs.WriteLine Now objTs.writeline("Folgende Benutzer verwenden noch " _ & "das initiale Kennwort:") Set WshShell = WScript.CreateObject("WScript.Shell") On Error Resume Next For Each user In objOU ' Usernamen ausgeben WScript.Echo user.Name ' Test: Laufwerk verbinden objNet.MapNetworkDrive "X:", strTestUNC, _ , user.SamAccountName, strPass ' Fehler aufgetreten? If Err.Number = 0 Then ' Nein, User protokollieren objTs.writeline(user.Samaccountname) Else ' Ja, Fehler anzeigen WScript.Echo "Fehler " & Err.number _ & " (" & Err.Description & ") " _ & "bei User: " & user.Name Err.Clear End If objNet.RemoveNetworkDrive "X:" Next end sub Damit hättest einen workaround, der zwar nicht ganz elegant ist, aber erstmal funktioniert. Später kannst du ja dann mal selbst versuchen, das Skript so abzuändern, dass es Rekursiv arbeiten kann. Zitieren Link zu diesem Kommentar
llaprosper 10 Geschrieben 22. Oktober 2007 Autor Melden Teilen Geschrieben 22. Oktober 2007 Ja gut, kein Problem einmalig alle OU Pfade anzugeben, aber leider werden die gesammelten Daten nicht ins logfile geschrieben, sondern nur die letzte angegebende OU. Zitieren Link zu diesem Kommentar
Bkolbe 10 Geschrieben 22. Oktober 2007 Melden Teilen Geschrieben 22. Oktober 2007 klar stimmt, die Datei wird mit den Parameter "ForWriting" geöffnet. Ändere die Zeile Set objTs = objFso.OpenTextFile(strLogPath, 2, True) so ab: Set objTs = objFso.OpenTextFile(strLogPath, 8) 2: Datei überschreiben 8: Zeilen an bestehende Datei anhängen Damit sollte an die Datei angehängt und nicht immer neu geschrieben werden Zitieren Link zu diesem Kommentar
llaprosper 10 Geschrieben 22. Oktober 2007 Autor Melden Teilen Geschrieben 22. Oktober 2007 Sauber!! Jetzt passt es! Ich danke Dir vielmals! Und die Bücher sind auch schon bestellt. Werde mich da mal einlesen!! Hmmm, ob da wohl ein zusammenhang besteht? Auf einmal rufen ein paar User an, Ihr PW wäre gesperrt. Haben sie wohl ein paar mal falsch eingegeben:D . Werde ich schnell mal entsperren müssen :) live long and prosper Zitieren Link zu diesem Kommentar
Bkolbe 10 Geschrieben 22. Oktober 2007 Melden Teilen Geschrieben 22. Oktober 2007 freut mich, viel Erfolg beim lesen! Zitieren Link zu diesem Kommentar
Christoph35 10 Geschrieben 23. Oktober 2007 Melden Teilen Geschrieben 23. Oktober 2007 Hallo, ist zwar etwas offtopic, aber warum wird hier nicht mit "Benutzer muss Kennwort bei der nächsten Anmeldung ändern" und password history gearbeitet (bis zu 24 PWs können damit gecheckt werden). Ausserdem kann man noch ein gewissen Mindestalter für das PW festlegen. Dann ist der User gezwungen, sich neue PWs zu suchen. Natürlich solltest Du das nicht im Alleingang machen, sondern das ganze sollte von der Geschäftsleitung kommuniziert werden. Christoph Zitieren Link zu diesem Kommentar
llaprosper 10 Geschrieben 23. Oktober 2007 Autor Melden Teilen Geschrieben 23. Oktober 2007 Ist natürlich richtig, aber einige müssen hier zwingend das PW behalten. (Laut Sysadmins) Also will ich einfach eine Komplettliste haben um dann zu sehen, wieviele dabei sind, die es nicht behalten müssen. Ist alles etwas kompliziert hier *kopfschüttel* 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.