none
Zwei OU´s abgleichen, verschieden namige Gruppen synchron halten RRS feed

  • Frage

  • Hallo liebe Community,

    vor einigen Monaten konnte ich schonmal ein Skript mit jemanden hier erarbeiten das wir noch immer in unserere Firma einsetzen und so aussieht:

    #Beschreibung:
    # Die Gruppen von 2 OUs werden Synchron gehalten
    # Wenn eine Gruppe aus der Quell OU in der Ziel OU nicht existiert wird Sie angelegt
    # Die Mitglieder aus den Gruppe der Quell OU werden in die entsprechenden Namensgleichen Gruppen kopiert
    # Die Mitglieder die in der Namensgleichen Gruppe der Ziel OU überzählig sind, werden aus dieser entfernt
    
    # Quest Active Directory Snapin laden, wenn es noch nicht geladen wurde
    If ( -not (Get-PSSnapin Quest.ActiveRoles.ADManagement -ErrorAction SilentlyContinue)) {
        Add-PSSnapIn -Name "Quest.ActiveRoles.ADManagement"
    }
    
    #Festlegen der Quell_OU und Ziel_OU
    $Quell_OU = "OU=VG-AT,OU=OM,OU=Groups,OU=Resources,DC=com,DC=firma,DC=net"
    $Ziel_OU = "OU=GROUPS,OU=ORG-EDV,OU=SL,DC=at,DC=firma,DC=net"
    
    # Alle Gruppen aus der Quell_OU holen
    ForEach($QuellGruppe in Get-QADGroup -SearchRoot $Quell_OU) {
    
    	# Gruppen Pfad der Ziel-Gruppe Konstruieren
    	$ZielGruppe = "CN=" + $QuellGruppe.Name + "," + $Ziel_OU
    
        # Wenn die Gruppe mit dem selben Namen in der Ziel_OU nicht existiert wird sie angelegt
    	# Damit wird sichergestellt das die Gruppe im Ziel vorhanden ist
        If (-not (Get-QADGroup $ZielGruppe)) {
    		#Identische Gruppen in der Ziel_OU anlegen (falls nicht gewünscht, kommentieren)
    		New-QADGroup -GroupType $QuellGruppe.GroupType -GroupScope $QuellGruppe.GroupScope -SamAccountName $QuellGruppe.SamAccountName -Name $QuellGruppe.Name -Parentcontainer $Ziel_OU 
    	}
    
    	# Die Member aus den Gruppen holen.
    	# Um die Listen miteinander vergleichen zu können, benötigen wir nur den Name! 
    	$DNQuellMember = Get-QADGroupMember $QuellGruppe | ForEach-Object { $_.Name }
    	$DNZielMember = Get-QADGroupMember $ZielGruppe | ForEach-Object { $_.Name}
    	
    	
    	# Mitglieder in die Ziel-Gruppe Kopieren
    	# Alle Mitglieder der Quell-Gruppe durchlaufen
    	ForEach($DNMember in $DNQuellMember) {
    		
           # Testen ob der User noch nicht in der Ziel-Gruppe enthalten ist
    		If(-not ($DNZielMember -contains $DNMember)) {
    			# Mitglied ist noch nicht in der Ziel-Gruppe
    			# Mitglied in die Ziel-Gruppe einfügen
                Write-Host "Hinzufügen von Member $DNMember in die Gruppe: $ZielGruppe"
    			Add-QADGroupMember -Identity $ZielGruppe -Member $DNMember
    		}
    	}
    	
    
        # Die Member erneut aus den Gruppen holen.
        # Um die Listen miteinander vergleichen zu können, benötigen wir nur den Name! 
        $DNQuellMember = Get-QADGroupMember $QuellGruppe | ForEach-Object { $_.Name }
        $DNZielMember = Get-QADGroupMember $ZielGruppe | ForEach-Object { $_.Name}
    
    
    	# Überzählige Mitglieder aus der Ziel Gruppe entfernen
    	# Alle MItglieder der Zielgruppe durchlaufen
    	ForEach($DNMember in $DNZielMember) {
                  
    		# Testen ob der User nicht in der Quell Gruppe enthalten ist
    		If(-not ($DNQuellMember -contains $DNMember) -and (-Not($DNMember.StartsWith("Gruppenuser-")))) {
    			# Mitglied ist in der Ziel-Gruppe überzählig
    			# Mitglied wird aus der Ziel-Gruppe entfernt
                Write-Host "Ich entfernen den Member: $DNMember von der Gruppe: $ZielGruppe"
    			Remove-QADGroupMember -Identity $ZielGruppe -Member $DNMember
    		}
    	}
    }

    Nun kommt aber ein Wunsch von unserem IT-Leiter hinzu und zwar werden alle in der OU von der Domäne at.firma.net befindlichen Gruppen umbenannt, bzw. es werden die zwei vordersten Zeichen (zz) gelöscht. Die Gruppen in der OU von der Domäne com.firma.net bleiben jedoch unverändert.

    z.B.: In der Domäne at.firma.net gibt es die Gruppe zzat-test diese wird umbenannt in at-test, jedoch in der Domäne com.Firma.net heißt die Gruppe noch zzat-test. Das Skript ist aber dazu ausgelegt nur gleichnamige Gruppen synchron zu halten...hab mich nun heute selber daran versucht und folgendes auf die Beine gestellt, was aber so gar nicht klappt:

    #Beschreibung:
    # Die Gruppen von 2 OUs werden Synchron gehalten
    # Wenn eine Gruppe aus der Quell OU in der Ziel OU nicht existiert wird Sie angelegt
    # Die Mitglieder aus den Gruppe der Quell OU werden in die entsprechenden Namensgleichen Gruppen kopiert
    # Die Mitglieder die in der Namensgleichen Gruppe der Ziel OU überzählig sind, werden aus dieser entfernt
    
    # Quest Active Directory Snapin laden, wenn es noch nicht geladen wurde
    If ( -not (Get-PSSnapin Quest.ActiveRoles.ADManagement -ErrorAction SilentlyContinue)) {
        Add-PSSnapIn -Name "Quest.ActiveRoles.ADManagement"
    }
    
    #Festlegen der Quell_OU und Ziel_OU
    $Quell_OU = "OU=VG-AT,OU=OM,OU=Groups,OU=Resources,DC=com,DC=firma,DC=net"
    $Ziel_OU = "OU=GROUPS,OU=ORG-EDV,OU=SL,DC=at,DC=firma,DC=net"
    
    # Alle Gruppen aus der Quell_OU holen
    ForEach($QuellGruppe in Get-QADGroup -SearchRoot $Quell_OU) {
    
    #Wenn Name der Quellgruppe mit zz beginnt dann, die zwei z´s entfernen
    	if($QuellGruppe.Name.StartsWith("zz")){
    		# Gruppenpfad der Ziel-Gruppe
    		$ZielGruppe = "CN=" + $QuellGruppe.Name.Remove(0,2) + "," + $Ziel_OU
    	}
    
        # Wenn die Gruppe mit dem selben Namen in der Ziel_OU nicht existiert wird sie angelegt
    	# Damit wird sichergestellt das die Gruppe im Ziel vorhanden ist
        If (-not (Get-QADGroup $ZielGruppe)) {
    		#Identische Gruppen in der Ziel_OU anlegen (falls nicht gewünscht, kommentieren)
    		New-QADGroup -GroupType $QuellGruppe.GroupType -GroupScope $QuellGruppe.GroupScope -SamAccountName $QuellGruppe.SamAccountName -Name $QuellGruppe.Name -Parentcontainer $Ziel_OU 
    	}
    
    	# Die Member aus den Gruppen holen.
    	# Um die Listen miteinander vergleichen zu können, benötigen wir nur den Name! 
    	$DNQuellMember = Get-QADGroupMember $QuellGruppe | ForEach-Object { $_.Name }
    	$DNZielMember = Get-QADGroupMember $ZielGruppe | ForEach-Object { $_.Name}
    	
    	
    	# Mitglieder in die Ziel-Gruppe Kopieren
    	# Alle Mitglieder der Quell-Gruppe durchlaufen
    	ForEach($DNMember in $DNQuellMember) {
    		
           # Testen ob der User noch nicht in der Ziel-Gruppe enthalten ist
    		If(-not ($DNZielMember -contains $DNMember)) {
    			# Mitglied ist noch nicht in der Ziel-Gruppe
    			# Mitglied in die Ziel-Gruppe einfügen
                Write-Host "Hinzufügen von Member $DNMember in die Gruppe: $ZielGruppe"
    			Add-QADGroupMember -Identity $ZielGruppe -Member $DNMember
    		}
    	}
    	
    
        # Die Member erneut aus den Gruppen holen.
        # Um die Listen miteinander vergleichen zu können, benötigen wir nur den Name! 
        $DNQuellMember = Get-QADGroupMember $QuellGruppe | ForEach-Object { $_.Name }
        $DNZielMember = Get-QADGroupMember $ZielGruppe | ForEach-Object { $_.Name}
    
    
    	# Überzählige Mitglieder aus der Ziel Gruppe entfernen
    	# Alle MItglieder der Zielgruppe durchlaufen
    	ForEach($DNMember in $DNZielMember) {
                  
    		# Testen ob der User nicht in der Quell Gruppe enthalten ist
    		If(-not ($DNQuellMember -contains $DNMember) -and (-Not($DNMember.StartsWith("Gruppenuser-")))) {
    			# Mitglied ist in der Ziel-Gruppe überzählig
    			# Mitglied wird aus der Ziel-Gruppe entfernt
                Write-Host "Ich entfernen den Member: $DNMember von der Gruppe: $ZielGruppe"
    			Remove-QADGroupMember -Identity $ZielGruppe -Member $DNMember
    		}
    	}
    }

    Hab also eigentlich nur:

    #Wenn Name der Quellgruppe mit zz beginnt dann, die zwei z´s entfernen
    	if($QuellGruppe.Name.StartsWith("zz")){
    		# Gruppenpfad der Ziel-Gruppe
    		$ZielGruppe = "CN=" + $QuellGruppe.Name.Remove(0,2) + "," + $Ziel_OU
    	}
    hinzugefügt. Das wäre aber wohl zu simpel gewesen...

    Leider funktioniert so die Synchronisierung nicht, es gibt in der com.firma.net auch Gruppen die wiederum Gruppen enthalten die mit zzat-... beginnen welche auch nicht synchronisiert werden können...das ganze stellt sich mittlerweile als sehr komplex (also für mich) heraus.

    Ich hoffe man kann einigermaßen verstehen worauf ich hinaus will und was gesucht ist und bitte um eine kleinen Rat, Vorschlag oder Hilfestellung wie ich das bewerkstelligen könnte.

    Mit freundlichen Grüßen,

    Menthoxx



    • Bearbeitet Menthoxx Montag, 4. November 2013 17:47
    Montag, 4. November 2013 17:45

Antworten

  • So müsste es gehen:

    #Beschreibung:
    # Die Gruppen von 2 OUs werden Synchron gehalten
    # Wenn eine Gruppe aus der Quell OU in der Ziel OU nicht existiert wird Sie angelegt
    # Die Mitglieder aus den Gruppe der Quell OU werden in die entsprechenden Namensgleichen Gruppen kopiert
    # Die Mitglieder die in der Namensgleichen Gruppe der Ziel OU überzählig sind, werden aus dieser entfernt
    
    # Präfix der von den Gruppen abgeschnitten oder zugefügt werden soll
    $Präfix = "zz"
    
    # Quest Active Directory Snapin laden, wenn es noch nicht geladen wurde
    If ( -not (Get-PSSnapin Quest.ActiveRoles.ADManagement -ErrorAction SilentlyContinue)) {
        Add-PSSnapIn -Name "Quest.ActiveRoles.ADManagement"
    }
    
    #Festlegen der Quell_OU und Ziel_OU
    $Quell_OU = "OU=VG-AT,OU=OM,OU=Groups,OU=Resources,DC=com,DC=firma,DC=net"
    $Ziel_OU = "OU=GROUPS,OU=ORG-EDV,OU=SL,DC=at,DC=firma,DC=net"
    
    # Alle Gruppen aus der Quell_OU holen
    ForEach($QuellGruppe in Get-QADGroup -SearchRoot $Quell_OU) {
    
    	# Gruppen Pfad der Ziel-Gruppe Konstruieren und den namen der Zielgruppe
    	If ($QuellGruppe.Name.Startswith($Präfix)) {
    		# Name der Zielgruppen erstellen ohne die führenden Zeichen
    		$ZielGruppenName = $QuellGruppe.Name.Remove(0,$Präfix.Length)
    		# Zielgruppen Pfad erstellen ohne die führenden Zeichen
    		$ZielGruppe = "CN=" + $ZielGruppenName + "," + $Ziel_OU
    
    	} Else {
    		# Zielgruppen Pfad erstellen
    		$ZielGruppe = "CN=" + $QuellGruppe.Name + "," + $Ziel_OU
    		# Name der Zielgruppen kopieren
    		$ZielGruppenName = $QuellGruppe.Name
    	}
    
        # Wenn die Gruppe mit dem selben Namen in der Ziel_OU nicht existiert wird sie angelegt
    	# Damit wird sichergestellt das die Gruppe im Ziel vorhanden ist
        If (-not (Get-QADGroup $ZielGruppe)) {
    		#Identische Gruppen in der Ziel_OU anlegen (falls nicht gewünscht, kommentieren)
    		
    ###################### ACHTUNG! ###################################
    		# Ich habe im folgenden Befehl den SamAccountName = Name gesetzt! (Es ist in den Meisten ADs so geregelt, das SamAccountName = Name ist)
    		# Wenn in eurem AD nicht SamAccountName = Name ist, müssen wir den SamAccountName genauso wie den Namen abschneiden!??
    		New-QADGroup -GroupType $QuellGruppe.GroupType -GroupScope $QuellGruppe.GroupScope -SamAccountName $ZielGruppenName -Name $ZielGruppenName -Parentcontainer $Ziel_OU 
    	}
    
    	# Die Member aus den Gruppen holen.
    	# Um die Listen miteinander vergleichen zu können, benötigen wir nur den Name! 
    	$DNQuellMember = Get-QADGroupMember $QuellGruppe | ForEach-Object { $_.Name }
    	$DNZielMember = Get-QADGroupMember $ZielGruppe | ForEach-Object { $_.Name}
    	
    	# Mitglieder in die Ziel-Gruppe Kopieren
    	# Alle Mitglieder der Quell-Gruppe durchlaufen
    	ForEach($DNMember in $DNQuellMember) {
    	
    		# Den namen der Zielgruppemember konstruieren
    		If ($DNMember.Startswith($Präfix)) {
    			# Name des Zielmember erstellen ohne die führenden Zeichen
    			$DNMember = $DNMember.Remove(0,$Präfix.Length)
    		}
    		
           # Testen ob der User noch nicht in der Ziel-Gruppe enthalten ist
    		If(-not ($DNZielMember -contains $DNMember)) {
    			# Mitglied ist noch nicht in der Ziel-Gruppe
    			# Mitglied in die Ziel-Gruppe einfügen
                Write-Host "Hinzufügen von Member $DNMember in die Gruppe: $ZielGruppe"
    			Add-QADGroupMember -Identity $ZielGruppe -Member $DNMember
    		}
    	}
    
        # Die Member erneut aus den Gruppen holen.
        # Um die Listen miteinander vergleichen zu können, benötigen wir nur den Name! 
        $DNQuellMember = Get-QADGroupMember $QuellGruppe | ForEach-Object { $_.Name }
        $DNZielMember = Get-QADGroupMember $ZielGruppe | ForEach-Object { $_.Name}
    
    	# Überzählige Mitglieder aus der Ziel Gruppe entfernen
    	# Alle MItglieder der Zielgruppe durchlaufen
    	ForEach($DNMember in $DNZielMember) {
            
    		# Den präfix den Gruppennamen hinzufügen 	  
    		$DNMember = $Präfix + $DNMember
    			  
    		# Testen ob der User nicht in der Quell Gruppe enthalten ist
    		If(-not ($DNQuellMember -contains $DNMember) -and (-Not($DNMember.StartsWith("Gruppenuser-")))) {
    			# Mitglied ist in der Ziel-Gruppe überzählig
    			# Mitglied wird aus der Ziel-Gruppe entfernt
                Write-Host "Ich entfernen den Member: $DNMember von der Gruppe: $ZielGruppe"
    			Remove-QADGroupMember -Identity $ZielGruppe -Member $DNMember
    		}
    	}
    }

    Ich habe die Variable $Präfix eingeführt. Den Präfix brachat du nur an dieser einen stelle ändern.

    Bei der Zeile .....

    		If(-not ($DNQuellMember -contains $DNMember) -and (-Not($DNMember.StartsWith("Gruppenuser-")))) {

    ..... bin ich mir nicht sicher ob wir das mit dem  -Not($DNMember.StartsWith("Gruppenuser-")) so lassen können.




    Meine PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    Mein deutscher PowerShell Blog
    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+ | Deutsches PowerShell Forum (TechNet)

    Mittwoch, 6. November 2013 06:42

Alle Antworten

  • Hallo Menthoxx,

    ich bins wieder der Peter! ;-))

    So müsst es tun, gehn, haben, sollen, sein.... (ungetestet !!!):

    #Beschreibung:
    # Die Gruppen von 2 OUs werden Synchron gehalten
    # Wenn eine Gruppe aus der Quell OU in der Ziel OU nicht existiert wird Sie angelegt
    # Die Mitglieder aus den Gruppe der Quell OU werden in die entsprechenden Namensgleichen Gruppen kopiert
    # Die Mitglieder die in der Namensgleichen Gruppe der Ziel OU überzählig sind, werden aus dieser entfernt
    
    # Quest Active Directory Snapin laden, wenn es noch nicht geladen wurde
    If ( -not (Get-PSSnapin Quest.ActiveRoles.ADManagement -ErrorAction SilentlyContinue)) {
        Add-PSSnapIn -Name "Quest.ActiveRoles.ADManagement"
    }
    
    #Festlegen der Quell_OU und Ziel_OU
    $Quell_OU = "OU=VG-AT,OU=OM,OU=Groups,OU=Resources,DC=com,DC=firma,DC=net"
    $Ziel_OU = "OU=GROUPS,OU=ORG-EDV,OU=SL,DC=at,DC=firma,DC=net"
    
    # Alle Gruppen aus der Quell_OU holen
    ForEach($QuellGruppe in Get-QADGroup -SearchRoot $Quell_OU) {
    
    	# Gruppen Pfad der Ziel-Gruppe Konstruieren und den namen der Zielgruppe
    	If ($QuellGruppe.Name.Startswith("zz")) {
    		# Zielgruppen Pfad erstellen ohne die führenden 2 Zeichen
    		$ZielGruppe = "CN=" + $QuellGruppe.Name.Remove(0,2) + "," + $Ziel_OU
    		# Name der Zielgruppen erstellen ohne die führenden 2 Zeichen
    		$ZielGruppenName = $QuellGruppe.Name.Remove(0,2)
    	} Else {
    		# Zielgruppen Pfad erstellen
    		$ZielGruppe = "CN=" + $QuellGruppe.Name + "," + $Ziel_OU
    		# Name der Zielgruppen kopieren
    		$ZielGruppenName = $QuellGruppe.Name
    	}
    
        # Wenn die Gruppe mit dem selben Namen in der Ziel_OU nicht existiert wird sie angelegt
    	# Damit wird sichergestellt das die Gruppe im Ziel vorhanden ist
        If (-not (Get-QADGroup $ZielGruppe)) {
    		#Identische Gruppen in der Ziel_OU anlegen (falls nicht gewünscht, kommentieren)
    		
    ###################### ACHTUNG! ###################################
    		# Ich habe im folgenden Befehl den SamAccountName = Name gesetzt! (Es ist in den Meisten ADs so geregelt, das SamAccountName = Name ist)
    		# Wenn in eurem AD nicht SamAccountName = Name ist, müssen wir den SamAccountName genauso wie den Namen abschneiden!??
    		New-QADGroup -GroupType $QuellGruppe.GroupType -GroupScope $QuellGruppe.GroupScope -SamAccountName $ZielGruppenName -Name $ZielGruppenName -Parentcontainer $Ziel_OU 
    	}
    
    	# Die Member aus den Gruppen holen.
    	# Um die Listen miteinander vergleichen zu können, benötigen wir nur den Name! 
    	$DNQuellMember = Get-QADGroupMember $QuellGruppe | ForEach-Object { $_.Name }
    	$DNZielMember = Get-QADGroupMember $ZielGruppe | ForEach-Object { $_.Name}
    	
    	
    	# Mitglieder in die Ziel-Gruppe Kopieren
    	# Alle Mitglieder der Quell-Gruppe durchlaufen
    	ForEach($DNMember in $DNQuellMember) {
    		
           # Testen ob der User noch nicht in der Ziel-Gruppe enthalten ist
    		If(-not ($DNZielMember -contains $DNMember)) {
    			# Mitglied ist noch nicht in der Ziel-Gruppe
    			# Mitglied in die Ziel-Gruppe einfügen
                Write-Host "Hinzufügen von Member $DNMember in die Gruppe: $ZielGruppe"
    			Add-QADGroupMember -Identity $ZielGruppe -Member $DNMember
    		}
    	}
    	
    
        # Die Member erneut aus den Gruppen holen.
        # Um die Listen miteinander vergleichen zu können, benötigen wir nur den Name! 
        $DNQuellMember = Get-QADGroupMember $QuellGruppe | ForEach-Object { $_.Name }
        $DNZielMember = Get-QADGroupMember $ZielGruppe | ForEach-Object { $_.Name}
    
    
    	# Überzählige Mitglieder aus der Ziel Gruppe entfernen
    	# Alle MItglieder der Zielgruppe durchlaufen
    	ForEach($DNMember in $DNZielMember) {
                  
    		# Testen ob der User nicht in der Quell Gruppe enthalten ist
    		If(-not ($DNQuellMember -contains $DNMember) -and (-Not($DNMember.StartsWith("Gruppenuser-")))) {
    			# Mitglied ist in der Ziel-Gruppe überzählig
    			# Mitglied wird aus der Ziel-Gruppe entfernt
                Write-Host "Ich entfernen den Member: $DNMember von der Gruppe: $ZielGruppe"
    			Remove-QADGroupMember -Identity $ZielGruppe -Member $DNMember
    		}
    	}
    }


    Meine PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    Mein deutscher PowerShell Blog
    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+ | Deutsches PowerShell Forum (TechNet)

    Dienstag, 5. November 2013 07:58
  • Hallo Peter,

    du bist wohl wieder einmal meine Rettung! (;

    Also ich habe auch mit deinem Vorschlag noch ein Problem und zwar:

    In der Domäne 1 gibt es Gruppen in Gruppen (alle beginnen mit zz) und in unserer Domäne gibt es auch Gruppen in Gruppen (das zz ist schon entfernt). Nun denkt das Skript, ach da ist ja ein neues Mitglied (zz-Gruppe) in der Gruppe in Domäne 1 dann will er diese natürlich auch in der Gruppe in Domäne 2 anlegen, aber dort ist ja schon eine Gruppe ohne zz

    Dann kommt die Meldung:

    Add-QADGroupMember : Der Server kann die Anforderung nicht ausführen. (Ausnahme von HRESULT: 0x80072035)

    Vllt. noch ein Beispiel (ist nicht einfach zu erklären):

    Domäne 1:

    Gruppe: zzat-test

    Mitglieder: zzat-gruppe1, zzat-gruppe2, zzat-gruppe3 (sind alles Gruppen)

    Domäne 2:

    Gruppe: at-test

    Mitglieder: at-gruppe1, at-gruppe2, at-gruppe3 (sind alles Gruppen)

    noch ein Screen von Domäne 2:

    Und von Domäne 1:

    Rein theoretisch sind das alles die selben Gruppen und Mitglieder, also müsste er gar nix hinzufügen, versucht es aber :s

    Achja die Zeile:

        # Wenn die Gruppe mit dem selben Namen in der Ziel_OU nicht existiert wird sie angelegt
    	# Damit wird sichergestellt das die Gruppe im Ziel vorhanden ist
        If (-not (Get-QADGroup $ZielGruppe)) {
    		#Identische Gruppen in der Ziel_OU anlegen (falls nicht gewünscht, kommentieren)
    		
    ###################### ACHTUNG! ###################################
    		# Ich habe im folgenden Befehl den SamAccountName = Name gesetzt! (Es ist in den Meisten ADs so geregelt, das SamAccountName = Name ist)
    		# Wenn in eurem AD nicht SamAccountName = Name ist, müssen wir den SamAccountName genauso wie den Namen abschneiden!??
    		New-QADGroup -GroupType $QuellGruppe.GroupType -GroupScope $QuellGruppe.GroupScope -SamAccountName $ZielGruppenName -Name $ZielGruppenName -Parentcontainer $Ziel_OU 
    	}
    verwenden wir momentan nicht.

    Liebe Grüße,

    Menthoox





    • Bearbeitet Menthoxx Dienstag, 5. November 2013 10:03
    Dienstag, 5. November 2013 08:31
  • Ja das ist Komplex.
    ich habe im Moment keine Ruhe mich damit zu beschäftigen.

    Melde mich später (Morgen) nochmal.


    Meine PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    Mein deutscher PowerShell Blog
    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+ | Deutsches PowerShell Forum (TechNet)

    Dienstag, 5. November 2013 09:19
  • Kein Problem, ich werde mal weiter rumprobieren und versuchen etwas brauchbares zu basteln (:

    Vielen dank schonmal!

    Dienstag, 5. November 2013 09:25
  • So müsste es gehen:

    #Beschreibung:
    # Die Gruppen von 2 OUs werden Synchron gehalten
    # Wenn eine Gruppe aus der Quell OU in der Ziel OU nicht existiert wird Sie angelegt
    # Die Mitglieder aus den Gruppe der Quell OU werden in die entsprechenden Namensgleichen Gruppen kopiert
    # Die Mitglieder die in der Namensgleichen Gruppe der Ziel OU überzählig sind, werden aus dieser entfernt
    
    # Präfix der von den Gruppen abgeschnitten oder zugefügt werden soll
    $Präfix = "zz"
    
    # Quest Active Directory Snapin laden, wenn es noch nicht geladen wurde
    If ( -not (Get-PSSnapin Quest.ActiveRoles.ADManagement -ErrorAction SilentlyContinue)) {
        Add-PSSnapIn -Name "Quest.ActiveRoles.ADManagement"
    }
    
    #Festlegen der Quell_OU und Ziel_OU
    $Quell_OU = "OU=VG-AT,OU=OM,OU=Groups,OU=Resources,DC=com,DC=firma,DC=net"
    $Ziel_OU = "OU=GROUPS,OU=ORG-EDV,OU=SL,DC=at,DC=firma,DC=net"
    
    # Alle Gruppen aus der Quell_OU holen
    ForEach($QuellGruppe in Get-QADGroup -SearchRoot $Quell_OU) {
    
    	# Gruppen Pfad der Ziel-Gruppe Konstruieren und den namen der Zielgruppe
    	If ($QuellGruppe.Name.Startswith($Präfix)) {
    		# Name der Zielgruppen erstellen ohne die führenden Zeichen
    		$ZielGruppenName = $QuellGruppe.Name.Remove(0,$Präfix.Length)
    		# Zielgruppen Pfad erstellen ohne die führenden Zeichen
    		$ZielGruppe = "CN=" + $ZielGruppenName + "," + $Ziel_OU
    
    	} Else {
    		# Zielgruppen Pfad erstellen
    		$ZielGruppe = "CN=" + $QuellGruppe.Name + "," + $Ziel_OU
    		# Name der Zielgruppen kopieren
    		$ZielGruppenName = $QuellGruppe.Name
    	}
    
        # Wenn die Gruppe mit dem selben Namen in der Ziel_OU nicht existiert wird sie angelegt
    	# Damit wird sichergestellt das die Gruppe im Ziel vorhanden ist
        If (-not (Get-QADGroup $ZielGruppe)) {
    		#Identische Gruppen in der Ziel_OU anlegen (falls nicht gewünscht, kommentieren)
    		
    ###################### ACHTUNG! ###################################
    		# Ich habe im folgenden Befehl den SamAccountName = Name gesetzt! (Es ist in den Meisten ADs so geregelt, das SamAccountName = Name ist)
    		# Wenn in eurem AD nicht SamAccountName = Name ist, müssen wir den SamAccountName genauso wie den Namen abschneiden!??
    		New-QADGroup -GroupType $QuellGruppe.GroupType -GroupScope $QuellGruppe.GroupScope -SamAccountName $ZielGruppenName -Name $ZielGruppenName -Parentcontainer $Ziel_OU 
    	}
    
    	# Die Member aus den Gruppen holen.
    	# Um die Listen miteinander vergleichen zu können, benötigen wir nur den Name! 
    	$DNQuellMember = Get-QADGroupMember $QuellGruppe | ForEach-Object { $_.Name }
    	$DNZielMember = Get-QADGroupMember $ZielGruppe | ForEach-Object { $_.Name}
    	
    	# Mitglieder in die Ziel-Gruppe Kopieren
    	# Alle Mitglieder der Quell-Gruppe durchlaufen
    	ForEach($DNMember in $DNQuellMember) {
    	
    		# Den namen der Zielgruppemember konstruieren
    		If ($DNMember.Startswith($Präfix)) {
    			# Name des Zielmember erstellen ohne die führenden Zeichen
    			$DNMember = $DNMember.Remove(0,$Präfix.Length)
    		}
    		
           # Testen ob der User noch nicht in der Ziel-Gruppe enthalten ist
    		If(-not ($DNZielMember -contains $DNMember)) {
    			# Mitglied ist noch nicht in der Ziel-Gruppe
    			# Mitglied in die Ziel-Gruppe einfügen
                Write-Host "Hinzufügen von Member $DNMember in die Gruppe: $ZielGruppe"
    			Add-QADGroupMember -Identity $ZielGruppe -Member $DNMember
    		}
    	}
    
        # Die Member erneut aus den Gruppen holen.
        # Um die Listen miteinander vergleichen zu können, benötigen wir nur den Name! 
        $DNQuellMember = Get-QADGroupMember $QuellGruppe | ForEach-Object { $_.Name }
        $DNZielMember = Get-QADGroupMember $ZielGruppe | ForEach-Object { $_.Name}
    
    	# Überzählige Mitglieder aus der Ziel Gruppe entfernen
    	# Alle MItglieder der Zielgruppe durchlaufen
    	ForEach($DNMember in $DNZielMember) {
            
    		# Den präfix den Gruppennamen hinzufügen 	  
    		$DNMember = $Präfix + $DNMember
    			  
    		# Testen ob der User nicht in der Quell Gruppe enthalten ist
    		If(-not ($DNQuellMember -contains $DNMember) -and (-Not($DNMember.StartsWith("Gruppenuser-")))) {
    			# Mitglied ist in der Ziel-Gruppe überzählig
    			# Mitglied wird aus der Ziel-Gruppe entfernt
                Write-Host "Ich entfernen den Member: $DNMember von der Gruppe: $ZielGruppe"
    			Remove-QADGroupMember -Identity $ZielGruppe -Member $DNMember
    		}
    	}
    }

    Ich habe die Variable $Präfix eingeführt. Den Präfix brachat du nur an dieser einen stelle ändern.

    Bei der Zeile .....

    		If(-not ($DNQuellMember -contains $DNMember) -and (-Not($DNMember.StartsWith("Gruppenuser-")))) {

    ..... bin ich mir nicht sicher ob wir das mit dem  -Not($DNMember.StartsWith("Gruppenuser-")) so lassen können.




    Meine PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    Mein deutscher PowerShell Blog
    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+ | Deutsches PowerShell Forum (TechNet)

    Mittwoch, 6. November 2013 06:42
  • Guten Morgen Peter,

    also das Skript läuft, hab es leicht angepasst mit dem Block:

    		# Wenn Member mit at-om beginnt (sind die Gruppen), ...
    		If ($DNMember.Startswith("at-om")) {
    		# dann den Präfix hinzufügen
    		$DNMember = $Präfix + $DNMember
    		}
     

    Hinzufügen und entfernen von Member tut sich aber noch nichts, es kommt immer wieder die Meldung:

    Remove-QADGroupMember : Cannot resolve directory object for the given identity: '.......'.

    aber immerhin wählt er zum hinzufügen/entfernen die richtigen Member schonmal aus! (:

    Aber warum findet er die Member nicht..? Hab sicherheitshalber mal am Anfang des Skripts "Connect-QADService -Service com.firma.net" hinzugefügt, ohne kann er nicht mal die Gruppen von der Domäne 1 auslesen...ich denke da gibt es noch ein Problem.

    Vielen Dank für deine tolle Hilfe!

    EDIT: Hab es nun hinbekommen, mit

    Connect-QADService at.firma.net
    			Remove-QADGroupMember -Identity $ZielGruppe -Member $DNMember
    			Connect-QADService com.firma.net
    gibt es auch eine einfachere methode? (; Oder kann man sich iwie auf 2 Domänen gleichzeitig verbinden?
    • Bearbeitet Menthoxx Mittwoch, 6. November 2013 09:42
    Mittwoch, 6. November 2013 09:12
  • Bitte den Präfix nur am anfang des Scriptes ändern, sonnst nichts!

    Der Präfix wird im Script mehrmals benutzt nicht nur an einer stelle!

    # Präfix der von den Gruppen abgeschnitten oder zugefügt werden soll
    $Präfix = "zz"


    Meine PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    Mein deutscher PowerShell Blog
    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+ | Deutsches PowerShell Forum (TechNet)

    Mittwoch, 6. November 2013 10:07
  • Hab ich gemacht (:
    Mittwoch, 6. November 2013 10:20
  • Ich weiß nicht was du gemacht hat! Du widersprichst dir!

    also das Skript läuft, hab es leicht angepasst mit dem Block:

    # Wenn Member mit at-om beginnt (sind die Gruppen), ... If ($DNMember.Startswith("at-om")) { # dann den Präfix hinzufügen $DNMember = $Präfix + $DNMember }


    Hast du es jetzt nun anpasst wie im grauen Zitat Kasten oder hast du nur die eine Stelle geändert wie folgend gezeigt?

    # Präfix der von den Gruppen abgeschnitten oder zugefügt werden soll
    $Präfix = "zz"


    Meine PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    Mein deutscher PowerShell Blog
    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+ | Deutsches PowerShell Forum (TechNet)


    Mittwoch, 6. November 2013 12:42