LDAP: Problem mit _ADGetObjectsInOU aus ADFunctions.au3

  • Ich mal wieder ;)

    hab ein Problem mit dieser Funktion "_ADGetObjectsInOU" aus der "ADFunctions.au3".
    Und zwar möchte ich als filter einen Namen verwenden z.B "name=Max*" damit ich aus dem AD per LDAP alle Namen mit Max bekomme.
    Wenn ich es direkt in den Funktionsaufruf reinschreibe das es so aussieht:

    [autoit]

    _ADGetObjectsInOU(ByRef $ObjectArray, $ou, "name=Max*", $searchscope = 2, $datatoretrieve = "sAMAccountName", $sortby = "sAMAccountName")

    [/autoit]

    Dann klappt das und ich bekomm ein Array voll mit Infos.

    Jetzt möchte ich aber den Namen der gesucht werden soll von einer GUI haben als so z.B das ich ein Feld hab "User Name" und da gibt man dann den zusuchenden Namen ein.

    wenn ich jetzt eine Variable mach die so aussieht:

    [autoit]

    $Username = '"name=' & GUICtrlRead($txtUser) & '*"'

    [/autoit]

    und dann meinen Funktionsaufruf so gestalte:

    [autoit]

    _ADGetObjectsInOU(ByRef $ObjectArray, $ou, $Username , $searchscope = 2, $datatoretrieve = "sAMAccountName", $sortby = "sAMAccountName")

    [/autoit]

    Dann bekomm ich immer einen Error das das Object nicht stimmt.

    Die zugehörige Funktion aus der ADFunctions.au3 sieht so aus:

    [autoit]

    ; _ADGetObjectsInOU
    ; Returns an array of the objects in an OU
    ; $ou : The OU to retrieve from
    ; $filter : optional, default "name'*'". An additional LDAP filter if required.
    ; $searchscope : optional, default 2. 0 = base, 1 = one-level, 2 = sub-tree
    ; $datatoretrieve : optional, default "Name". A comma-seperated list of values to retrieve. More than one value will create
    ; a 2-dimensional array, array[0][0] will contain the number of items returned, which start at array[1][0]

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

    Func _ADGetObjectsInOU(ByRef $ObjectArray, $ou, $filter = "(name=*)", $searchscope = 2, $datatoretrieve = "sAMAccountName", $sortby = "sAMAccountName")
    Local $objRecordSet
    $objCommand = ObjCreate("ADODB.Command")
    $objCommand.ActiveConnection = $objConnection
    $objCommand.Properties ("Page Size") = 256
    $objCommand.Properties ("Searchscope") = $searchscope
    $objCommand.Properties ("TimeOut") = 20

    $strCmdText = "<LDAP://" & $strHostServer & "/" & $ou & ">;" & $filter & ";" & $datatoretrieve & ";subtree"

    $objCommand.CommandText = $strCmdText
    $objRecordSet = $objCommand.Execute

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

    $recordcount = $objRecordSet.RecordCount
    If $recordcount = 0 Then
    $objCommand = 0
    $objRecordSet = 0
    Return 0
    EndIf

    If StringInStr($datatoretrieve, ",") Then

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

    $dtrArray = StringSplit($datatoretrieve, ",")

    Dim $ObjectArray[$recordcount + 1][$dtrArray[0]]

    $ObjectArray[0][0] = $recordcount
    $ObjectArray[0][1] = $dtrArray[0]

    $count = 1
    $objRecordSet.MoveFirst
    Do
    For $i = 1 To $dtrArray[0]
    $ObjectArray[$count][$i - 1] = $objRecordSet.Fields ($dtrArray[$i]).Value
    Next
    $objRecordSet.MoveNext
    $count += 1
    Until $objRecordSet.EOF
    Else
    Dim $ObjectArray[$recordcount + 1]
    $ObjectArray[0] = UBound($ObjectArray) - 1
    If $ObjectArray[0] = 0 Then
    $ObjectArray = 0
    Return 0
    Else
    $count = 1
    $objRecordSet.MoveFirst
    Do
    $ObjectArray[$count] = $objRecordSet.Fields ($datatoretrieve).Value
    $objRecordSet.MoveNext
    $count += 1
    Until $objRecordSet.EOF
    EndIf
    EndIf

    $objCommand = 0
    $objRecordSet = 0

    Return 1

    EndFunc ;==>_ADGetObjectsInOU

    [/autoit]

    Und an der Stelle kommt der Error

    [autoit]

    $objRecordSet = $objCommand.Execute

    [/autoit]

    Ist bestimmt was banales, aber ich steh irgend wie auf dem Schlauch.
    Vielleicht kann mir einer Helfen.

    mfg

    nefas

    P.S. leider kann ich es erst morgen Früh auf der Arbeit testen da ich hier zuhause kein LDAP habe.

    P.S.S.:
    Hab es hinbekommen ;)

    lösung sieht so aus:

    [autoit]


    $UserLastName = GUICtrlRead($txtUser)&"*"

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

    _ADGetObjectsInOU($asUser, $nefOU, "(&(Name="&$UserLastName&"))", 2, "DisplayName,samAccountName,co,l,telephonenumber,physicalDeliveryOfficeName,department,mail,global-ExtensionAttribute1,global-ExtensionAttribute2,distinguishedName,homeDirectory,scriptPath","DisplayName")

    [/autoit]
  • Du machst das verkehrt.

    1. Du solltest nicht die Funktion ( Func....EndFunc) anpassen, sondern sie AUFRUFEN.

    Im Falle der Funktion '_ADGetObjectsInOU' lese ich im Funktionskopf heraus, das sie ein Array der Treffer zurückgibt. Da in der Funktion nur ein 'Return 1' oder 'Return 0' zu finden ist, in der Funktionsdeklaration aber eine Referenzierung auf ein Array steht (ByRef $ObjectArray), gehe ich mal davon aus der Aufruf muss folgendermaßen aussehen:

    Spoiler anzeigen
    [autoit]

    #include <array.au3> ; nur für _ArrayDisplay() !
    Dim $ReturnArray
    $meineOU = "cn=all,ou=Groups,dc=example,dc=com"
    $meinFilter = "name=Max*"
    _ADGetObjectsInOU($ReturnArray,$meineOU,$meinFilter)
    _ArrayDisplay($ReturnArray)

    [/autoit]

    Ist jetzt aber frei Hand geschrieben und nur als Beispiel zu sehen (nicht getestet).

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

    Einmal editiert, zuletzt von Micha_he (18. Februar 2009 um 23:32)

  • Jab das weis ich, meine funktion sieht ja wie folgt aus:

    [autoit]

    Dim $nefOU = 'OU=###,DC=###,DC=###,DC=###' ;Wegen betriebsinternen verändert
    Dim $asUser
    Dim $UserLastName

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

    Func Search_LDAP()

    $UserLastName = '"(name='&GUICtrlRead($txtUser)&'*)"'

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


    _ADGetObjectsInOU($asUser, $nefOU, $UserLastName,2,"DisplayName,samAccountName,co,l,telephonenumber,physicalDeliveryOfficeName,department,mail,global-ExtensionAttribute1,global-ExtensionAttribute2,distinguishedName,homeDirectory,scriptPath","DisplayName")
    _ArrayDisplay($asUser)
    EndFunc

    [/autoit]

    Aber da ich den filter über eine Variable einfüge satt direkt bekomm ich einen fehler
    der wie folgt aussieht.

    [autoit]

    ==> The requested action with this object has failed.:
    $objRecordSet = $objCommand.Execute
    $objRecordSet = $objCommand.Execute^ ERROR

    [/autoit]