AD Gruppenmitglieder in eine andere bestehende Gruppe einpflegen

  • Tach zusammen

    ich hab mal wieder eine etwas größere Aufgabe zu bewältigen, die mich mal wieder auf AutoIT bringt ;o)

    Also ich erklär mal eben das vorhaben. Wir haben in der AD in einer OU viele viele unter OUs mit noch mehr Gruppen. Unter anderem gibt es doch Gruppen die xxxxxx-DokuAenderer heißen und xxxxxxxxx-DokuAdmin. Ziel ist nun, die Mitglieder von den DokuAenderer in die Gruppe der DokuAdmins einzupflegen, um anschließen alle Gruppen mit DokuAenderer zu löschen.

    Gibt es eine Möglichkeit mit AutoIt direkt in die AD einzugreifen ?? Muss ich mir anderer MS Tools besorgen um dies mit AutoIt zurealisieren ?? Hat jemand sowas zufällig schonmal gescriptet ?? Hat mir jemand einen Ansatz, wie ich das Umsetzen kann ??

    Für jeden Tipp und Rat bin ich dankbar.

    Grüße
    CrazyER

  • CrazyER

    Eigentlich sollte es ausreichen, wenn Du die Gruppen umbenennst.

    Hier hast Du:

    [autoit]


    $oCOMErr = ObjEvent('AutoIt.Error', '_COMErrFunc')

    $oAdoCon = ObjCreate('ADODB.Connection')
    $oAdoCon.Provider = 'ADsDSOObject'
    $oAdoCon.Open('Active Directory Provider')

    $oAdoCmd = ObjCreate('ADODB.Command')
    $oAdoCmd.ActiveConnection = $oAdoCon
    $oAdoCmd.Properties('Page Size') = 1000

    $oRootDSE = ObjGet('LDAP://rootDSE')
    $sSearchBase = '<LDAP://' & $oRootDSE.Get('defaultNamingContext') & '>'
    $sFilter = '(&(objectCategory=group)(name=*DokuAenderer))'
    $oAdoCmd.CommandText = $sSearchBase & ';' & $sFilter & ';Name,ADsPath;subtree'

    $oRecSet = ObjCreate('ADODB.RecordSet')
    $oRecSet = $oAdoCmd.Execute
    $oRecSet.MoveFirst

    While Not $oRecSet.EOF
    $array = StringSplit($oRecSet.Fields('Name' ).Value, '-')
    $oGroup = ObjGet($oRecSet.Fields('ADsPath' ).Value )
    $oOrgUnit = ObjGet($oGroup.Parent)
    $oOrgUnit.MoveHere($oRecSet.Fields('ADsPath' ).Value, 'cn=' & $array[1] & '-DokuAdmins')
    $oRecSet.MoveNext
    WEnd

    Func _COMErrFunc()
    EndFunc

    [/autoit]
  • Ich versteh zwar nicht ganz was das ist, bzw vofür und was es bringt aber ich habs einfach mal ausprobiert und erhalte folgendes:

    muss ich da noch was ändern ich versteh da nur bahnhof ^^

    Code
    C:\Users\Matze\Documents\Alle AutiIT-Test\Formel 1\dfdfdfdfdfdfdfddffdfdfdf.au3 (12) : ==> Error in expression.:
    $sSearchBase = '<LDAP://' & $oRootDSE.Get('defaultNamingContext') & '>'
    $sSearchBase = ^ ERROR

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Darter, kann es sein, das dir eine Windows Domäne und somit ein Active Directory (LDAP Server) fehlt??

    @DaX, das mit dem umbennen hatte ich mir auch schon überlegt, aber ich habe da bedenken, das es mit die bestehen Gruppen/Mitglieder eventuell überschreibt/zerhaut, bzw. ob er nicht rum meckert das es die Gruppe ja schon gibt (was er tut, wenn man es manuelle testet) ??

  • Also ich habe es fast geschafft, jetzt erhalte ich nur noch ein Fehlermeldung, mit der ich nichts anfangen kann, bzw. die ich mir nicht erklären kann.

    Hier mein Code:

    Spoiler anzeigen
    [autoit]

    #include <AD.au3>

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

    $usertext = FileOpen ("D:\AutoIT\user.txt", 0)
    _AD_Open()

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

    $Logfile = FileOpen("D:\AutoIt\AD-Log.txt", 2)
    $LogDokuSchreiber = FileOpen("D:\AutoIT\DokuSchreiber-LOG.txt", 1)
    $LogDokuAenderer = FileOpen("D:\AutoIT\DokuAenderer-LOG.txt", 1)

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

    Dim $DokuSchreiber[1]
    Dim $DokuAdmin[1]
    Dim $DokuAendererPlus[1]
    Dim $UserFQDN
    Dim $User

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

    While 1
    ;user.txt wird Zeile für Zeile eingelesen, nach der letzten Zeile geht er aus der While Schleife.
    $UserFQDN = FileReadLine($usertext)
    If @error = -1 Then ExitLoop

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

    ;eingelesenr User FQDN wird hier als Benutzername aufgelöst
    $User = _AD_FQDNToSamAccountName($UserFQDN)
    ;jetzt werden alle Gruppen des Users eingelesen
    $aUserGr = _AD_GetUserGroups($User)

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

    ReDim $DokuSchreiber[1]
    ReDim $DokuAdmin[1]
    ReDim $DokuAendererPlus[1]
    $x = 1
    $y = 1

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

    ; DokuSchreiber Gruppen werden hier gefunden
    For $x =1 to $aUserGr[0]
    IF StringRegExp($aUserGr[$x],"DokuSchreiber") Then
    ReDim $DokuSchreiber[UBound($DokuSchreiber)+1]
    $DokuSchreiber[$y] = $aUserGr[$x]
    FileWriteLine($LogDokuSchreiber, $aUserGr[$x])
    $y = $y +1
    EndIf

    Next
    $DokuSchreiber[0] =UBound($DokuSchreiber)-1
    $x = 1
    $y = 1

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

    ; DokuAendererPlus Gruppen werden hier gefunden
    For $x =1 to $aUserGr[0]
    IF StringRegExp($aUserGr[$x],"DokuAendererPlus") Then
    ReDim $DokuAendererPlus[UBound($DokuAendererPlus)+1]
    $DokuAendererPlus[$y] = $aUserGr[$x]
    FileWriteLine($LogDokuAenderer, $aUserGr[$x])
    $y = $y +1
    EndIf

    Next
    $DokuAendererPlus[0] =UBound($DokuAendererPlus)-1
    $x = 1
    $y = 1

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

    ; DokuSchreiber String wird zu DokuAdmin String
    While $x <= $DokuSchreiber[0]
    ReDim $DokuAdmin[UBound($DokuAdmin)+1]
    $DokuAdmin[$y]=StringRegExpReplace($DokuSchreiber[$x],"DokuSchreiber","DokuAdmin")
    $y = $y +1
    $x = $x +1
    WEnd
    $x = 1
    ; DokuAendererPlus String wird zu DokuAdmin String
    While $x <= $DokuAendererPlus[0]
    ReDim $DokuAdmin[UBound($DokuAdmin)+1]
    $DokuAdmin[$y]=StringRegExpReplace($DokuAendererPlus[$x],"DokuAendererPlus","DokuAdmin")
    $y = $y +1
    $x = $x +1
    WEnd

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

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

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

    ; Benutzer wird in die DokuAdmin Gruppe hinzugefügt
    $x = 0
    $z = 0
    While $x <= $DokuAdmin[0]
    _AD_AddUserToGroup($DokuAdmin[$x],$User)
    If $z=0 Then
    FileWriteLine($Logfile, "Benutzer "&$User&" wurde in "&$DokuAdmin[$x]&" DokuAdmin-Gruppe(n) hinzugefügt.")
    $z = $z +1
    Else
    FileWriteLine($Logfile, "Benutzer "&$User&" wurde in der Gruppe "&$DokuAdmin[$x]&" hinzugefügt.")
    EndIf
    $x = $x +1
    WEnd

    ; Benutzer wird aus der DokuSchreiber Gruppe gelöscht
    $x = 0
    $z = 0
    While $x <= $DokuSchreiber[0]
    _AD_RemoveUserFromGroup($DokuSchreiber[$x],$User)
    If $z=0 Then
    FileWriteLine($Logfile, "Benutzer "&$User&" wurde in "&$DokuSchreiber[$x]&" DokuSchreiber-Gruppe(n) gelöscht.")
    $z = $z +1
    Else
    FileWriteLine($Logfile, "Benutzer "&$User&" wurde in der Gruppe "&$DokuSchreiber[$x]&" gelöscht.")
    EndIf
    $x = $x +1
    WEnd

    ; Benutzer wird aus der DokuAendererPlus Gruppe gelöscht
    $x = 0
    $z = 0
    While $x <= $DokuAendererPlus[0]
    _AD_RemoveUserFromGroup($DokuAendererPlus[$x],$User)
    If $z=0 Then
    FileWriteLine($Logfile, "Benutzer "&$User&" wurde in "&$DokuAendererPlus[$x]&" AendererPlus-Gruppe(n) gelöscht.")
    $z = $z +1
    Else
    FileWriteLine($Logfile, "Benutzer "&$User&" wurde in der Gruppe "&$DokuAendererPlus[$x]&" gelöscht.")
    EndIf
    $x = $x +1
    WEnd

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

    FileWriteLine($Logfile, "----------------------------------------------------------------------------------------------------------------------------")

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

    Wend

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

    _AD_Close()
    ;_ArrayDisplay($DokuSchreiber, "Alle DokuSchreiber")
    ;_ArrayDisplay($DokuAdmin, "Alle DokuAdmin")
    ;_ArrayDisplay($aUserGr, "Alle")
    Exit

    [/autoit]


    Und hier die Fehlermeldung:


    Wäre dankbar, wenn mir einer mein Fehler erklären könnte.

    DANKE

  • Die Fehlermeldung sagt aus, dass $aUserGr kein Array ist, das heisst hier

    [autoit]

    ;jetzt werden alle Gruppen des Users eingelesen
    $aUserGr = _AD_GetUserGroups($User)

    [/autoit]

    wurde nichts zurückgeben. Entweder die Funktion ist fehlerhaft oder der User ist in keiner Gruppe Mitglied. Mit

    [autoit]

    if IsArray($aUserGr) then
    ...
    endif

    [/autoit]

    kannst du den Fehler vermeiden. Ob dein Skript dann das gewünschte Ergebnis liefert weis ich leider nicht,

    mfg (Ato)Bert

  • Die Fehlermeldung sagt aus, dass $aUserGr kein Array ist, das heisst hier

    [autoit]

    ;jetzt werden alle Gruppen des Users eingelesen
    $aUserGr = _AD_GetUserGroups($User)

    [/autoit]

    wurde nichts zurückgeben. Entweder die Funktion ist fehlerhaft oder der User ist in keiner Gruppe Mitglied. Mit

    [autoit]

    if IsArray($aUserGr) then
    ...
    endif

    [/autoit]

    kannst du den Fehler vermeiden...

    Die _AD_-Funktionen geben alle im Fehlerfall einen Returncode (@error und ev. @extended) zurück. Dieser sollte vor einer Weiterverarbeitung geprüft werden.
    Sollte die Funktion fehlerhaft sein, bitte ich um eine Meldung im englischen Forum (Link zum Thread siehe meine Signatur).