Active Directory Funktionen - Neue Version 1.5.0.0 freigegeben!


  • Es geht um AD_JoinComputer
    "The JoinDomainOrWorkgroup method is available only on Windows XP computer and Windows Server 2003 or later." Ist damit gemeint das die Funktion nur unter XP oder höher funktioniert? Wäre eine erweiterung für w2k möglich?

    Hab ich es nur übersehen oder fehlt das "Gegenteil" der Funktion also _JoinWorkgroup?


    Danke für Deine Vorschläge. Hier meine Kommentare:

    • Ich möchte die Funktionen so einfach wie möglich halten (analog zur Originalquelle von John Clelland adfunctions.au3). Daher sollte der Benutzer die Funktionen wie gewünscht kombinieren. Also _AD_ObjectExists, _AD_DeleteObject, _AD_CreateComputer etc. Ich denke sonst wird das UDF einfach zu komplex.
      Sollten aber mehrere Benutzer solche Funktionen wünschen, dann überlege ich mir das noch mal.
    • Korrekt. Die verwendete WMI-Funktion gibt es nur unter Windows XP und höher und auch der Server muß Windows Server 2003 oder höher sein (so steht es zumindest in den Links auf die MS KB Artikel). Für W2K müsste ein anderer Ansatz gewählt werden.
      Hat jemand Bedarf an einer W2K Lösung?
    • Die Funktion_AD_UnJoinDomain fehlt tatsächlich (noch).
      Hat jemand Bedarf an dieser Funktion?
  • Die Idee hinter der Änderung war ist ganz einfach, Windows geht standardmäßig den von mir beschriebenen weg.
    Für Leute mit weniger Programmiererfahrung ist dadurch leichter nachvollziehbar was die Funktion macht und ist entsprechend einfacher anzuwenden.

    Als ich meinen Beitrag schrieb war bei uns zumindest noch w2k im Einsatz. Ich vermute daher einfach mal, dass es auch noch in anderen Firmen genutzt wird,
    von daher vllt nicht ganz nutzlos diese Option zusätzlich einzubauen.

    Bei uns wäre der Bedarf an einer _AD_UnJoinDomain Funktion durchaus gegeben. Wie man an dem Post sieht kommt/kam es öfter mal zu Rechnerwechseln.
    Die alten sollten dann aus der AD entfernt werden damit es da nicht zu unübersichtlich wird und ein Haufen toter Konten existiert.
    Vorm abbauen einfach ein Skript au den Rechnern laufen lassen wäre da schon eine feine Sache.

    Alternativ bliebe noch das Argument "Der-Vollständigkeit-Halber" :)

  • Zum Thema W2K
    Vor XP/W2003 muss man für Join/Unjoin einen ganz anderen Ansatz wählen. Ich habe dazu noch kein schlaues Skript gefunden.

    Zum Thema UnjoinDomain
    Hier ist mein erster Versuch.

    Spoiler anzeigen
    [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _AD_UnJoinDomain
    ; Description ...: Unjoins the computer from its current domain and disables the computer account.
    ; Syntax.........: _AD_UnJoinDomain($sAD_Computer[, $sAD_User, $sAD_Password])
    ; Parameters ....: $sAD_Computer - Computername to unjoin from the domain
    ; $sAD_User - Optional: User with admin rights to unjoin the computer from the domain (NetBIOSName)
    ; +(Default = credentials under which the script is run are used)
    ; $sAD_Password - Optional: Password for $sAD_User. (Default = credentials under which the script is run are used)
    ; Return values .: Success - 1
    ; Failure - 0, @error set
    ; |1 - $sAD_Computer account does not exist in the domain
    ; |2 - $sAD_User does not exist in the domain
    ; |3 - WMI object could not be created. See @extended for error code. See remarks for further information
    ; |4 - The computer is a member of another or no domain
    ; |5 - Unjoining the domain was not successful. See @extended for error code. See remarks for further information
    ; Author ........: Thomas Rupp
    ; Modified.......:
    ; Remarks .......: The domain from which the computer is unjoined from has to be the domain the user logged on to using AD_Open.
    ; You have to reboot the computer after a successful unjoin from the domain.
    ; The UnjoinDomainOrWorkgroup method is available only on Windows XP computer and Windows Server 2003 or later.
    ; Related .......:
    ; Link ..........: http://gallery.technet.microsoft.com/ScriptCenter/e…e9-db8871f79f62, http://technet.microsoft.com/en-us/library/ee692588.aspx, http://msdn.microsoft.com/en-us/library/aa392154(VS.85).aspx
    ; Example .......: Yes
    ; ===============================================================================================================================
    Func _AD_UnJoinDomain($sAD_Computer, $sAD_User = "", $sAD_Password = "")

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

    If _AD_ObjectExists($sAD_Computer & "$") = 0 Then Return SetError(1, 0, 0)
    If $sAD_User <> "" And _AD_ObjectExists($sAD_User) = 0 Then Return SetError(2, 0, 0)
    Local $iAD_Result
    Local $sAD_DomainName = StringReplace(StringReplace($sAD_DNSDomain, "DC=", ""), ",", ".")
    ; Create WMI object
    Local $oAD_Computer = ObjGet("winmgmts:{impersonationLevel=Impersonate}!\\" & $sAD_Computer & "\root\cimv2:Win32_ComputerSystem.Name='" & $sAD_Computer & "'")
    If Not IsObj($oAD_Computer) Or @error <> 0 Then Return SetError(3, @error, 0)
    If $oAD_Computer.Domain <> $sAD_DomainName Then Return SetError(4, 0, 0)
    ; UnJoin domain
    If $sAD_User <> "" Then
    $iAD_Result = $oAD_Computer.UnjoinDomainOrWorkGroup($sAD_Password, $sAD_DomainName & "\" & $sAD_User, 2)
    Else
    $iAD_Result = $oAD_Computer.UnjoinDomainOrWorkGroup(Default, Default, 2)
    EndIf
    If $iAD_Result <> 0 Then Return SetError(5, $iAD_Result, 0)
    Return 1

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

    EndFunc ;==>_AD_UnJoinDomain

    [/autoit]


    Habe die Skripte aus dem Internet und auf AutoIt umgeschrieben.
    Kannst Du das - falls möglich - testen und mir berichten? Das wäre fein!

  • Also mein Testskript sieht so aus:

    Spoiler anzeigen
    [autoit]

    #include <AD.au3>

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

    MsgBox(0,"AD-Open",_AD_Open("****", "****", "*****", "*******"))

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

    If _AD_UnJoinDomain(@ComputerName, "*******", "******") = 0 Then
    MsgBox(0,"Fehler Unjoin", @error)
    EndIf

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

    MsgBox(0,"AD-Close",_AD_Close())
    Exit

    [/autoit]

    beim Aufruf von "AD-UnjoinDomain" bekomm ich allerdings als Rückgabe 0 und als Fehlernummer (@error) 1 geliefert. Das Computerkonto existiert aber.
    Ist das eigentlich richtig, dass UnjoinDomain mit den Rechten ausgeführt wird mit denen das Skript läuft
    anstatt mit den Benutzerangaben die in AD_Open eingetragen sind?

    (Würde ja bedeuten dass die angaben doppelt gemacht werden müssten)

    Ist das Absicht, dass AD_Close gar keinen Rückgabewert hat?

    3 Mal editiert, zuletzt von Bitboy (30. März 2010 um 09:58)

  • Beim Aufruf von AD_Open bekomm ich allerdings schon die Fehlernummer 1 geliefert.

    @error = 1 bei _AD_Open() bedeutet, dass die Installation des Error Handlers einen Fehler lieferte. Die Funktion ObjEvent hat irgendein Problem. Auf welchen Wert wird @extended gesetzt?

    Zitat

    Ist das eigentlich richtig, dass UnjoinDomain mit den Rechten ausgeführt wird mit denen das Skript läuft
    anstatt mit den Benutzerangaben die in AD_Open eingetragen sind?


    Sehe ich auch so. Das liegt daran, dass _AD_Open() ADSI verwendet und die Join-Funktionen WMI. Die beiden wissen nichts voneinander. Mal sehen, ob ich das irgendwie kombinieren kann.

  • Was mir auffällt:

    • _AD_Open hat bei Dir nur 4 Parameter, 2 oder 5 sind aber für notwendig.
    • Meldest Du Dich in einer anderen Domäne an als der PC derzeit Mitglied ist? Falls nein, würde ein _AD_Open ohne Parameter reichen. Name und Password (für die notwendigen Unjoin Rechte) reicht dann (derzeit) beim Aufruf von _AD_UnjoinDomain.
    • Wie sieht das Format Deiner Parameter für _AD_Open und _AD_UnjoinDomain aus? Kannst die Daten ja durch "*" ersetzen, möchte nur wissen, ob Du z.B. die Userid als "**", "Domain\**" oder "**@domain.com" angibst.


    Stimmt, _AD_Close gibt nichts zurück. Passe ich in der nächsten Version an, so dass 1 oder ein Fehler zurückgegeben wird.

  • Hm, wusste nicht genau welche Parameter ich für die Funktion verwenden werden müssen

    Aus der Erklärung hab ich das so verstanden:

    AD_Open($Benutzername, $Password, $Domänenname, $Servername) Was der 5.Parameter $Configuration enthalten soll ist mir nicht ganz klar.
    Der Benutzernamen ist nur der Benutzername ohne Domäne, da ja der Domänenname als eigener Parameter übergeben wird.

    Habe mich zum Testen als lokaler Administrator am Rechner angemeldet (also ohne Domänenrechte).


    Damit die Angaben nicht wiederholt werden müssen, könnten beim Aufruf von AD_Open 2 globale Variablen definiert werden die Benutzername und Passwort enthalten.
    Beim Aufruf von AD_Close werden diese dann wieder auf "" gesetzt.

  • Es braucht immer 0, 2 oder 5 Parameter. Der 5. gibt den "Configuration naming context" an.
    Melde Dich mal ganz normal an der Domäne an und lass dir die Werte für $sAD_DNSDomain, $sAD_HostServer und $sAD_Configuration ausgeben. Dies sind dann die Parameter 3-5 für _AD_Open als lokaler Admin. Dann sollte der @error=1 bei _AD_UnjoinDomain weg sein.

  • Also, habs wie beschrieben ausprobiert und das scheint zu funktionieren.

    Die Werte der Variablen sind allerdings nur schwer/umständlich im vorfeld auf anderem Weg zu ermitteln.
    Ich frage mich wie windows selbst allein mit der angabe des Domänennamens auskommt.
    (Wäre eine schöne Vereinfachung der Funktion....) über die WMI Win32_NTDomain Funktion bekommt man jedenfalls nicht wirklich die erforderlichen angaben :(

    Was mir noch aufgefallen ist: Der Computer wird nach ausführen der Aktion in eine Arbeitsgruppe gepackt, die denselben namen hat wie die Domäne.
    Schön wäre es wenn man den Arbeitsgruppennamen selber als Parameter übergeben könnte.

    Aja, das entsprechende Computerkonto wird nicht automatisch durch die Funktion gelöscht oder deaktiviert.
    Edit: Obwohl ich grad gesehen hab, dass der entsprechende Parameter in der Funktion gesetzt ist.


    Falls noch ein Vorschlag gewünscht ist:
    Bei AD_JoinDomain könnte man die OU als zusätzlichen Parameter übergeben. Die WMI Funktion erlaubt dies ja ebenfalls über einen Parameter:
    Zitat: "OU=testOU, DC=domain, DC=Domain, DC=com"
    Müsste afaik nur so umgebaut werden:$param= "OU=" & $OU & ", " & $sAD_DNSDomain

    2 Mal editiert, zuletzt von Bitboy (31. März 2010 um 08:57)

  • Die Werte der Variablen sind allerdings nur schwer/umständlich im vorfeld auf anderem Weg zu ermitteln.
    Ich frage mich wie windows selbst allein mit der angabe des Domänennamens auskommt.
    (Wäre eine schöne Vereinfachung der Funktion....)


    Für JoinDomain würde bei genauer Betrachtung auch der Domänenname genügen. Ich prüfe vorher aber noch, ob es das Konto und den angegebenen User in der Domäne gibt und dafür brauche ich eine ADSI-Verbindung.

    Zitat

    Was mir noch aufgefallen ist: Der Computer wird nach ausführen der Aktion in eine Arbeitsgruppe gepackt, die denselben namen hat wie die Domäne.
    Schön wäre es wenn man den Arbeitsgruppennamen selber als Parameter übergeben könnte.


    Nach dem Unjoin muß ein Join in die Arbeitsgruppe gemacht werden. Ich überlege mir das bei Gelegenheit.

    Zitat

    Aja, das entsprechende Computerkonto wird nicht automatisch durch die Funktion gelöscht oder deaktiviert.
    Edit: Obwohl ich grad gesehen hab, dass der entsprechende Parameter in der Funktion gesetzt ist.


    Könnte eventuell ein Bug sein. Kannst Du bitte die Werte in den beiden Zeilen mit "UnjoinDomainOrWorkGroup" von 2 auf 4 setzen und nochmals testen?

    Zitat

    Falls noch ein Vorschlag gewünscht ist:
    Bei AD_JoinDomain könnte man die OU als zusätzlichen Parameter übergeben. Die WMI Funktion erlaubt dies ja ebenfalls über einen Parameter:
    Zitat: "OU=testOU, DC=domain, DC=Domain, DC=com"
    Müsste afaik nur so umgebaut werden:$param= "OU=" & $OU & ", " & $sAD_DNSDomain


    Da das Computer-Konto vor Aufruf der Funktion _AD_JoinDomain bereits bestehen muss, sehe ich keine Notwendigkeit für diesen Parameter. Wird ein zweites Comptuer-Konto beim Join angelegt? Falls ja, wo?

  • Neue Version von _AD_UnjoinDomain. Nun kannst Du als 2. Parameter die Workgroup angeben der der unjoined Computer zugewiesen wird.
    Ich kann es selbst nicht testen, also bitte Vorsicht!

    Spoiler anzeigen
    [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _AD_UnJoinDomain
    ; Description ...: Unjoins the computer from its current domain and disables the computer account.
    ; Syntax.........: _AD_UnJoinDomain($sAD_Computer[, $sAD_Workgroup [,$sAD_User, $sAD_Password]])
    ; Parameters ....: $sAD_Computer - Computername to unjoin from the domain
    ; $sAD_Workgroup - Optional: Workgroup the unjoined computer is assigned to (Default = Domain the computer was unjoined from)
    ; $sAD_User - Optional: User with admin rights to unjoin the computer from the domain (NetBIOSName)
    ; +(Default = credentials under which the script is run are used)
    ; $sAD_Password - Optional: Password for $sAD_User. (Default = credentials under which the script is run are used)
    ; Return values .: Success - 1
    ; Failure - 0, @error set
    ; |1 - $sAD_Computer account does not exist in the domain
    ; |2 - $sAD_User does not exist in the domain
    ; |3 - WMI object could not be created. See @extended for error code. See remarks for further information
    ; |4 - The computer is a member of another or no domain
    ; |5 - Unjoining the domain was not successful. See @extended for error code. See remarks for further information
    ; |6 - Joining the Computer to the specified workgroup was not successful. See @extended for error code
    ; Author ........: Thomas Rupp
    ; Modified.......:
    ; Remarks .......: The domain from which the computer is unjoined from has to be the domain the user logged on to using AD_Open.
    ; If no workgroup is specified then the computer is assigned to a workgroup named like the domain the computer was unjoined from.
    ; You have to reboot the computer after a successful unjoin from the domain.
    ; The UnjoinDomainOrWorkgroup method is available only on Windows XP computer and Windows Server 2003 or later.
    ; Related .......:
    ; Link ..........: http://gallery.technet.microsoft.com/ScriptCenter/e…e9-db8871f79f62, http://technet.microsoft.com/en-us/library/ee692588.aspx, http://msdn.microsoft.com/en-us/library/aa393942(VS.85).aspx
    ; Example .......: Yes
    ; ===============================================================================================================================
    Func _AD_UnJoinDomain($sAD_Computer, $sAD_Workgroup = "", $sAD_User = "", $sAD_Password = "")

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

    If _AD_ObjectExists($sAD_Computer & "$") = 0 Then Return SetError(1, 0, 0)
    If $sAD_User <> "" And _AD_ObjectExists($sAD_User) = 0 Then Return SetError(2, 0, 0)
    Local $iAD_Result
    Local $sAD_DomainName = StringReplace(StringReplace($sAD_DNSDomain, "DC=", ""), ",", ".")
    ; Create WMI object
    Local $oAD_Computer = ObjGet("winmgmts:{impersonationLevel=Impersonate}!\\" & $sAD_Computer & "\root\cimv2:Win32_ComputerSystem.Name='" & $sAD_Computer & "'")
    If Not IsObj($oAD_Computer) Or @error <> 0 Then Return SetError(3, @error, 0)
    If $oAD_Computer.Domain <> $sAD_DomainName Then Return SetError(4, 0, 0)
    ; UnJoin domain
    If $sAD_User <> "" Then
    $iAD_Result = $oAD_Computer.UnjoinDomainOrWorkGroup($sAD_Password, $sAD_DomainName & "\" & $sAD_User, 2)
    Else
    $iAD_Result = $oAD_Computer.UnjoinDomainOrWorkGroup(Default, Default, 2)
    EndIf
    If $iAD_Result <> 0 Then Return SetError(5, $iAD_Result, 0)
    If $sAD_Workgroup <> "" Then
    $iAD_Result = $oAD_Computer.JoinDomainOrWorkGroup($sAD_Workgroup, Default, Default, Default, Default)
    If $iAD_Result <> 0 Then Return SetError(6, $iAD_Result, 0)
    EndIf
    Return 1

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

    EndFunc ;==>_AD_UnJoinDomain

    [/autoit]
  • Sieht gut aus. Der Arbeitsgruppenname wird wie gewünscht geändert. Der Parameter muss tatsächlich auf 4 gesetzt werden damit das Computerkonto deaktiviert wird.

    Getestet hab ich mit Win XP SP 3 und das Skript als domain admin gestartet.

    Morgen probier ich dann folgendes:

    Win 7 Skript als domainadmin starten
    XP SP 3 Benutzerberechtigung als parameter übergeben
    Win 7 Benutzerberechtigung als parameter übergeben

  • Sieht gut aus.

    Schön, wenn mal was funzt ;)

  • So jetz mal die testergebnisse soweit ich gekommen bin:

    Ausführung als lokaler Administrator, XP SP 3

    AD_UnJoinDomain liefert 5 zurück wenn keine Angabe über Benutzer/Passwort gemacht werden (Die Angaben von AD_Open werden NICHT übernommen)
    AD_UnjoinDomain funktioniert wenn die Benutzerangaben von AD_Open "nochmal" als parameter übergeben werden.

    weiter bin ich leider nicht gekommen. Fehlen noch die Win 7 Tests

  • Hi BitBoy,

    hier nun die erweiterte Funktion die entweder die Credentials(UserId/Passwort) des Funktionsaufrufes oder jene von _AD_Open verwendet.

    Spoiler anzeigen
    [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _AD_UnJoinDomain
    ; Description ...: Unjoins the computer from its current domain and disables the computer account.
    ; Syntax.........: _AD_UnJoinDomain($sAD_Computer[, $sAD_Workgroup [,$sAD_UserParam, $sAD_PasswordParam]])
    ; Parameters ....: $sAD_Computer - Computername to unjoin from the domain
    ; $sAD_Workgroup - Optional: Workgroup the unjoined computer is assigned to (Default = Domain the computer was unjoined from)
    ; $sAD_UserParam - Optional: User with admin rights to unjoin the computer from the domain (NetBIOSName)
    ; +(Default = credentials under which the script is run are used)
    ; $sAD_PasswordParam - Optional: Password for $sAD_User. (Default = credentials under which the script is run are used)
    ; Return values .: Success - 1
    ; Failure - 0, @error set
    ; |1 - $sAD_Computer account does not exist in the domain
    ; |2 - $sAD_User does not exist in the domain
    ; |3 - WMI object could not be created. See @extended for error code. See remarks for further information
    ; |4 - The computer is a member of another or no domain
    ; |5 - Unjoining the domain was not successful. See @extended for error code. See remarks for further information
    ; |6 - Joining the Computer to the specified workgroup was not successful. See @extended for error code
    ; Author ........: Thomas Rupp
    ; Modified.......:
    ; Remarks .......: The domain from which the computer is unjoined from has to be the domain the user logged on to using AD_Open.
    ; If no credentials are passed to this function but have been used with _AD_Open() then the _AD_Open credentials will be used for this function.
    ; If no workgroup is specified then the computer is assigned to a workgroup named like the domain the computer was unjoined from.
    ; You have to reboot the computer after a successful unjoin from the domain.
    ; The UnjoinDomainOrWorkgroup method is available only on Windows XP computer and Windows Server 2003 or later.
    ; Related .......:
    ; Link ..........: http://gallery.technet.microsoft.com/ScriptCenter/e…e9-db8871f79f62, http://technet.microsoft.com/en-us/library/ee692588.aspx, http://msdn.microsoft.com/en-us/library/aa393942(VS.85).aspx
    ; Example .......: Yes
    ; ===============================================================================================================================
    Func _AD_UnJoinDomain($sAD_Computer, $sAD_Workgroup = "", $sAD_UserParam = "", $sAD_PasswordParam = "")

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

    Local $NETSETUP_ACCT_DELETE = 4 ; According to MS it should be 2 but only 4 works
    If _AD_ObjectExists($sAD_Computer & "$") = 0 Then Return SetError(1, 0, 0)
    If $sAD_UserParam <> "" And _AD_ObjectExists($sAD_UserParam) = 0 Then Return SetError(2, 0, 0)
    Local $iAD_Result
    Local $sAD_DomainName = StringReplace(StringReplace($sAD_DNSDomain, "DC=", ""), ",", ".")
    ; Create WMI object
    Local $oAD_Computer = ObjGet("winmgmts:{impersonationLevel=Impersonate}!\\" & $sAD_Computer & "\root\cimv2:Win32_ComputerSystem.Name='" & $sAD_Computer & "'")
    If Not IsObj($oAD_Computer) Or @error <> 0 Then Return SetError(3, @error, 0)
    If $oAD_Computer.Domain <> $sAD_DomainName Then Return SetError(4, 0, 0)
    ; UnJoin domain. Use credentials passed as parameters to this function or those used at _AD_Open, if any
    If $sAD_UserParam <> "" Then
    $iAD_Result = $oAD_Computer.UnjoinDomainOrWorkGroup($sAD_PasswordParam, $sAD_DomainName & "\" & $sAD_UserParam, $NETSETUP_ACCT_DELETE)
    ElseIf $sAD_UserId <> "" Then
    ; Domain NetBIOS name and user account (domain\user) or user principal name (user@domain) is supported
    $sAD_Temp = $sAD_UserId
    If StringInStr($sAD_UserId,"\") = 0 And StringInStr($sAD_UserId,"@") = 0 Then $sAD_Temp = $sAD_DomainName & "\" & $sAD_UserId
    $iAD_Result = $oAD_Computer.UnjoinDomainOrWorkGroup($sAD_Password, $sAD_Temp, $NETSETUP_ACCT_DELETE)
    Else
    $iAD_Result = $oAD_Computer.UnjoinDomainOrWorkGroup(Default, Default, $NETSETUP_ACCT_DELETE)
    EndIf
    If $iAD_Result <> 0 Then Return SetError(5, $iAD_Result, 0)
    ; Move unjoined computer to another workgroup
    If $sAD_Workgroup <> "" Then
    $iAD_Result = $oAD_Computer.JoinDomainOrWorkGroup($sAD_Workgroup, Default, Default, Default, Default)
    If $iAD_Result <> 0 Then Return SetError(6, $iAD_Result, 0)
    EndIf
    Return 1

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

    EndFunc ;==>_AD_UnJoinDomain

    [/autoit]
  • Gibts ne Möglichkeit die extended-Rückmeldung bei AD-Anmeldung sichtbar zu machen?


    Ich hab etwas rumgeforscht und bin zu folgendem Ergebnis gekommen. Mit LDAPSEARCH lassen sich die Zusatzdaten hereinholen.
    Der nachfolgende Query bringt, mit falschem Passwort aufgerufen, folgende Ausgabe:

    Code
    ldapsearch -h <DC.Microsoft.com> -D <Domäne>\<Userid> -w <Passwort> -b "<dc=Microsoft,dc=com>" -s sub "(samaccountname=<Userid>)" samaccountname
    ldap_bind: Ungültige ID-Daten
    ldap_bind: Zusätzliche Info: 80090308: LdapErr: DSID-0C090334, comment: AcceptSecurityContext error, data 775, vece


    Nachteil: die ganze Geschichte dauert ca. 1/2 Sekunde.

    Ich denke, ich baue das in das UDF ein, rufe ldapsearch aber nur auf, wenn das Debugging aufgedreht ist. Der Fehlerstring wird dann als Rückgabewert zurückgegeben.
    Was hältst Du davon?

  • Version 0.38 ist freigegeben.
    Der Link für den Download findet sich in der Signatur.

  • Hi water,

    die variante mit dem externen ldapsearch ist wirklich ein Krückstock - aus mehreren Varianten heraus:
    1. ich setze W2008 64bit ein und ich bekomme keine funktionierende ldapsearch.exe, die bei mir läuft - hab mich schon totgegoogelt
    2. ich muss mein autoit-script, wenns denn später ne exe wird, auf viele Rechner (die Mitarbeiter meiner Firma, die sich von zu Hause aus einwählen wollen) verteilen. ldapsearch.exe startet, wenn überhaupt, nur mit 5-6 dll-Dateien, die allle samt in meine exe mit includiert werden müssen - dies ist viel Aufwand und birgt noch mehr Fehlerquellen (siehe auch 1.)
    3. da du die ldapsearch.exe nicht mit in deinem udf verteilen kannst (copyright etc.) ist es nicht wirklich udf-geeignet...
    4. ich greife (aufgrund 2.) auf das LDAP von außen ohne DNS-Namensauflösung, nur mittels IP-Verbindung zu, das ldapsearch scheint damit ein Problem zu haben...

    Die eigentliche Idee, die du da aber verfolgt hast, fand ich gut - unabhängig davon, das der Einsatz externer exe'n im Rahmen eines udfs problematisch ist. Ich hab bei meiner googelei aber ne eigenständige exe -> klick mich <- gefunden, die 1. auch in x64-Rechnern läuft und 2. freeware ist.

    Wenn du diese mittels:

    adfind -h "IP-Adresse oder DNS-Name des LDAP-Servers" -u "DOMAIN\USER" -up Passwort -simple -exterr -maxe 1 -s sub (samaccountname=xyz)

    aufrufst, bekommst du auch die entsprechende Returnmeldung. Das -maxe 1 -s sub (samaccountname=xyz) kannste auch weglassen, sollten aber die Anmeldedaten richtig sein, dann wäre sonst der Returnstring schier endlos...
    Also falls du überhaupt in ein udf eine externe exe einbinden willst, solltest du eher diese hier von mir beschriebene simplere Lösung nehmen, zumal du die adfind.exe auch direkt (aufgrund freeware) mit in dein udf packen kannst...

    Nach $Fehlerout = stderrRead suche ich nach dem "AcceptSecurityContext"-String, wenn der vorhanden ist, dann habe ich die Auswertung so eingerichtet:

    [autoit]

    $Fehlerout = StringTrimLeft($Fehlerout, StringInStr($Fehlerout, "AcceptSecurityContext", 2))
    $Fehlerout = StringTrimLeft($Fehlerout, StringInStr($Fehlerout, " data", 2) + 5)
    $Fehlerout = StringTrimRight($Fehlerout, StringLen($Fehlerout) - StringInStr($Fehlerout, ", vece)", 2)+1)
    Switch $Fehlerout
    Case "525"
    $Fehler = "Benutzer nicht gefunden"
    Case "52e"
    $Fehler = "Passwort falsch"
    Case "530"
    $Fehler = "Anmeldung mit diesen Logindaten derzeit nicht möglich"
    Case "532"
    $Fehler = "Passwort abgelaufen"
    Case "533"
    $Fehler = "Account deaktiviert"
    Case "701"
    $Fehler = "Account ausgelaufen"
    Case "773"
    $Fehler = "Passwortgültigkeit ausgelaufen"
    Case "775"
    $Fehler = "Zu viele Anmeldeversuche mit falschem Passwort"
    Case Else
    $Fehler = "Unbekannter Fehler: " & $Fehlerout
    EndSwitch
    ConsoleWrite(@CRLF & "Ausgabe: " & $Fehler & @CRLF)

    [/autoit]
  • Wenn ichs mir richtig bedenke, werde ich die "Erstanmeldung" generell über diese adfind.exe laufen lassen (solange es keine Lösung aufgrund meines Bugreports direkt aus Autoit gibt).
    Erst wenn die Ausgabe keinen Fehler zurück gibt, werde ich die AD-Funktionen mittels ADODB-Conn nutzen, um die Gruppenmitgliedschaft meiner Nutzer zu bestimmen und in Abhängigkeit dessen weitere Anmeldespezifikationen zu setzen. Damit reduziert sich die Fehlerquelle erheblich und die adfind.exe ist sehr flink.

    Damit bin ich nun in der Lage, dem Benutzer eine definierte Menge Terminalserver vorzusetzen oder ihn abzuweisen oder direkt einen Terminalserverzugang zu starten, um ihm zu ermöglichen, sein Passwort neu zu setzen, falls abgelaufen. Die Passwort-Setzerei, wenn abgelaufen (error 773 oder 532) hab ich noch nicht mittels anderer Möglichkeiten setzen können, wie mit einem Terminalserverzugangslink.
    Kennst du da ne andere Lösung?