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