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.

Kurze Frage: Bei mir erkennt das AVAST Virenprogramm das BatchToEXE als Virus…?
Erstaunlich, VirusTotal erkennt 0/52. Also ich bin mir zwar zu 99% sicher, dass das ein False Positive sein müsste, aber versprechen kann ich natürlich nichts.
Was für ein Virus wird denn erkannt? Irgendwas mit *Generic* im Namen? Hast du heuristische Erkennung aktiviert, wenn ja welche Stufe? Dann erkennen Antivirenscanner gerne und häufig beliebige Codebrocken als generische Viren, was natürlich quatsch ist.
Ein Grund warum ich heuritische Checks immer deaktiviere oder maximal auf kleinster Stufe mitlaufen lasse.
Also es ist die TMP-Datei die nebenbei kurz erstellt wird.
Angeblich soll es: Win64:Evo-gen[Susp] sein
Wie vermutet, „gen“ steht hier für generisch und heißt, dass dort Code vom Scanner gelesen wurde, der unter Umständen Schadcode sein könnte, rein von der Struktur und den Befehlen her. Das ist aber oftmals ganz normaler Code, der halt typische „Viren-Aktionen“ ausführt; also Dateisystemzugriffe usw.
Bei generischen Viren also immer Augen auf; wo kommt die Datei her, Vertraue ich der Quelle, vielleicht mal mit VirusTotal oder anderen Virenscanner scannen und dann muss man der Datei entweder vertrauen oder eben nicht 😉
Alles klar danke…:-)
Hätte ich noch Windows, würde mich ja mal interessieren, wie schwierig es ist, die unverschlüsselte *.bat-Datei aus dem Ding zu bekommen. Naja.
Ich hoffe ja, dass dieses Programm, wenn man „Programm verschlüsseln“ aktiviert, das verhindert.
super guter Artikel! Ich liebe es, wenn man coole Sachen mit Batch macht, aber warum eigentlich nicht mit der Powershell? Das Tool zum Übersetzen und Verschlüsseln der Batch-Dateien gucke ich mir aber auch mal an. 🙂 Denn auch ich mache immer noch viele einfache Dinge lieber mit Batch, als mti Powershell.
Ich habe das Script etwas erweitert damit es mir die Passwörter für mehrere User setzt, deren Benutzernamen und Passwörter in einer CSV Datei stehen:
http://de.gonline.at/index.php/blog/36-computer/170-ad-user-per-script-anlegen-und-mit-individuellen-initialisierungspasswoerter-versehen