Das Passwort von Windows Accounts zu ändern ist eigentlich eine einfache Angelegenheit. Auch in der Konsole gibt es einen sehr einfachen Befehl:
net user [username] [passwort]
Ein sehr simples Skript zum Neusetzen eines Passworts könnte also so aussehen:
@echo off & setlocal & color 9f set user=user set newpw=muhuu123! net user %user% %newpw% endlocal
Aber an dieser Stelle geht es mir natürlich nicht um das Ändern eines einzelnen Passworts. Es geht um die Massenänderung eines Passworts, beispielsweise eines Administratorpassworts auf jedem Computer eines Netzwerks.
Nun kann es jedoch bei Dutzenden, Hunderten oder Tausenden Nutzern/Computern zu verschiedenen Problemen oder Nebeneffekten kommen. Der Nutzer könnte nicht existieren, deaktiviert sein oder ein Password mit Ablaufdatum besitzen. Diese Faktoren sollten bedacht werden.
Ich habe ein Skript geschrieben, welches alle diese Faktoren berücksichtigt:
@echo off & setlocal & color 9f set wd=\\lea\Deployment\Sonstiges\change-admin-pw set log=%wd%\change-admin-pw.log REM ###### EDIT THIS ###### REM desired local user account set user=user REM is it an active directory domain user or a local user account; can be yes, 1, no, 0 set domainuser=no REM needed if domain user set domainparam= REM desired new password, pay attention to password policies if activated set newpw=my4w3s0mePW! REM checks if the desired user account is activated on the machine; can be yes, 1, no, 0 set checkactive=yes REM needed if active check is performed set active=0 REM if the user is deactivated, should it get activated, can be yes, 1, no, 0 set reactivate=yes REM checks if the old password has an expiration date, which would also get changed to a newer date; can be yes, 1, no, 0 set checkpwexpire=yes REM needed if expiration check is performed set expires=0 REM changes password though it has an expiration date; can be yes, 1, no, 0 set changeanyways=yes REM check for empty variables if "%user%"=="" goto end if "%newpw%"=="" goto end REM prepare domain usage if "%domainuser%"=="yes" set domainparam=/domain if "%domainuser%"=="1" set domainparam=/domain REM check if user exists net user %user% %domainparam% if not %errorlevel%==0 echo %date% %time:~0,8% Nutzer %user% scheint nicht zu existieren >> %log% && goto end goto active :active if "%checkactive%"=="0" goto expires if "%checkactive%"=="no" goto expires REM check if user is active for /f "tokens=1-3" %%i in ('net user %user% %domainparam%') do ( if "%%i %%j"=="Konto aktiv" set active=%%k ) if "%active%"=="Ja" goto expires if "%active%"=="Yes" goto expires REM activate the user if wished if "%reactivate%"=="yes" net user %user% %domainparam% /Active:YES if "%reactivate%"=="1" net user %user% %domainparam% /Active:YES echo %date% %time:~0,8% Nutzer %user% ist deaktiviert. Passwort wird trotzdem zurückgesetzt. >> %log% goto expires :expires if "%checkpwexpire%"=="0" goto changepw if "%checkpwexpire%"=="no" goto changepw REM check if user password has an expiration date for /f "tokens=1-4" %%i in ('net user %user% %domainparam%') do ( if "%%i %%j %%k"=="Kennwort läuft ab" set expires=%%l ) if "%expires%"=="Nie" goto changepw if "%expires%"=="Never" goto changepw if "%changeanyways%"=="yes" goto changepw if "%changeanyways%"=="1" goto changepw echo %date% %time:~0,8% Nutzer %user% hat ein zeitlich limitiertes Passwort, Passwortänderung wird abgebrochen. >> %log% goto end :changepw net user %user% %newpw% %domainparam% set pwEL=%errorlevel% if %pwEL%==0 echo %date% %time:~0,8% Passwort geändert. User: %user% - Aktiviert: %active% - PW läuft ab: %expires% >> %log% && goto end echo %date% %time:~0,8% Fehler beim Ändern des Passworts: %pwEL%. User: %user% - Aktiviert: %active% - PW läuft ab: %expires% >> %log% REM Errorlevel 2 means that the chosen password doen't meet the password policy guidelines goto end :end endlocal
Erläuterung:
Anhand der Variablen lässt sich das Verhalten des Skriptes in bestimmten Situationen steuern. Die Kommentare sollten eigentlich alles soweit klar machen.
Ich habe das Skript noch nicht ausführlich getestet, es sollte aber eigentlich keine Probleme geben.
Es ist also wichtig das Passwort oder das komplette Skript zu verschlüsseln. Je nach Firma, Größe, Nutzergruppe, Sicherheitsrichtlinien usw. muss man in diesen Punkt mehr oder weniger Arbeit stecken.
Ich habe an dieser Stelle ein sehr einfaches Tool gefunden, welches Batch Skripte in .exe Dateien kompilieren kann und damit den Inhalt (für die meisten Menschen) unlesbar macht: Bat To Exe Converter von F2KO macht genau das, was der Name sagt. Außerdem kann die .exe Datei mit einem Passwort verschlüsselt, unsichtbar ausgeführt und mit einem Icon sowie vielen Metainformationen versehen werden.
Also, Nutzer und endgültiges Passwort in das Skript eintragen, kompilieren und die .exe Datei auf das Netzlaufwerk legen und verteilen. Wenig später ist das Passwort überall neu gesetzt.