Active Directory Benutzerdaten abfragen

  • Hi

    ich habe hier einen Codeschnipsel von einem Vorgänger hinterlassen bekommen.
    Allerdings sprengt der meinen Autoit Horizont noch.
    EDIT: War der falsche Schnipsel. Jetzt stimmts.

    Spoiler anzeigen
    [autoit]

    Func _GetUserAD()
    Global $UserAccountControl, $samAccountName,$FirstName, $LastName, $title, $PasswordLastChanged, $IsAccountLocked, $DaysLeft,$msg,$icon ,$AnzeigeDatPwdExpires, $Counter
    Local $Found = 0
    $AnmeldeUser = @UserName

    [/autoit] [autoit][/autoit] [autoit]

    $LogonServer = "dc.domain.local"

    [/autoit] [autoit][/autoit] [autoit]

    $serverName = $LogonServer
    $baseStr = "DC=DOMAIN,DC=local"

    [/autoit] [autoit][/autoit] [autoit]

    $filterStr = "(&(objectCategory=Person) (objectClass=user) )"

    [/autoit] [autoit][/autoit] [autoit]

    $ado = ObjCreate("ADODB.Connection") ; erstellt eine Instanz des Objektes ADODB.Connection
    $ado.Provider = "ADSDSOObject"

    [/autoit] [autoit][/autoit] [autoit]

    $ado.Open ("ADS-Search" )

    [/autoit] [autoit][/autoit] [autoit]

    $adoCmd = ObjCreate("ADODB.Command")
    $adoCmd.ActiveConnection = $ado
    $adoCmd.Properties("Page Size") = 1000
    $adoCmd.Properties("Cache Results") = 1
    $adoCmd.CommandText = "<LDAP://" & $serverName & "/" & $baseStr & ">;" & $filterStr & ";ADsPath;subtree"

    [/autoit] [autoit][/autoit] [autoit]

    _WriteLogData("Benutzereinträge für " & @UserName & " werden gesucht, auf Server " & StringReplace($LogonServer,"\",""))
    _WriteLogData("Benutzereinträge für " & @UserName & " werden gesucht, auf Server " & $LogonServer)
    _WriteLogData("Funktionsaufruf lautet : " & $adoCmd & " ")

    [/autoit] [autoit][/autoit] [autoit]

    $objectList = $adoCmd.Execute

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetData($lbl_info, @CRLF & @CRLF & "Ein Moment bitte," & @CRLF & @CRLF & "Ihre Benutzereinträge werden gesucht.")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $Counter = 1

    [/autoit] [autoit][/autoit] [autoit]

    While Not $objectList.EOF()

    [/autoit] [autoit][/autoit] [autoit]

    $user = ObjGet($objectList.Fields("ADsPath").value)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $samAccountName = $User.samAccountName

    [/autoit] [autoit][/autoit] [autoit]

    If stringlower($samAccountName) = StringLower($AnmeldeUser) Then

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $UserAccountControl = $user.UserAccountControl
    $FirstName = $User.FirstName
    $LastName = $User.LastName
    $title = $User.title
    $PasswordLastChanged = $User.PasswordLastChanged ;pwdLastSet
    $IsAccountLocked = $User.IsAccountLocked

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _WriteLogData("Benutzereintrag für " & $FirstName & " " & $LastName & " wurde gefunden. Accountcontrol = " & $UserAccountControl)

    [/autoit] [autoit][/autoit] [autoit]

    If $UserAccountControl = 512 or $UserAccountControl = 544 Then

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $DaysLeft = _DatumBerechnen($PasswordLastChanged)
    MsgBox(0,"", "Ihr Passwort läuft in " & $DaysLeft & " Tagen, am " & $AnzeigeDatPwdExpires & ", ab." & @CRLF & @CRLF & "Bitte ändern Sie das Passwort bei der nächsten Gelegenheit!")
    _WriteLogData("Datum wurde berechnet. Passwortgültigkeitsdauer=" & $DaysLeft & " Tage")

    [/autoit] [autoit][/autoit] [autoit]

    ;~ If $DaysLeft <= 10 Then
    ;~ If $DaysLeft > 0 Then
    ;~ Switch $DaysLeft
    ;~ Case 1
    ;~ $msg = "Ihr Passwort läuft heute ab" & @CRLF & @CRLF & "Bitte ändern Sie das Passwort umgehend!"
    ;~ ;$icon = 16 ; 16=Stop-sign icon
    ;~ $icon = 64 ;
    ;~ Case 2
    ;~ $msg = "Ihr Passwort läuft morgen ab" & @CRLF & @CRLF & "Bitte ändern Sie das Passwort!"
    ;~ ;$icon = 16 ; 16=Stop-sign icon
    ;~ $icon = 64 ;
    ;~ Case Else
    ;~ $msg = " Ihr Passwort läuft in " & $DaysLeft & " Tagen, am " & $AnzeigeDatPwdExpires & ", ab." & @CRLF & @CRLF & "Bitte ändern Sie das Passwort bei der nächsten Gelegenheit!"
    ;~ $icon = 64 ; 64=Information-sign icon consisting of an 'i' in a circle
    ;~ EndSwitch

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    MsgBox($icon,"Hallo " & $title & " " & $LastName & ".", $msg)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;~ EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    EndIf
    EndIf
    $objectList.MoveNext()
    $Counter += 1

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Wend

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    If $IsAccountLocked = True Then
    GUICtrlSetBkColor($lbl_info, 0xFF0000)
    GUICtrlSetData($lbl_info, @CRLF & "Ihr Konto wurde gesperrt." & @CRLF & @CRLF & "Bitte wenden Sie sich an den IT- Support.")
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;-------------------------------------------------------------------------------------------------------------------------------------------------------------
    Func _DatumBerechnen($ChangedDate)

    [/autoit] [autoit][/autoit] [autoit]

    local $AnzeigeDatPwdChanged, $Day2Change, $Date2Change
    local $HeuteJMT = _NowCalcDate()
    local $DatChangedJMT = StringMid( $ChangedDate, 1, 4) & "/" & StringMid( $ChangedDate, 5, 2) & "/" & StringMid( $ChangedDate, 7, 2)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;MsgBox(16,"1",$HeuteJMT & " " & $DatChangedJMT )
    $Date2Change = _DateAdd('d',90,$DatChangedJMT)
    $Day2Change = _DateDiff( 'd',_NowCalc(),$Date2Change)

    [/autoit] [autoit][/autoit] [autoit]

    ;MsgBox(16,"2",$Day2Change & " " & $Date2Change)

    [/autoit] [autoit][/autoit] [autoit]

    $AnzeigeDatPwdExpires = StringMid( $Date2Change, 9, 2) & "." & StringMid( $Date2Change, 6, 2) & "." & StringMid( $Date2Change, 1, 4)

    [/autoit] [autoit][/autoit] [autoit]

    ;MsgBox(16,"3",$AnzeigeDatPwdExpires)

    [/autoit] [autoit][/autoit] [autoit]

    Return $Day2Change
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    ich habe ein Tool gebaut mit dem sich unsere Aussendienstler einwählen. Diese Function stammt aus einer Vorgängerversion, hat aber recht lange gedauert und den ganzen "Einwahlprozess" verlängert (nicht zu wörtlich nehmen:-)). Und da es nach meinem damaligen Kenntnisstand nicht nötig war ist diese Function rausgeflogen.

    Der unangenehme Nebeneffekt ist dass die User jetzt nicht mehr angezeigt bekommen dass ihr Passwort abläuft. :S

    Das Problem ist dass ich nicht wirklich verstehe was in dieser Function passiert und ob das alles nötig ist 8| .

    Kann mir jemand sagen was da passiert, oder wo ich mich da einlesen kann?

    Schön wäre es wenn ich eine Meldung ausgeben kann (Achtung! Ihr Passwort läuft in x Tagen ab) und vielleicht ob das KOnto gesperrt ist. Bei drei Logon- Fehlversuchen werden die Kontos gesperrt, und das passiert "leider" sehr oft.

    3 Mal editiert, zuletzt von Camulus (13. Oktober 2011 um 16:52)

  • Dein Skript braucht so lange, weil es ALLE User beim Domänencontroller anfragt, die kompletten Daten überträgt und dann erst im Skript jenen Datensatz raussucht, den es benötigt.
    Mein Active Directory UDF (für Download siehe bitte meine Signatur) tut dies und noch viel mehr.
    Du kannst auf jeden prüfen, wie lange das Passwort noch gültig ist.
    Sollte das Konto gesperrt sein, so kann der User sicht nicht mehr anmelden um diese Information anzuzeigen.
    Auf welchem Betriebssystem läuft Dein Skript? Vielleicht kann man an die Info doch noch kommen?

    [autoit]

    #include <ad.au3>
    _AD_Open()
    $aUserAttributes = _AD_GetObjectProperties(@UserName, "GivenName,sn,Title")
    $aPWInfo = _AD_GetPasswordInfo()
    MsgBox(16, "AD Data","Firstname: " & $aUserAttributes[1][1] & @CRLF & _
    "Lastname: " & $aUserAttributes[2][1] & @CRLF & _
    "Title: " & $aUserAttributes[3][1] & @CRLF & _
    "Passwort läuft ab am: " & $aPWInfo[9])
    _AD_Close()

    [/autoit]
  • Zitat


    Sollte das Konto gesperrt sein, so kann der User sicht nicht mehr anmelden um diese Information anzuzeigen.

    Ja diesen geistigen Höhenflug von mir hab ich auch schon durchschaut.

    Kann ich denn in meinem Script "schnell verhindern" dass ALLE User abgefragt werden?

    Vielen Dank für dein Script.
    Verstehen würde ich es allerdiungs trotzdem gerne wo bei mir der Haken ist.
    Ich hab den ganzen AD Abfrage Mechanismus noch nicht verstanden.

  • Ersetze

    [autoit]

    $filterStr = "(&(objectCategory=Person) (objectClass=user) )"

    [/autoit]

    durch

    [autoit]

    filterStr = "(&(objectCategory=Person)(objectClass=user)(sAMAccountName=" & @UserName & "))"

    [/autoit]

    Solltest Du Windows 7 im Einsatz haben, dann kann Dir mein UDF auch schöne Details zurückgeben, warum sich der User gerade nicht anmelden kann.
    Grundsätzlich würde ich Dein Skript auf mein UDF umbauen, da z.B. das Thema Error Handling bei Dir überhaupt nicht abgehandelt wird.

  • Oh man bin ich berscheuert...
    $filterStr = "(&(objectCategory=Person)(objectClass=user)(sAMAccountName=" & @UserName & "))"

    Da war ich schon aber zu dusselig den String richtig zusammen zusetzen :pinch:

    Danke dir!

  • Vista müsste auch schon gehen.
    Wenn ein User sich nicht anmelden kann, dann kann _AD_Open folgende Info zurückgeben:

    ; 525 - user not found
    ; 52e - invalid credentials
    ; 530 - not permitted to logon at this time
    ; 532 - password expired
    ; 533 - account disabled
    ; 701 - account expired
    ; 773 - user must reset password

    Wenn Du das brauchen kannst, dann könnte man das und Dein bisheriges Skript in eine kleine FUnktion einpacken.

  • Hi (Water),

    wie würde dass denn funktionieren? Muss ich dann nur

    [autoit]

    Func _AD_GetLastADSIError()

    [/autoit]

    aufrufen und mir was zurückgeben lassen?
    Eigentlich kann es doch garnicht funktionieren oder? Die VPN Einwahl scheitert doch wenn der User gesperrt ist o.ä. und ohne VPN EInwahl gibt es keine AD Abfrage.

    Einmal editiert, zuletzt von Camulus (6. Juli 2012 um 09:14)

  • Wenn Du Dich nicht mehr anmelden kannst, dann hast Du schlechte Karten. Aber der Support sieht z.B. warum sich der Benutzer nicht mehr anmelden kann und die entsprechenden Aktionen einleiten.
    Der Code für die erweiterte Fehlerinfo sieht dann z.B. so aus:

    [autoit]

    If @error > 8 Then
    MsgBox(16, "Active Directory Functions", "The logon was not succcessful!" & @CRLF & @CRLF & "@error: " & @error & ", @extended: " & @extended & _
    @CRLF & @CRLF & "Extended error information will be displayed")
    Global $aError = _AD_GetLastADSIError()
    _ArrayDisplay($aError)
    EndIf

    [/autoit]
  • Ahhh dann hab ich das falsch verstanden.
    Inetressant wäre es höchstens den Aussendienstlern eine Meldung auszugeben wie: "VPN Verbindung kann nicht aufgebaut werden weil Passwort abgelaufen."