ad.au3 und objectclass=contact

  • Hallo Kollegen,
    zunächst von mir ein Danke. In der Zeit in der ich jetzt AutoIT benutze, war mir das Forum immer ein hilfreicher Begleiter.
    Bisher fand ich es allerdings nicht als notwendig mich anzumelden. :)

    Das hat sich bei meinem aktuellen Problem leider geändert; und ich hoffe, dass ihr mir helfen könnt.

    Ich lese Kontaktdaten (Name, Telefonnummer usw.) aus dem Active Directory aus, um damit eine MySQL Datenbank zu befüllen.
    Bei der Objektlasse "user" klappt das auch prima. Nun ist es aber auch möglich, Kontakte als Objekt im AD zu speichern.
    Hier versagt mein Script. Konkret sieht das so aus:

    [autoit]

    #include <AD.au3>
    _AD_Open()
    $List_User = _AD_GetObjectsInOU("OU=Users,DC=domain,DC=de,"(&(objectcategory=person)(objectclass=user)(name=*))")
    Consolewrite($List_User[0])
    For $i = 1 to $List_User[0]
    Consolewrite($List_User[$i]&@CRLF)
    Next
    _AD_Close()

    [/autoit]

    Das liefert bspw 5300 Einträge und alle Benutzernamen.


    [autoit]

    #include <AD.au3>
    _AD_Open()
    $List_User = _AD_GetObjectsInOU("OU=Contacts,OU=Exchange,DC=domain,DC=de,"(&(objectcategory=person)(objectclass=contact)(name=*))")
    Consolewrite($List_User[0])
    For $i = 1 to $List_User[0]
    Consolewrite($List_User[$i]&@CRLF)
    Next
    _AD_Close()

    [/autoit]

    Das liefert zwar über die Variable $List_User[0] korrekt die Anzahl der Objekte in der OU, aber keine Ergebnisse.
    Die folge ist, dass ich auch keine Attribute aus dem Objekt auslesen kann (_AD_GetObjectAttribute)
    Über den ActiveDirectory Explorer bspw. sehe ich alle Objekte und deren Attribute.
    Ich benutze die aktuelle UDF AD.AU3 in der Version 1.2.

    Ich weiß, das ist ein sehr spezifisches Problem, aber ich hoffe, dass mir trotzdem jemand einen Schubs in die richtige Richtung geben kann.
    Danke schonmal.


    Gruß
    Cadel

    Einmal editiert, zuletzt von CadelPigott (24. Januar 2012 um 16:48)

  • Zwei Dinge:

    1) Nimm mal das "Name=*" aus den Query-Strings heraus. Du kriegst so nämlich nur jene Sätze, wo in Name auch was drinsteht. Da Du ja alle Sätze willst, reicht die Abrage über ObjectCategory und ObjectClass.

    2) Du brauchst nicht über _AD_GetObjectAttribute die Attribute nachträglich noch abfragen. Gib die Liste der Attribute einfach bei _AD_GetObjectsInOu mit an (Parameter: $sAD_DataToRetrieve)

  • Hallo water,

    jawoll, das war´s.

    1) "name=*" bewirkt, dass alle Objekte angezeigt werden, außer denen wo "name" leer ist. Seltsam, aber ok. Das macht dsquery anders.

    2) Wenn man die gewünschten Attribute direkt mit der Funktion _AD_GetObjectsInOU ausliest, gehts.
    Wenn man die gewünschten Attribute über eine nachgelagerte For-Schleife und der Funktion _AD_GetObjectAttribute ausliest, gehts nicht.

    Vielen Dank und Gruß
    Cadel

    Und nochmal für Google:

    richtiges Beispiel

    [autoit]

    #include <AD.au3>
    _AD_Open()
    $List_User = _AD_GetObjectsInOU("OU=Users,DC=domain,DC=de,"(&(objectcategory=person)(objectclass=contact)),3,"sn,TelephoneNumber")
    Consolewrite($List_User[0][0])
    For $i = 1 to $List_User[0][0]
    Consolewrite($List_User[$i][0]&" "&$List_User[$i][1]&@CRLF)
    Next
    _AD_Close()

    [/autoit]
  • Wenn man die gewünschten Attribute über eine nachgelagerte For-Schleife und der Funktion _AD_GetObjectAttribute ausliest, gehts nicht.


    Versteh' ich nicht ganz. Wenn Du an _AD_GetObjectAttribute den Samaccountname oder FQDN sowie das gewünschte Atribut übergibst, dann sollte was zurückkommen. Falls nicht, sag @error wo's klemmt.

  • Ich verstehs auch nicht. Einen Error bekomm ich nicht zurück, sondern einfach nur leere Variablen.
    Aber eben ausschließlich bei objectclass=contact. Sogar Kalenderressourcen liefern Ergebnisse.
    Meine Vermutung ist, dass das irgendwie am Exchange 2010 bzw. der 2008 Domäne liegt.

  • Also das liefert mir schön die Tabelle mit 2 gefüllten Spalten und dann auf der Console den Returncode und Namen des ersten contacts.

    [autoit]

    #include <ad.au3>
    _AD_Open()
    $sAD_OU = ""
    $aResult = _AD_GetObjectsInOU($sAD_OU, "(&(objectcategory=person)(objectclass=contact))", 2 , "distinguishedname,name")
    if @error <> 0 Then Exit Msgbox(64, "AD Test", "_AD_GetObjectsInOU @error: " & @error & ", @extended: " & @extended)
    _ArrayDisplay($aResult, "Result of _AD_GetObjectsInOU")
    $sResult = _AD_GetObjectAttribute($aResult[1][0], "name")
    ConsoleWrite(@error & "-" & $sResult & @CRLF)

    [/autoit]
  • ja, weil du die Ausgabeattribute im _AD_GetObjectsInOU bereits angibst.

    Probiers mal mit

    [url='http://translation.autoit.de/onlinehilfe/intro/lang_variables.htm']

    [autoit]

    $aResult = _AD_GetObjectsInOU($sAD_OU, "(&(objectcategory=person)(objectclass=contact))")

    [/autoit]

    Dann ist das Ergebnis, dass es bei objectclass=user geht und bei objectclass=contact nicht.

  • Alles klar:
    Wenn Du keine Werte für $iAD_SearchScope und $sAD_DataToRetrieve angibst, dann werden die Defaultwerte verwendet. Dies ist für $sAD_DataToRetrieve "samaccountname".
    Contacts haben aber keinen Samaccountname, daher die leere Tabelle. Wenn Du Dir den distinguishedname zurückgeben lässt, dann kannst Du den auch an _AD_GetObjectAttribute übergeben. Die AD Funktionen können sowohl samaccountname als auch FQDN verarbeiten.
    Bessere Performance kriegst Du, wenn Du alle Werte die Dich interessieren mit einem Aufruf von _AD_GetobjectsInOu zurückliefern lässt.

  • :)