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