AutoIt:Remote Domain Password Changer
Aus znilwiki
(Weitergeleitet von AutoIT:Remote Domain Password Changer)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:
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