Aktionen

AutoIt:Remote Domain Password Changer

Aus znilwiki

Passwörter in Domäne A aus Domäne B ändern

In einem Kundenprojekt gab es die Anforderung, Kennwörter für Benutzer aus der Domäne A in der Domäne B zu ändern. Natürlich heissen die Benutzer in den beiden Domänen auch noch unterschiedlich.
Grund war das wir aus einer alten NT4.0 Domäne heruas bereits einen neuen Exchange Server in einer Windows 2003 Active Directory Domäne nutzen wollen. Da wir aber für den Fileserver auch die SID's migriert hatten, weigerte sich die AD-Domäne in der NT4.0 Domäne noch zu suchen - wir konnten zwar NT4.0 Benutzern dank der Vertrauensstellung Rechte in der neuen Active Directory Domäne gewähren - jedoch hatten die neuen Systeme dank der migrierten SID's schon immer einen Treffer in der eigenen Domäne noch bevor die NT4.0 Domäne abgefragt wurde.

Ausgangslage:
Ein Benutzer aus der Domäne "NTDOMAIN"

NTDOMAIN\Mustermann

möchte sein Kennwort in der Domäne "NEUEDOMAIN" ändern. In dieser hat er gleich seinen neuen Benutzernamen:

NEUEDOMAIN\M.Mustermann


Lösung:

Das nachfolgende AutoIt Script braucht folgende Zusatzdateien:

BenutzerALT-NEU.txt            In dieser Datei stehen die alten und neuen Benutzernamen
                               in der Form

                               Alter Name,Neuer Name

                               z.B.:
                               Mustermann,M.Mustermann

pspasswd.exe                  Programm von Microsoft / Systinternals aus der PsTools Sammlung zum Ändern des Kennwortes
                              http://www.sysinternals.com/
                              http://technet.microsoft.com/de-de/sysinternals/bb896649

                              AutoIt könnte zwar auch Kennwörter im Active Directory ändern - aber ich hatte schwierigkeiten wegen der anderen Domäne
                              in der es stattfinden soll. Also der Kunstgriff zu diesem Hilfstool.


Beim Start prüfen wir, ob das Programm auch wirklich aus der alten Domäne aufgerufen wird und der Benutzer auch in der Benutzerlistendatei steht.
Vor setzten des Passwortes wird auch noch geprüft ob das Passwort den Anforderungen bezüglich Länge und Komplexität entspricht.

Fertig sieht das ganze so aus:

AutoIT-pwchanger-001.gif

Das fertige Script zum herunterladen: Media:Pw-changer-znilwiki.au3

Und der Quelltext:

 
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <string.au3>
#include <Array.au3>

; Passwort Änderungen für Exchange Umstellung
; April 2011 von Bernhard Linz
; Bernhard.Linz@datagroup.de
; ######################################################
; Variablen deklarien
Dim $PfadBenutzerliste = "\\SERVER\FREIGABE\BenutzerALT-NEU.txt"

Dim $EingelesendeZeile
Dim $EingelesendeZeileArray
Dim $NameLinks
Dim $NameRechts
Dim $BenutzerListeDatei
Dim $DomainALT = "NTDOMAIN"
Dim $DomainNEU = "NEUEDOMAIN"
Dim $DomainAKTUELL
Dim $BenutzernameALT ;Benutzeranmeldename in der Domäne aus der das Programm aufgerufen wird in der Regel alte Domäne
Dim $BenutzernameNEU ;Benutzeranmdelename aus der Ziel-Domäne
Dim $Passwort1
Dim $Passwort2
Dim $Rueckgabewert
Dim $AdminBenutzer = "NEUEDOMAIN\Administrator"
Dim $AdminBenutzerPasswort = "adminpasswort"
Dim $Pfadpspasswd = "\\SERVER\FREIGABE\pspasswd.exe"
Dim $DomainControllerZielDomain = "DC01"
; Prüfen ob wir uns denn aus der richtigen Domäne anmelden ...

$DomainAKTUELL = EnvGet("USERDOMAIN")
If $DomainAKTUELL <> $DomainALT Then
 MsgBox (266256, "PW-Changer.exe" , "Fehlerhafte Quelldomäne" & @CRLF & "Sie starten dieses Programm aus der Domäne " & $DomainAKTUELL & @CRLF & "Sie müssen es aber aus der Dömane " & $DomainALT & " starten.",360)
 Exit
EndIf
; Prüfen, ob denn der Benutzer auch in unserer Liste der Benutzer steht ...
$BenutzerListeDatei = FileOpen($PfadBenutzerliste,0)
If $BenutzerListeDatei = -1 Then
 MsgBox (266256, "PW-Changer.exe" , "Fehlende Datei:" & @CRLF & "Kann die Datei" & @CRLF & $PfadBenutzerliste & @CRLF & "nicht finden / öffnen.",360)
 Exit
EndIf
$BenutzernameALT = EnvGet("USERNAME") ;Umgebungsvariable Abfragen
$BenutzernameNEU = "Benutzer nicht gefunden"
While 1
 $EingelesendeZeile = FileReadLine($BenutzerListeDatei)
 If @error = -1 Then ExitLoop ;Dateiende erreicht
 $EingelesendeZeileArray = StringSplit($EingelesendeZeile,",")
 If $EingelesendeZeileArray[1] = $BenutzernameALT Then
  $BenutzernameNEU = $EingelesendeZeileArray[2]
  ExitLoop
 EndIf
WEnd
If $BenutzernameNEU = "Benutzer nicht gefunden" Then
 MsgBox (266256, "PW-Changer.exe" , "Fehlender Benutzer in Domäne " & $DomainNEU & @CRLF & "Der Benutzer" & $BenutzernameALT & "steht nicht in der Liste " & @CRLF & $PfadBenutzerliste & @CRLF & "somit hat er kein Exchange-Konto",360)
 Exit
EndIf
;Wir haben alles - Dialog starten:

#Region ### START Koda GUI section ### Form=c:\install\passwordchanger\dialogfensterv1.kxf
$Form1_1 = GUICreate("Passwort für Exchange Postfach ändern ... V1.0", 633, 506, -1, -1, BitOR($WS_SYSMENU,$WS_CAPTION,$WS_POPUP,$WS_POPUPWINDOW,$WS_BORDER,$WS_CLIPSIBLINGS))
$Label1 = GUICtrlCreateLabel("Willkommen!", 8, 8, 154, 33)
GUICtrlSetFont(-1, 18, 800, 0, "MS Sans Serif")
$Label2 = GUICtrlCreateLabel("Hier können Sie Ihr Passwort für Ihr Exchange (Outlook) Mailkonto ändern / setzen.", 8, 48, 589, 24)
GUICtrlSetFont(-1, 12, 400, 0, "MS Sans Serif")
$Group1 = GUICtrlCreateGroup(" Benutzernamen ", 8, 80, 617, 137)
GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif")
$Label3 = GUICtrlCreateLabel("Benutzername SA:", 24, 115, 139, 24)
GUICtrlSetFont(-1, 12, 400, 0, "MS Sans Serif")
$Label4 = GUICtrlCreateLabel("Benutzername Exchange:", 24, 163, 188, 24)
GUICtrlSetFont(-1, 12, 400, 0, "MS Sans Serif")
$InputBenutzernameSA = GUICtrlCreateInput($BenutzernameALT, 264, 112, 337, 31)
GUICtrlSetFont(-1, 16, 400, 0, "Courier New")
GUICtrlSetState(-1, $GUI_DISABLE)
$InputBenutzernameACHIM = GUICtrlCreateInput($BenutzernameNEU, 264, 160, 337, 31)
GUICtrlSetFont(-1, 16, 400, 0, "Courier New")
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group2 = GUICtrlCreateGroup(" Passwort setzen ", 8, 232, 617, 169)
GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif")
$InputPasswort1 = GUICtrlCreateInput("", 264, 264, 337, 31, BitOR($ES_PASSWORD,$ES_AUTOHSCROLL))
GUICtrlSetFont(-1, 16, 400, 0, "Courier New")
$InputPasswort2 = GUICtrlCreateInput("", 264, 312, 337, 31, BitOR($ES_PASSWORD,$ES_AUTOHSCROLL))
GUICtrlSetFont(-1, 16, 400, 0, "Courier New")
$Label7 = GUICtrlCreateLabel("Neues Passwort:", 24, 267, 123, 24)
GUICtrlSetFont(-1, 12, 400, 0, "MS Sans Serif")
$Label5 = GUICtrlCreateLabel("Passwort wiederholen:", 24, 315, 162, 24)
GUICtrlSetFont(-1, 12, 400, 0, "MS Sans Serif")
$Label6 = GUICtrlCreateLabel("Anforderungen an Passwort: Mindestens 7 Zeichen, mindestens ein GROSSbuchstabe, (A-Z)", 16, 352, 549, 20, $SS_CENTER)
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
$Label8 = GUICtrlCreateLabel("mindestens ein Kleinbuchstabe (a-z), mindestens eine Zahl (0-9)", 16, 368, 380, 20, $SS_CENTER)
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
GUICtrlCreateGroup("", -99, -99, 1, 1)
$ButtonPasswortSetzen = GUICtrlCreateButton("Passwort setzen", 8, 456, 297, 41, $WS_GROUP)
GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif")
$ButtonAbbrechen = GUICtrlCreateButton("Abbrechen", 328, 456, 297, 41, $WS_GROUP)
GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif")
$Fehlermeldungen = GUICtrlCreateLabel("Fehlermeldungen", 8, 408, 617, 41, BitOR($SS_CENTER,$SS_CENTERIMAGE,$WS_BORDER))
GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0xFFFF00)
GUICtrlSetBkColor(-1, 0xFF0000)
GUICtrlSetState(-1, $GUI_HIDE)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
 $nMsg = GUIGetMsg()
 Switch $nMsg
  Case $GUI_EVENT_CLOSE
   Exit
  Case $ButtonAbbrechen
   Exit
  Case $ButtonPasswortSetzen
   $Passwort1 = GUICtrlRead($InputPasswort1)
   $Passwort2 = GUICtrlRead($InputPasswort2)
   ;Test 1: stimmen die beiden Passwörter überein
   If $Passwort1 <> $Passwort2 Then
    GUICtrlSetData($Fehlermeldungen,"Passwörter stimmen nicht überein!")
    GUICtrlSetState($Fehlermeldungen,$GUI_SHOW)
    ContinueCase
   EndIf
   ;Test 2: Ist das Passwort lang genug? 7 Zeichen sind minimum
   If StringLen($Passwort1) < 7 Then
    GUICtrlSetData($Fehlermeldungen,"Passwort zu kurz! Mindestens 7 Zeichen!")
    GUICtrlSetState($Fehlermeldungen,$GUI_SHOW)
    ContinueCase
   EndIf
   ;Test 3: Ist eine Zahl enthalten?
   If StringRegExp($Passwort1,"[0-9]",0) = 0 Then
    GUICtrlSetData($Fehlermeldungen,"Keine Zahl im Passwort enthalten!")
    GUICtrlSetState($Fehlermeldungen,$GUI_SHOW)
    ContinueCase
   EndIf
   ;Test 4: Ist ein Kleinbuchstabe enthalten?
   If StringRegExp($Passwort1,"[a-z]",0) = 0 Then
    GUICtrlSetData($Fehlermeldungen,"Kein Kleinbuchstabe (a-z) Passwort enthalten!")
    GUICtrlSetState($Fehlermeldungen,$GUI_SHOW)
    ContinueCase
   EndIf
   ;Test 5: Ist ein Grossbuchstabe enthalten?
   If StringRegExp($Passwort1,"[A-Z]",0) = 0 Then
    GUICtrlSetData($Fehlermeldungen,"Kein Grossbuchstabe (A-Z) Passwort enthalten!")
    GUICtrlSetState($Fehlermeldungen,$GUI_SHOW)
    ContinueCase
   EndIf
   ;Wenn wir bis hierher kommen ist alles in Ordnung - ContinueCase würde uns sonst überspingen
   GUICtrlSetData($Fehlermeldungen,"Passwort ist OK!")
   GUICtrlSetBkColor($Fehlermeldungen,0x00DD00) ;Hintergrund auf Gruen statt Rot
   GUICtrlSetColor($Fehlermeldungen, 0x000000) ;Schriftfarbe Schwarz statt Gelb
   GUICtrlSetState($Fehlermeldungen,$GUI_SHOW) ;Und Anzeigen (vorher unsichtbar)
   GUICtrlSetState ($ButtonPasswortSetzen,$GUI_DISABLE) ; Schaltfäche für Kennwort ändern deaktivieren
   Sleep (2000) ; Kunstpause
   GUICtrlSetData($Fehlermeldungen,"Setze nun Passwort ..... ")
   ;wir nutzen das Tool pspasswd.exe von Sysinternals als externen Befehl. Zwar können wir Grundsätzlich auch per AutoIt auf das AD zugreifen - aber wir wollen das in einer
   ;anderen Domäne tun, müssten uns also vorher erst an der anderen Domäne passend anmelden.
   ;Zudem schummeln wir und ändern die Passwörter über einen zentralen Admin-Account - so müssen wir das alte vorher nicht wissen.
   ;Das pspasswd.exe Tool zeigt beim ersten mal aber einen EULA-Dialog an. Damit dieser eben nicht kommt, setzen wir den entsprechenden Registrywert
   RegWrite("HKEY_CURRENT_USER\Software\Sysinternals\PsPasswd", "EulaAccepted", "REG_DWORD", "1")
   ;Nun der leichte Teil - passwd aufrufen:
   $Rueckgabewert = RunWait ($Pfadpspasswd & " \\" & $DomainControllerZielDomain & " -u " & $AdminBenutzer & " -p " & $AdminBenutzerPasswort & " " & $BenutzernameNEU & " " & $Passwort1,@WindowsDir,@SW_HIDE)
   ;$Rueckgabewert = 0
   ;MsgBox(0,"Rückgabewert",$Rueckgabewert)
   If $Rueckgabewert = 0 Then
    GUICtrlSetData ($Fehlermeldungen,"Passwort wurde erfolgreich geändert!")
    GUICtrlSetData ($ButtonAbbrechen,"BEENDEN")
   Else
    GUICtrlSetData($Fehlermeldungen,"Passwort konnte nicht gesetzt werden !")
    GUICtrlSetBkColor($Fehlermeldungen,0xFF00) ;Hintergrund auf Rot
    GUICtrlSetColor($Fehlermeldungen, 0xFFFF00) ;Schriftfarbe Gelb
    GUICtrlSetState ($ButtonPasswortSetzen,$GUI_ENABLE)
   EndIf
   RegDelete ("HKEY_CURRENT_USER\Software\Sysinternals\PsPasswd")
   ;MsgBox(0,"test",$GUI_HIDE)
 EndSwitch
WEnd


BLinz

84 Monaten zuvor
Punktzahl 0++

Wenn Ihr nur für einzelne Remote das Passwort ändern wollte (also von Rechner A auf Rechner B oder von Domäne A für einen Benutzer in Domäne B) geht es auch einfacher ohne Programm:

http://znil.…nenbenutzer)

Anonymer Benutzer #1

70 Monaten zuvor
Punktzahl 0++
In der Version 1.23 von pspasswd.exe ist ein Fehler... weiß jemand woher ich die alte Version bekommen, möchte auch ein ähnliches Skript verwenden...

BLinz

69 Monaten zuvor
Punktzahl 0++
Schreib mir eine Mail.
Kommentar hinzufügen
znilwiki freut sich über alle Kommentare. Sofern du nicht anonym bleiben möchtest, trage deinen Namen oder deine Email-Adresse ein oder melde dich an. Du kannst das Feld auch einfach leer lassen.