Jump to content

Script zum auslesen des Stanard PW im AD funktioniert nicht.


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

Empfohlene Beiträge

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

Link zu diesem Kommentar

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?

Link zu diesem Kommentar

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?

Link zu diesem Kommentar

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.

Link zu diesem Kommentar

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!!

Link zu diesem Kommentar

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?

Link zu diesem Kommentar

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.

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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

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...