Active Directory Funktionen - Neue Version 1.5.0.0 freigegeben!

  • Hallo Water,

    ... sorry, ich mußte noch etwas warten - die Replikation von Änderungen im AD dauert immer so zwei Stunden. Nun ja ...

    Also - der Fehler lag daran, daß ich den Wald vor lauter Bäumen nicht mehr gesehen habe, bitte entschuldige das.

    Der Parameter $sAD_HostServerParam bei _AD_Open() hatte einen falschen Inhalt. Dadurch wurde zwar eine Verbindung zum AD ohne Fehler hergestellt (_AD_ObjectExists() hat ja funktioniert), jedoch hat das in der Folge die Probleme beim _AD_CreateComputer() verursacht.

    Dennoch eine kurze Frage noch: Beim _AD_JoinDomain() steht in der Doku, daß der Parameter $sAD_UserParam zusammengesetzt werden muß aus DomainName\UserName. Wenn ich dies so formuliere, dann verursacht die Funktion einen Fehler und der Rechner wird nicht gejoined. Verwende ich allerdings nur den UserName, dann klappt alles prima.

    Ist das evtl. ein Bug oder aber ein Fehler in der Doku? Oder verstehe ich hier etwas falsch?

    Viele Grüße
    TheDude

    Cuiusvis hominis est errare, nullius nisi insipientis in errore perseverare.
    [Cicero, Philippica 12,2]

  • Hi Dude,
    wenn Du nicht auf die Replikation warten willst, dann connecte Dich einfach zu einem Global Catalog und Du hast sofort/schneller einen aktuellen Lesezugriff.

    Meine Weisheit bezüglich Domain\Userid habe ich von hier und hier . Aber wenn es für Dich funktioniert, umso besser.
    Da ich nur Lesezugriff auf unser AD habe, sind diese Funktionen von anderen Benutzern mit anderen System getestet und da kann es natürlich Unterschiede geben.

    Gruß vom Bodensee
    Water

  • Hallo,

    ich bin mal so frei und frage einfach hier rein, ohne extra ein "Fred" aufzumachen:

    Über _AD_GetUserGroups kann ich die Gruppenmitgliedschaften auslesen, wie komme ich jedoch an die "Pre Windows 2000"-Gruppennamen der Gruppen ran?

    Hintergrund ist der, dass die mit o.a. Funktion die Gruppen teilweise "," und Leerzeichen beinhalten aber in den Pre-Windows2000-Namen eben nicht und sich mit den Pre-Namen einfacher setzen/löschen lassen.

  • Die Funktion gibt dir den FQDN der Gruppen an. Wenn Du den SamAccountName brauchst, dann kannst Du den mit _AD_GetObjectAttribute rauskriegen
    Aber mit dem FQDN sollte sich genau so gut arbeiten lassen. Komma etc. vorher "escapen" mit _AD_FixSpecialChars.

  • Version 1.3.0.0 der UDF ist freigegeben.
    Sie kombiniert die letzte Produktionsversion 1.2.0 und die experimentelle Version 1.2.2.0!

    Bitte ausgiebig testen vor Übernahme in die Produktion!

    Für download siehe bitte den Link in meiner Signatur.

  • Wie kann ich den die Beschreibung eines Users in der ADS ändern?

    Edit: Habs doch gefunden _AD_ModifyAttribute

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

    Einmal editiert, zuletzt von chip (29. Oktober 2012 um 09:54)

  • Ich nehme an, Du meinst die property "description".

    [autoit]

    _AD_Open()
    Global $iValue = _AD_ModifyAttribute($sUser, "description", $sDescription)
    _AD_CLose()

    [/autoit]


    Sieh Dir dazu das Beispielscript _AD_ModifyAttribute.au3 an.

  • Danke water, hatte es inzwischen auch schon gefunden gehabt :).

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Hallo Water,

    wäre es mit der AD-UDF möglich, einen Rechner aus der Domänenzugehörigkeit zu entfernen und in eine Arbeitsgruppe einzufügen, wenn der Rechner in diesem Moment keine Verbindung zur Domäne hat?

    Ich habe das einmal versucht mit der Funktion _AD_UnjoinDomain() aber das scheint nicht zu klappen. Ich habe daraufhin die Funktion um den Teil des deaktivierens des Pbjekts im AD gekürzt, aber das funktioniert nicht. Hast Du hierzu vielleicht eine Idee oder eine Lösung?

    Vielen Dank vorab,
    Grüße

    TheDude

    Cuiusvis hominis est errare, nullius nisi insipientis in errore perseverare.
    [Cicero, Philippica 12,2]

  • Die UDF baut eigentlich auf der Idee auf, dass zuerst eine Verbindung zum AD hergestellt wird, dann die Funktionen aufgerufen werden und am Ende die Verbindung mit _AD_Close wieder geschlossen wird.
    Ausnahmen sind die beiden Funktionen _AD_JoinDomain und _AD_UnJoinDomain. Sie rufen jeweils nur eine Funktion des UDF auf um Computer- und User-Konto im AD zu prüfen.
    Der Rest läuft über WMI. Ob WMI auch ohne Verbindung zum AD auskommt, kann ich Dir nicht sagen (glaube ich aber eher nicht).
    Folgende Links habe ich mir bei diesen Funktionen notiert, vielleicht helfen sie weiter:

    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

  • Hallo Water,

    ... danke für die Links - ich habe mir das angesehen, nur verstehe ich einfach zu wenig davon um für mich eine entsprechende neue Funktion zu erstellen. So wie es aussieht werde ich wohl einen (AutoIt-externen) Workaround finden müssen. Mal sehen, was Google da noch so her gibt ... :wacko:

    Nochmals vielen Dank,
    Grüße

    TheDude

    Cuiusvis hominis est errare, nullius nisi insipientis in errore perseverare.
    [Cicero, Philippica 12,2]

  • Hi Dude,

    postest Du dann bitte Deine Lösung falls Du bei Google was findest?
    Falls möglich, baue ich das dann in die AD UDF ein.

    Gruß
    water

  • Ich habe noch einige Active Directory Tools die ich - Interesse vorausgesetzt - gerne aufpolieren und freigeben möchte.
    Es handelt sich um folgende vier Tools:

    ADQU - Active Directory Query Users - Listet User, deren Gruppenmitgliedschaften und Mitglieder einer ausgewählten Gruppe
    ADQU - Active Directory Query Groups - Listet Gruppen, deren Mitglieder sowie Gruppenmitgliedschaften eines ausgewählten Benutzers
    ADCU - Active Directory Compare Users - Vergleicht die Gruppenmitgliedschaften von zwei Usern
    ADQG - Active Directory Compare Groups - Vergleicht die Miglieder zweier Gruppen

    Die Daten aus allen Tools können nach Excel, Outlook oder die Zwischenablage exportiert werden.

    Hier gibt's Details und die Abstimmung.

  • hallo alle zusammen,

    bei mir funktioniert die AD UDF weiterhin sehr gut :) wiedermal ein Dankeschön!!!

    eine Frage habe ich mal wieder :)

    mit _AD_GetGroupMembers kann ich mir ja die Gruppenmitglieder anzeigen lassen...nun gibt es auch Gruppen, wo auch wieder Gruppen enthalten sind (also geschachtelt)
    wie kann ich mir am besten die mitglieder der geschachtelten gruppen auch mit in das array einfügen lassen? (doppelte sollten dann auch rausgefilter sein :P)

    Danke schonmal!

    Gruß
    GerhardSchr

  • Da gibt es derzeit leider keine Funktion.
    Hier ist die entsprechende Funktion aus dem "alten" adfunctions UDF. Wenn Bedarf besteht, schreibe ich sie um und füge sie in die AD UDF ein.

    [autoit]

    ; _ADRecursiveGetGroupMembers
    ; Takes a Full DN of a group and returns a recursively searched list of members of that group (and groups that are members of the group)
    ; The return values are full DNs. For groups that are inherited, the return is the DN of the group, and the DN of the first group
    ; it was inherited from, seperated by '|'.
    Func _ADRecursiveGetGroupMembers(ByRef $members, $fqdn, $depth = 10)
    Local $oUsr, $objCommand, $groups, $i, $j, $arr_data

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

    $data = "distinguishedName,objectCategory"

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

    $objCommand = ObjCreate("ADODB.Command")
    $objCommand.ActiveConnection = $objConnection
    $objCommand.Properties("Page Size") = 1000
    $objCommand.Properties("Searchscope") = 2

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

    $strCmdText = "<LDAP://" & $strHostServer & "/" & $strDNSDomain & ">;(memberof=" & $fqdn & ");" & $data & ";subtree"

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

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

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

    Dim $members[$objRecordSet.RecordCount + 1]
    If UBound($members) = 1 Then
    $members[0] = 0
    Return
    EndIf

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

    $objRecordSet.MoveFirst
    $i = 1
    Do
    $members[$i] = $objRecordSet.Fields("distinguishedName" ).Value
    If StringInStr($objRecordSet.Fields("objectCategory" ).Value, "group") Then
    Dim $temp_members
    _ADRecursiveGetGroupMembers($temp_members, $members[$i], $depth - 1)
    For $j = 1 To $temp_members[0]
    $temp_members[$j] &= "|" & $members[$i]
    Next
    _ArrayDelete($temp_members, 0)
    _ArrayConcatenate($members, $temp_members)
    EndIf
    $i += 1
    $objRecordSet.MoveNext
    Until $objRecordSet.EOF

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

    $objRecordSet.Close

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

    $objCommand = 0
    $objRecordSet = 0

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

    $members[0] = UBound($members) - 1

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

    Return 1
    EndFunc ;==>_ADRecursiveGetGroupMembers

    [/autoit]
  • Du musst die Funktion vorher aber noch anpassen, so wie sie dasteht crasht die sicher.

  • Das AD UDF unterstützt nur das Microsoft Active Directory.
    Andere Verzeichnisse verwenden andere Formate um Objekte eindeutig zu identifizieren. Daher funktioniert da das AD UDF nicht.
    Kannst Du in Erfahrung bringen, um welches Verzeichnis es sich handelt? Beispiele findest du hier.

  • mmm ... die kollegen, die mir nähere infos über unseren LDAP liefern könnten, haben sich wohl schon in richtung weihnachten verabschiedet ...

    aber ein kollege von mir, hat das was ich machen möchte, schon mit visual basic hinbekommen, aber ich hab keinen blassen schimmer, wie ich das mit autoit umsetzen könnte:


    Private Sub HoleSCD_Daten()

    Const ADS_NO_AUTHENTICATION = &H10 ‘’ keine anmeldung erforderlich

    Dim oSearcher As New DirectorySearcher
    Dim oResults As SearchResultCollection
    Dim oResult As SearchResult
    Dim RetArray As New ArrayList
    Dim mCount As Integer
    Dim ldapServerName As String
    Dim pFindWhat As String
    Dim sZeilenInhalt() As String
    Dim wert As String


    ldapServerName = "ldap.bleistein.net"
    pFindWhat = suche

    Dim ResultFields As ArrayList
    ResultFields = New ArrayList
    ' ResultFields.Add("mail")

    Try
    With oSearcher
    .SearchRoot = New DirectoryEntry("LDAP://" & ldapServerName, "", "", ADS_NO_AUTHENTICATION)
    '.PropertiesToLoad.Clear()
    '.PropertiesToLoad.AddRange(ResultFields)
    .Filter = "mail=" & pFindWhat & "*"
    oResults = .FindAll()

    End With


    mCount = oResults.Count
    If mCount > 0 Then
    For Each oResult In oResults

    '' alle Properties für die Abfrage holen
    For Each attribut In oResult.Properties.PropertyNames
    Debug.Print(attribut.ToString)
    ResultFields.Add(attribut.ToString)
    Next

    For Each wert In ResultFields

    '' wenn es ein Array ist werden die Daten zusammengeschrieben
    If TypeOf (oResult.GetDirectoryEntry().Properties(wert).Value) Is Array Then

    '' wenn es noch mal ein Array ist soll es übergangen werden
    If TypeOf (oResult.GetDirectoryEntry().Properties(wert).Value(0)) Is Array Then
    RetArray.Add(wert & ";binary")
    Else
    ''es ist ein normaler Array
    Dim sWerteArray As String = Nothing
    For Each Text As String In oResult.GetDirectoryEntry().Properties(wert).Value
    If sWerteArray = Nothing Then
    sWerteArray = Text
    Else
    sWerteArray = sWerteArray & ", " & Text
    End If
    Next
    RetArray.Add(wert & ";" & sWerteArray)
    End If


    Else
    RetArray.Add(wert & ";" & oResult.GetDirectoryEntry().Properties(wert).Value)

    End If


    Next
    Next

    End If

    ' lokal speichern
    Dim oStream As New StreamWriter(Environment.UserName.ToString & "_LDAP.csv")
    dgvDFS.Rows.Clear() 'Wir löschen alle Items der Listview

    For Each wert In RetArray
    oStream.Write(wert & vbCrLf)
    sZeilenInhalt = wert.Split(";")
    ' Daten übergeben
    dgvDFS.Rows.Add(sZeilenInhalt(0), sZeilenInhalt(1))
    Next
    oStream.Close()

    Catch e As Exception
    MsgBox("Error is <<<" & wert & ">>> " & e.Message)
    End Try

    End Sub