HowTo: |
Lokale Administrator-Passwörter von Domänen-Rechnern automatisch setzen |
Ein häufiger Wunsch von ADS-Administratoren ist es, die Passwörter der lokalen Administrator-Benutzer
auf allen oder vielen Arbeitsstationen der Domäne zurückzusetzen.
Das Visual Basic Skript ResetAdmPass.vbs automatisiert diese Aufgabe über
das Active Directory Services Interface (ADSI). Wenn Sie mit dieser Schnittstelle nicht vertraut
sind, finden Sie unter Umständen die Erläuterungen in meinem ADSI
Tutorial SelfADSI nützlich.
Im Skript ResetAdmPass werden zuerst alle Arbeitsstationen innerhalb eines bestimmten ADS-Containers
gesucht. Es kann sich dabei um eine OU handeln, aber auch um die Bezeichnung der gesamten Domäne.
Die Angabe der OU bzw Domäne muss dem Skript als Parameter in Form eines korrekten LDAP
Distinguished Names übergeben werden. Der Aufruf des Skriptes wäre also z.B.
cscript ResetAdmPass.vbs "ou=WS,ou=Managed Objects,dc=cerrotorre,dc=de" xyz007 oder
cscript ResetAdmPass.vbs "ou=computers,dc=cerrotorre,dc=de" xyz007
Vermeiden Sie das Setzen von lokalen Passwörtern über die gesamte Domäne hinweg,
denn davon wären auch alle Administrator-Konten auf Member-Servern und die Administratoren
der Domäne selbst betroffen!
Das Script im Detail:
Zuerste müssen wir den als Parameter übergebenen Container für die Rechner-Objekte
auslesen:
Wscript.Echo "Usage: ResetAdmPass <BaseDN> <Password>" & VbCrLf
WScript.Echo " <BaseDN> Distinguished Name des Containers in dem"
Wscript.Echo " die Rechner neue Admin-Passwörter bekommen"
Wscript.Echo " <Password> Neues Passwort"
WScript.Quit
End If
base = Wscript.Arguments(0)
pass = Wscript.Arguments(1)
Danach muss das Skript den Namen eines erreichbaren Domänen-Controllers herausfinden. Der einfachste Weg: die no-repeatEnvironment-Variable %LOGONSERVER% auslesen. In der Variablen evtl. vorkommende Backslashes müssen gelöscht werden.
server = Replace(sho.ExpandEnvironmentStrings("%LOGONSERVER%"), "\", "")
Die nächste Aktion des Skriptes ist eine Suche aller Computer-Objekte unterhalb des angebenen LDAP-Pfades. Diese Suche wird mit Hilfe der Schnittstelle ActiveX Data Objects (ADO durchgeführt). Einzelheiten zu derartigen Suchvorgängen werden hier erläutert.
ado.Provider = "ADSDSOObject"
ado.Open "ADS-Search" 'dies ist ein willkürlich gewählter Name
filterStr = "(objectclass=computer)" 'gesucht werden alle Rechner-Objekte
'die eigentliche Abfrage des "name"-Attributes:
Set computerList= ado.Execute("<LDAP://" & server & "/" & base & ">;" & filterStr & ";name;subtree")
Jetzt wird für jeden gefundenen Rechner der Name ausgelesen und es wird versucht, über den WinNT-Provider der ADSI-Schnittstelle das Password des dortigen lokalen Administrator-Benutzers zu setzen. Falls dies nicht gelingt (der Rechner ist ausgeschaltet oder der Administrator wurde dort umbenannt), dann wird ein Fehler ausgegeben, ansonsten eine normale Meldung.
While Not computerList.EOF 'für jedes gefundene Rechner-Objekt...
computer = computerList.Fields(0).Value '...Rechner-Namen ermitteln
Err.Clear
Set admin = GetObject("WinNT://" & computer & "/Administrator") ' ...mit Admin verbinden
If (Err.Number = 0) Then
Err.Clear
admin.SetPassword(pass) '...Passwort setzen
admin.SetInfo
Falls ein Fehler aufgetreten ist, wird eine entsprechende Meldung ausgegeben. Für jeden Rechner muss der Zeiger des ADO-Recordsets nach vorne bewegt werden, um das nächste gefundene Rechnerobjekt zuzugreifen.
WScript.Echo computer & ": password changed successfully"
Else
WScript.Echo computer & ": ERROR"
End If
End If
computerList.MoveNext 'nächster Rechner
WEnd
Der Netzwerk-Timeout für nicht erreichbare Stationen ist übrigens recht lang, standardmäßig ca. 20 Sekunden. Sorgen Sie dafür, dass Sie das Skript mit einer User-ID ausführen, die die Berechtigung für den Zugriff auf alle lokalen Admin-Konten besitzt, z.B. als Domänen-Admin. Vorsicht, eine auf XP-Clients aktivierte Windows Firewall verhindert das Setzen des Passwortes übers Netzwerk.
Download von ResetAdmPass.vbs |