Windows login daten überprüfen und returnen

  • Hallo zusammen,

    dies klappt soweit, er stellt den user und das passwort rein, jetzt brauche ich aber davor eine überprüfung ob dies überhaupt geklappt hat, also das Passwort auch wirklich das richtige ist. Geht das mit Autoit? so ein login im hintergrund, und den return davon auswerten.

    [autoit]

    #include <WindowsConstants.au3>
    #NoTrayIcon

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

    $password = InputBox("Windows Autologin","For configuring the Windows autologin, we need the password of the user: "&@LogonDomain&"\"&@UserName&""&@CRLF&"Please type in the password.","","*")

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

    RegWrite("HKLM64\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon","AutoAdminLogon","REG_SZ","1")
    RegWrite("HKLM64\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon","DefaultUserName","REG_SZ",@UserName)
    RegWrite("HKLM64\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon","DefaultDomainName","REG_SZ",@LogonDomain)
    RegWrite("HKLM64\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon","DefaultPassword","REG_SZ",$password)

    [/autoit]

    Einmal editiert, zuletzt von cashmoney (28. Juni 2011 um 16:22)

  • Das geht und zwar mit meinem Active Directory UDF (für download siehe bitte meine Signatur unten). Ruf _AD_Open auf und übergieb UserId/Passwort. Der Returncode bzw. bei Fehlern der Aufruf von _AD_GetLastADSIError() gibt Dir genaue Informationen was nicht geklappt hat. Siehe dazu _AD_Open.au3.
    Beispiel:

    [autoit]

    #include <AD.au3>
    ; Open Connection to the Active Directory
    If _AD_Open($SUserId, $SPassword) Then
    MsgBox(64, "Active Directory Functions", "Logon was succcessful!")
    ElseIf @error <= 8 Then
    MsgBox(16, "Active Directory Functions", "The logon was not succcessful!" & @CRLF & @CRLF & "@error: " & @error & ", @extended: " & @extended)
    Else
    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
    ; Close Connection to the Active Directory
    _AD_Close()

    [/autoit]


    Folgende Fehler bringt _AD_GetLastADSIError:
    ; 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

  • hi water, schaut schonmal sehr gut aus!
    jetzt will ich das ding mit parametern von einem anderen programm starte, und es soll zurückgeben ob die verbindung erfolgreich war, oder nicht!
    Mehr brauch ich nicht.
    Also den Exitcode schaff ich auf 1 bzw 0 zu setzen 0 für erfolgreich 1 für nicht erfolgreich. Ich weiß nur nicht wie ich das an das andere programm zurückgebe. %ERRORLEVEL% gibt mir irgendwie immer 0 zurück...

    jemand noch ne idee?

    [autoit]

    #include <AD.au3>
    ; Open Connection to the Active Directory

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

    $SUserId = $CmdLine[1]
    $SPassword = $CmdLine[2]

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

    If _AD_Open($SUserId, $SPassword) Then
    ;MsgBox(64, "Active Directory Functions", "Logon was succcessful!")
    ElseIf @error <= 8 Then
    ;MsgBox(16, "Active Directory Functions", "The logon was not succcessful!" & @CRLF & @CRLF & "@error: " & @error & ", @extended: " & @extended)
    Global $aError = _AD_GetLastADSIError()
    ;_ArrayDisplay($aError)
    exit 1
    Else
    ;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)
    Exit 1
    EndIf
    ; Close Connection to the Active Directory
    _AD_Close()

    [/autoit]

    EDIT: halt ich brauch garkein exit! ich lass den rest einfach im autoit programm weitermachen! ^^

    EDIT2: ich brauch doch ein rückgabewert, damit ich weiß ob das programm, welches das script aufruft, nochmal das script aufruft, also bei nicht erfolgreicher überprüfung des users, oder ob es weiter laufen kann.

    Einmal editiert, zuletzt von cashmoney (28. Juni 2011 um 14:41)

  • Hängt davon ab ... Wenn das aufrufende Programm ein AutoIt Skript ist, dann kannst Du die Prüfroutine wie jedes UDF mit #include inbinden und als normale Funktion aufrufen.

  • nope ist es eben nicht, ist in WISE geschrieben falls es dir was sagt, darüber werden auch die parameter vom User und Passwort übergeben, das WISE script hält dann solange an bis das autoit script fertig ist. an dieser stelle kann ich noch ein return ans wise script schicken, nur wie?

  • Mit dem Return kannst Du ja einen Ergebniswert zurückgeben.

  • klappt auch mit exitcode hab ich gerade rausgefunden! jetzt hab ich nur ein problem bei usern, die KEIN passwort haben, wenn ich den zweiten parameter weglass, bzw es halt nichts drin steht, bekomm ich ein auto it fehler-.-

    hier noch mein code, beim debugen habe ich gerade gemerkt das ich JEDESMAL als return ne 1 bekomme, also fehlgeschlagen! wenn ich aber _ArrayDisplay($aError) anzeigen lasse, steht da succesfuly.

    was mach ich falsch~~

    [autoit]

    #include <AD.au3>
    #include <WindowsConstants.au3>
    #NoTrayIcon
    ; Open Connection to the Active Directory

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

    $SUserId = @UserName
    if $CmdLine[0] = 0 Then
    $SPassword = ""
    Else
    $SPassword = $CmdLine[1]
    EndIf

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

    If _AD_Open($SUserId, $SPassword) Then
    ;MsgBox(64, "Active Directory Functions", "Logon was succcessful!")
    ElseIf @error <= 8 Then
    ;MsgBox(16, "Active Directory Functions", "The logon was not succcessful!" & @CRLF & @CRLF & "@error: " & @error & ", @extended: " & @extended)
    Global $aError = _AD_GetLastADSIError()
    _ArrayDisplay($aError)
    exit 1
    Else
    ;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)
    Exit 1
    EndIf
    ; Close Connection to the Active Directory
    _AD_Close()

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

    if @OSArch = "x86" Then
    RegWrite("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon","AutoAdminLogon","REG_SZ","1")
    RegWrite("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon","DefaultUserName","REG_SZ",@UserName)
    RegWrite("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon","DefaultDomainName","REG_SZ",@LogonDomain)
    RegWrite("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon","DefaultPassword","REG_SZ",$SPassword)
    Else
    RegWrite("HKLM64\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon","AutoAdminLogon","REG_SZ","1")
    RegWrite("HKLM64\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon","DefaultUserName","REG_SZ",@UserName)
    RegWrite("HKLM64\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon","DefaultDomainName","REG_SZ",@LogonDomain)
    RegWrite("HKLM64\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon","DefaultPassword","REG_SZ",$SPassword)
    EndIf
    exit 0

    [/autoit]

    ey kann es sein das diese script nur bei Rechnern in Domaine funktioniert?

  • ey kann es sein das diese script nur bei Rechnern in Domaine funktioniert?

    Richtig. Denn _AD_Open hat ja keine Ahnung mit welcher Domäne bzw. welchem Domain Controller es sich verbinden soll.
    Wie man das macht, findest Du im Wiki zu meinem UDF.

  • ok gut, wenn ich keine domäne angebe ist es doch die aktuelle, ist der rechner in keiner domäne so verwendet er doch "Rechnername\Username" also den Rechnername als Domäne? das funktioniert trotzdem nicht, auch wenn ich explizit den Rechnername als Domäne angebe.
    EDIT: habs verstanden^^ mit der domäne

    aber weißte was ich grad noch cooleres gemerkt habe, mit _AD_Open() ohne parameter kann ich ja auch auf die credentials zugreifen, kann ich davon auch den Username und das Passwort übergeben damit er die Registry einträge setzt? dann würde ich mir mehr code sparen...

  • ok gut, wenn ich keine domäne angebe ist es doch die aktuelle, ist der rechner in keiner domäne so verwendet er doch "Rechnername\Username" also den Rechnername als Domäne? das funktioniert trotzdem nicht, auch wenn ich explizit den Rechnername als Domäne angebe.

    aber weißte was ich grad noch cooleres gemerkt habe, mit _AD_Open() ohne parameter kann ich ja auch auf die credentials zugreifen, kann ich davon auch den Username und das Passwort übergeben damit er die Registry einträge setzt? dann würde ich mir mehr code sparen...

    Das Active Directory UDF ist - wie der Name schon sagt - nur für das Active Directory da. Wenn Du Dich lokal anmelden möchtest, dann funktioniert das mit diesem UDF nicht.

    Das AD UDF setzt keine Registry Einträge. Das geht also nicht.

  • Das AD UDF setzt keine Registry Einträge. Das geht also nicht.

    ja genau, aber es prüft doch die verbindung mit dem aktuellen user, also müsste ich doch irgendwie diesen User und sein passwort eintragen können mit meinem Script!? so als übergabeparameter von dem UDF an das Script?

  • ja genau, aber es prüft doch die verbindung mit dem aktuellen user, also müsste ich doch irgendwie diesen User und sein passwort eintragen können mit meinem Script!? so als übergabeparameter von dem UDF an das Script?

    Das UDF hat zu keinem Zeitpunkt Zugriff auf das Passwort. Den aktuellen User und die Domäne könnte man noch mit AutoIt Bordmitteln herausfinden. Auf das Passwort kommen wir aber nicht hin (Securitygründe). Die vom UDF angesprochene Schnittstelle zum Active Directory verwendet die aktuellen Credentials wenn kein User/Passwort angegeben wurde.

  • Alles klar, dann hab ichs jetzt verstanden. Dann mal vielen dank für deine hilfe! hast mich aufjedenfall nen großen schritt voran gebracht ;)

  • :)