Active Directory Funktionen - Neue Version 1.5.0.0 freigegeben!

  • ConsoleWrite eines Arrays bringt nie eine Ausgabe. Nimm _ArrayDisplay.

  • Danke!

    so eine letzte Bitte, falls das möglich ist:

    Die Telefonnummern im AD unter "telephoneNumber" sind im deutschen Format d.h. +49 (89) 1234-1234
    Die Nummer, die ich aber vergleiche lautet 498912341234

    d.h. regex .. geht das direkt bei der Abfrage?

    2 Mal editiert, zuletzt von Herbert (14. August 2014 um 23:06)

  • Nicht dass ich wüsste. Aber Du kannst die Abfrage ja so umbauen, dass alle User mit der Telefonnummer zurückgegeben werden und dann den Array durchsuchen,

  • [autoit]

    #include <AD.au3>
    #include <File.au3>

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

    ; Open Connection to the Active Directory
    _AD_Open()
    If @error Then Exit MsgBox(16, "Active Directory Example Skript", "Function _AD_Open encountered a problem. @error = " & @error & ", @extended = " & @extended)

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

    Global $aObjects[1][1]
    Global $sOU = "" ; Search all OUs
    $aObjects = _AD_GetObjectsInOU($sOU, "(&(objectcategory=person)(objectclass=user)(name=*))", 2, "sAMAccountName,telephoneNumber")
    If @error > 0 Then
    MsgBox(64, "Active Directory Functions - Example 1", "No OUs could be found")
    Else
    _ArrayDisplay($aObjects, "Active Directory Functions")
    EndIf
    ; Close Connection to the Active Directory
    _AD_Close()
    ; Array bearbeiten
    For $i = 1 to $aObjects[1][0]
    If $aObjects[$i][1] = "gewünschte Telefonnummer" Then
    ; Benutzer verarbeiten
    Endif
    Next

    [/autoit]
  • ich stelle mich an der stelle ziemlich unbeholfen dar,..

    ich mache das sicher falsch, weil ich den code nicht verstehe :(
    via regex muss er das ja vorher auf zahlen reduzieren (+ und () ) entfernen,.. und dann vergleichen.


  • Stimmt ;) _ArrayDisplay zeigt nur ganze Arrays an, keine Elemente aus dem Array!

  • hallo Herbert,

    das sollte dir weiterhelfen :)

    [autoit]


    #include <AD.au3>
    #include <File.au3>

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

    ; Open Connection to the Active Directory
    _AD_Open()
    If @error Then Exit MsgBox(16, "Active Directory Example Skript", "Function _AD_Open encountered a problem. @error = " & @error & ", @extended = " & @extended)

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

    Global $aObjects[1][1]
    Global $sOU = "" ; Search all OUs
    $aObjects = _AD_GetObjectsInOU($sOU, "(&(objectcategory=person)(objectclass=user)(name=*))", 2, "sAMAccountName,telephoneNumber")
    If @error > 0 Then
    MsgBox(64, "Active Directory Functions - Example 1", "No OUs could be found")
    Else
    ;_ArrayDisplay($aObjects, "Active Directory Functions")
    EndIf
    ; Close Connection to the Active Directory
    _AD_Close()
    ; Array bearbeiten
    For $i = 1 to $aObjects[0][0]

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

    ;ConsoleWrite($aObjects[$i][1])
    If $aObjects[$i][1] = "+49 (89) 0000 0000" Then
    ; Benutzer verarbeiten
    MsgBox(0,"",$aObjects[$i][0] & @crlf & $aObjects[$i][1])
    Endif
    Next

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

    gruß gmmg

  • Herbert, ich würde Dir aber trotzdem eine ernsthafte Beschäftigung mit Arrays empfehlen.Das sind Kernfunktionen von AutoIt. Im Wiki (eventuell auch in diesem Forum) gibt es gute Tutorials dazu.

  • Hi, ich habe gestern festgestellt, das der Parametzer sehr wohl ausgelesen wird, aber warum auch immer liefert MS nicht das gewünschte Ergebnis so wie alle anderen Parameter sondern so was:

    Code
    userParameters|CtxCfgPresent                                   PCtxCfgPresent㔵攱戰ぢ LCtxWFProfilePath挵挵搶㠶㌷㈷〳ㄳ㈳㐳挵㐷㌷〷㈷昶㘶㤶挶㔶㐲挵搶㠶挵搶㔶㤷㔶㈷攲㐶㔶㐷挶㔶㘶〰.CtxMaxDisconnectionTimeっ㜲㤰〰 CtxMaxIdleTime〰㐷㝢㄰(CtxMaxConnectionTime〰〰〰〰CtxCfgFlags1〰て㈲〹

    Unter UserParameters wird der Wert für "CtxWFProfilePath" leider kryptisch ausgegeben.
    Siehst Du da noch eine Chance da was vernünftiges raus zubekommen ?

    [Blockierte Grafik: http://www.selfadsi.de/img/tutorial/ad-user-attributes-14.png]


    Falls noch einer suchen sollte:

    [autoit]


    func _Get_TSProfile($sAD_User)
    $distingshedname = _AD_GetObjectAttribute($sAD_User, "distinguishedName")
    local $oUser = __AD_ObjGet("LDAP://"& $distingshedname)
    Return $oUser.TerminalServicesProfilePath
    EndFunc

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

    func _Set_TSProfile($sAD_User)
    $distingshedname = _AD_GetObjectAttribute($sAD_User, "distinguishedName")
    local $oUser = __AD_ObjGet("LDAP://"& $distingshedname)
    $oUser.TerminalServicesProfilePath = "\\Server"&$sAD_User&"$\Profile" ;~ müsste angepasst werden
    $oUser.SetInfo
    EndFunc

    [/autoit]
  • hi water und alles klar? :)

    AD udf funktioniert so weit sehr gut, eine Frage habe ich aber doch :)

    kann es sein, dass die _AD_RecursiveGetGroupMembers funktion (immernoch) neben den namen die enthaltenen Gruppen selbst ausgibt?

    z.B.:

    Gruppe: Vorstand (Peter, Hannes)
    Gruppe: Arbeiter (Heike, Johannes)

    Gruppe in Gruppe: Alle_zusammen (Vorstand, Arbeiter)


    Ergebnis von _AD_RecursiveGetGroupMembers ("Alle_zusammen", 10, 0, 0)


    Vorstand (sollte nicht enthalten sein)
    Arbeiter (sollte nicht enthalten sein)
    Peter (ist ok)
    Hannes (ist ok)
    Heike (ist ok)
    Johannes (ist ok)


    oder benutzte ich (wieder mal) eine alter Version? :)


    Danke schonmal!

  • Alles senkrecht :)
    Muss ich testen, kann gut sein, dass da noch ein Bug ist. Wäre nicht der erste.

  • Nö, zu jung dafür!

  • kann es sein, dass die _AD_RecursiveGetGroupMembers funktion (immernoch) neben den namen die enthaltenen Gruppen selbst ausgibt?

    Hat nun etwas gedauert, sorry.

    Die Funktion gibt rekursiv alles aus was in der angegebenen Gruppe enthalten ist (inkl. weiterer Gruppen).
    Das sagt auch die engl. Beschreibung: "Takes a group and recursively returns a list of groups and members of the group."

    Du könntest für jedes zurückgegeben Array-Element die ObjetClass abfragen und Gruppen ignorieren.
    Oder man könnte die Funktion aufbohren um statt eines 1D Arrays einen 2D Array mit weiteren Properties (z.B. ObjectClass) zurückzugeben.

    Wie siehst Du das?

  • hi water
    schön von dir zu hören :)

    von meiner seite her wäre es schon besser, wenn nur die Benutzer ohne Gruppen enthalten wären....

    Angenommen man will alle User, die in einer Gruppe sind löschen oder Homelaufwerke anlegen oder eine E-Mail senden oder oder oder :)))))
    dann hat man immer nicht wirklich die richtigen daten :P

    gegen einen Parameter, womit man das verhalten steuern kann hätte ich nix einzuwenden (wenn von deiner seite nichts dagegenspricht!)


    Danke für die Antwort!
    Zeigt mir, dass die UDF nicht tot ist.

  • Wenn ich mir das "Problem" eher generell betrachte:
    Die Funktion zeigt rekursiv an, welche Mitglieder eine Gruppe hat. Dies können User, Computer, Gruppen, Prinqueues etc. etc. sein. Nur die Gruppen herauszunehmen wäre dann vermutlich nur die halbe Miete. Wenn Du nur die User brauchst, dann müsste es eine Möglichkeit geben, alles andere zu filtern. Das kann aber relativ schnell komplex werden (besonders rekursiv) wenn z.B. User und Computer benötigt werden.
    Ich tendiere im Moment eher dazu, die Menge der zurückgegebenen Datensätze nicht einzuschränken und das den User selbst machen zu lassen.

    Ich werde mal ein Beispiel basteln wie so was aussehen könnte.