Powershell AD Gruppen synchronisieren

1 Kommentar zu Powershell AD Gruppen synchronisieren

Hallo zusammen,

vor kurzem bin ich bei einem Kunden auf folgendes Problem gestoßen:
Der Kunde hat OUs entsprechend seinen Standorten. In jeder OU gibt es Gruppen die den Zugriff auf Anwendungen steuern. Problem war nun aus den Gruppen der einzelnen OUs die User zusammenzuziehen und in eine übergeordnete Gruppe zu kopieren. Normalerweise hätte ich die Gruppen hinzugefügt und gut…aber nein die Software des Kunden lässt keine Gruppen in gruppen zu…und ein Produktwechsel ist ausgeschlossen.
Also mal fix (naja so fix war es nicht) ein Powershell-Script gebastelt:

Zunächst galt es die User von der Quelle zum Ziel zu schieben. Dabei muss man beachten, dass nur neue Nutzer geaddet werden, da sonst das Skript Fehler wirft. Daher die Arbeit mit compare-object um den Inhalt des Ziels mit den hinzuzufügenden Usern zu vergleichen. Ein wichtiger Punkt hierbei ist die Verwendung von -PassThru. Damit wird das Ergebniss des Vergleichs als Objekt ausgegeben und nicht als Liste.

1
2
3
4
5
6
7
8
9
10
11
12
13
Write-Host "User werden hinzugefügt..."
 
$useref = Get-ADGroupMember ef_anwendung1               #Auslesen der User der ersten Gruppe
$userje = Get-ADGroupMember je_anwendung1               #Auslesen der User der zweiten Gruppe
$usersu = Get-ADGroupMember su_anwendung1               #Auslesen der User der zweiten Gruppe
$bestand = Get-ADGroupMember G_anwendung1               #Auslesen der User in der Zielgruppe
 
$allusers = @($useref) + ($userje) + ($usersu)          #Addieren der Objekte
$Diff = @( Compare-Object $bestand $allusers -PassThru) #Vergleich der Gruppen
 
Add-ADGroupMember G_anwendung1 -Members $Diff           #Hinzufügen der Differenz zur Gruppe
 
Write-Host "User wurden hinzugefügt..."

Dann ist es natürlich auch wichtig, dass User die im Ziel existieren, aber in der Quelle nicht mehr, aus der Gruppe gelöscht werden:

1
2
3
4
Write-Host "User werden entfernt..."
$Remove = @( Compare-Object $allusers $bestand -PassThru | where {$_.SideIndicator -eq "=>"})
Remove-ADGroupMember G_anwendung1 -Members $Remove -Confirm:$false
Write-Host "User wurden entfernt..."

Um Fehlerquellen auszuschließen, hab ich noch ein Paar Schleifen eingebunden. Das ganze sieht dann so aus und läuft produktiv:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#########################################################################
# Script zum Hinzufügen aller relevanten User zur Gruppe G_anwendung1	#
# E. Berg 								#
# 24.11.2011								#
#########################################################################
cls
#########################################################################
# Variablen festlegen						  	#
#########################################################################
$useref = Get-ADGroupMember ef_anwendung1
$userje = Get-ADGroupMember je_anwendung1 
$usersu = Get-ADGroupMember su_anwendung1 
$bestand = Get-ADGroupMember G_anwendung1 
$allusers = @($useref) + ($userje) + ($usersu) 
 
#########################################################################
# Neue User hinzufügen						 	#
#########################################################################
function Add ()
{
	Write-Host "User werden hinzugefügt..."
 
	if ($bestand.Count -ne $null)
		{
		$Add = @( Compare-Object $bestand $allusers -PassThru | where {$_.SideIndicator -eq "=>"})
			if ($Add.Count -gt 0)
				{
				Add-ADGroupMember G_anwendung1 -Members $Add
				Write-Host "User wurden hinzugefügt..."
				}
			else
				{
				Write-Host "Keine neuen User"
				}
		}
	else
		{
		Add-ADGroupMember G_anwendung1 -Members $allusers
		Write-Host "User wurden hinzugefügt..."
		}
}
 
#########################################################################
# Nicht mehr verwendete User löschen		   			#
#########################################################################
function Remove ()
{
	Write-Host "User werden entfernt..."
 
	if ($bestand.Count -ne $null)
		{
		$Remove = @( Compare-Object $allusers $bestand -PassThru | where {$_.SideIndicator -eq "=>"})
			if ($Remove.Count -gt 0)
				{
				Remove-ADGroupMember G_anwendung1 -Members $Remove -Confirm:$false
				Write-Host "User wurden entfernt..."
				}
			else
				{
				Write-Host "Keine alten User"
				}
		}
	else
		{
		Write-Host "Keine alten User"
		}
}
 
#########################################################################
# Funktionen aufrufen							#
#########################################################################
 Add;
 Remove;

Related Posts

1 Comment

Leave a comment

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.

Back to Top