Printout Header
Windows Logo

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:


If (Wscript.Arguments.Count <> 2) Then
    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.


Set sho = CreateObject("WScript.Shell")                           ' wird zum Auslesen des Environments gebraucht
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.


Set ado = CreateObject("ADODB.Connection")   'Vorbereitung der ADO-Abfrage    
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.


On Error Resume Next                                        'Laufzeitfehler unterdrücken

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.


        If (Err.Number = 0) Then                                '...Info ausgabe
            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 Script Download von ResetAdmPass.vbs