Manchmal werden Benutzer durch eine Migration, beim Neuanlegen oder auch beim Zurücksetzen des Kennwortes mit einem Standardkennwort versehen. Ab und zu wird dann vergessen, bei der erstmaligen Anmeldung von einem Benutzer an der Domäne einen Kennwortwechsel zu erzwingen. Leider ist es nicht möglich, die Kennwörter der Benutzer aus dem Active Directory direkt auszulesen, da diese nur als Hashwert in der Active-Directory-Datenbank abgelegt sind. Mit einem kleinen Trick kann man aber mehrere Benutzerobjekte prüfen, ob diese ein bekanntes Standardkennwort noch verwenden.
Um dieses Ziel zu erreichen, haben Nils Kaczenski und ich ein kleines VB-Script geschrieben, das diesen Job übernimmt. Das Skript liest in einer bestimmten OU alle Benutzerkonten aus und verwendet von diesen den SamAccountName (Prä-Windows-2000-Anmeldename) plus das Standardkennwort, um ein Netzlaufwerk auf einem Fileserver zu mappen. Wenn dieses Netzlaufwerkmapping gelingt, dann kann man davon ausgehen, dass dieses Benutzerkonto noch das Standardkennwort verwendet. Sollte ein Fehler dabei auftreten, dann verwendet dieses Konto kein Standardkennwort mehr.
Alle Benutzerkonten, unter denen das Netzlaufwerkmapping funktioniert, werden in einer Textdatei protokolliert. Wichtig ist noch, dass der Fileserver, auf dem die Testfreigabe erstellt wurde, um das Netzlaufwerk zu mappen, kein DC ist (dieser würde nicht mehrere Verbindungen unter verschiedenen Benutzerkontexten gleichzeitig vom selben Rechner zulassen), sondern ein Memberserver oder im einfachsten Falle eine Workstation.
Das Skript wird folgendermaßen in der CMD aufgerufen:
cscript check_standard_password.vbs
Das Skript hier einfach per Copy&Paste in eine Textdatei einfügen und als „check_standard_password.vbs“ abspeichern.
1: '=================================================================
2: '
3: '
4: ' NAME: check_standard_password
5: '
6: ' AUTHOR: Nils Kaczenski, Frank Röder
7: ' DATE : 17.01.2007
8: '
9: ' COMMENT: Teamarbeit;-)
10: '
11: '=================================================================
12: 'Hier die einzelnen Variablen definieren
13: 'DN der OU, die durchsucht werden soll
14: strDN = "" 'Beispiel "OU=TestOU,OU=oberOU,DC=test,DC=de"
15: 'Pfad zum Logfile, in dem die User mit Standardkennwort eingetragen werden
16: sollen
17: strLogPath = "" 'Beispiel "c:\logfile.txt"
18: 'UNC-Pfad, der zum Test gemappt werden soll
19: strTestUNC = "" 'Beipiel "\\testserver\testshare"
20: 'Wie sieht das Standardkennwort aus?
21: strPass = "" 'Beispiel "Standardkennw0rt"
22: 'AB HIER NICHTS MEHR VERÄNDERN!
23: '===========================================================================
24:
25: Set objOU = GetObject ("LDAP://" & strDN)
26: objOU.Filter = Array("User")
27: Set objNet = CreateObject ("WScript.Network")
28: Set objFso = CreateObject("Scripting.FileSystemObject")
29: Set objTs = objFso.OpenTextFile(strLogPath, 2, True)
30: objTs.WriteLine Now
31: objTs.writeline("Folgende Benutzer verwenden noch " _
32: & "das initiale Kennwort:")
33: Set WshShell = WScript.CreateObject("WScript.Shell")
34: On Error Resume Next
35: For Each user In objOU
36: ' Usernamen ausgeben
37: WScript.Echo user.Name
38: ' Test: Laufwerk verbinden
39: objNet.MapNetworkDrive "X:", strTestUNC, _
40: , user.SamAccountName, strPass
41: ' Fehler aufgetreten?
42: If Err.Number = 0 Then
43: ' Nein, User protokollieren
44: objTs.writeline(user.Samaccountname)
45: Else
46: ' Ja, Fehler anzeigen
47: WScript.Echo "Fehler " & Err.number _
48: & " (" & Err.Description & ") " _
49: & "bei User: " & user.Name
50: Err.Clear
51: End If
52: objNet.RemoveNetworkDrive "X:"
53: Next
http://faq-o-matic.net/?p=536