Jump to content

Powershell AD User von Gruppe A nach Gruppe B kopieren


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo zusammen,

 

ich habe ein Powershell Script geschrieben, welches die Mitglieder aus Gruppe A in Gruppe B verschiebt und anschließend die Mitglieder aus Gruppe A löscht.

Das Script läuft ganz zufriedenstellend durch, jedoch erhalte ich bei der Ausgabe eine Benachrichtigung wenn ein User schon Mitglied der Gruppe war bzw. ist.

 

Ich hätte es ganz gerne so das geprüft wird ob der User Mitglied ist oder nicht und das dann dementsprechend der User kopiert oder übersprungen wird.

Eine andere Möglichkeit wäre die Fehlermeldung bzw. Benachrichtigung zu deaktivieren aber -EA SilentlyContinue hats nicht gebracht.

 

Ich bin ein absoluter PS neuling. Ich hab mich schon ein bischen an einer IF Abfrage probiert aber leider bin ich erfolglos geblieben.

 

Hier ist der Code Ausschnitt:

 

Get-ADGroupMember $GroupName1 | Select sAMAccountName  | ForEach-Object  { Add-ADGroupMember $GroupName2 -Members $_.sAMAccountName }

Für eure Unterstützung bin ich euch wie immer sehr dankbar.

 

MfG

 

Bernardo

Link zu diesem Kommentar

Hallo,

 

If-Abfragen können bei großen Aktionen mit großen Gruppen recht zeitintensiv werden. (leicht Stunden oder Tage)

 

Ich vermeide die daher möglichst:

 

 

$MembersA = @(Get-ADGroupMember $GroupNameA) | Foreach{$_.SamAccountName}
$MembersB = @(Get-ADGroupMember $GroupNameB) | Foreach{$_.SamAccountName}
$Members2Add = $MembersA | Where {$MembersB -NotContains $_}
Add-ADGroupMember $GroupNameB -Members $Members2Add

 

 

Ich vergleiche zuerst die beiden Arrays mit den Gruppenmitgliedern und füge nur die Differenzobjekte der Zielgruppe  hinzu. Compare-Object wäre dafür auch geeignet gewesen

 

blub



		
			

			
		
Link zu diesem Kommentar

Hallo,

 

das @-Zeichen zwingt (castet)  das Ergebnis von Get-ADGroupMember in ein Array. Ohne das @-Zeichen kann es bei einem Ergebnis von nur einem Rückgabewert  zu Problemen kommen, weil dann kein Array angelegt wird. Sinnvollerweise sollte das Casten @(...) auf den gesamten Ausdruck angewendet werden, daher nochmal ein leicht verbsserter Code mit veränderter Klammersetzung @(   )

 

$MembersA = @( Get-ADGroupMember $GroupNameA | Foreach{$_.SamAccountName} )
$MembersB = @( Get-ADGroupMember $GroupNameB | Foreach{$_.SamAccountName} )

$Members2Add = $MembersA | Where {$MembersB -NotContains $_}
If($Members2Add){
  Add-ADGroupMember $GroupNameB -Members $Members2Add
  }

 

Die zusätzliche If-Abfrage am Ende verhindert eine Fehlermeldung, falls $Members2Add leer ist, weil MembersA und MembersB gleich sind.

 

blub

Link zu diesem Kommentar

Also grundsätzlich benötigst du das @ nicht.

$arr = @()

definiert ein Objekt vom Typ Array.

$arr.getType()

IsPublic IsSerial Name     BaseType                                                                                       
-------- -------- ----     --------                                                                                                     
True     True     Object[] System.Array                                                                                                 

 

In dem Fall ist das aber eh die Standarddefinition, von daher geht auch Problemlos:

$MembersA = (Get-ADGroupMember $GroupNameA) | Foreach{$_.SamAccountName}
$MembersB = (Get-ADGroupMember $GroupNameB) | Foreach{$_.SamAccountName}
$Members2Add = $MembersA | Where {$MembersB -NotContains $_}
Add-ADGroupMember $GroupNameB -Members $Members2Add

HIer Infos zum Typ Array: http://ss64.com/ps/syntax-arrays.html

 

Ich möchte aber noch eine andere Möglichkeit vorstellen, die meiner Meinung nach eleganter ist.

Um das Delta aus den 2 Gruppen zu definieren würde ich folgendes machen:

(Compare-Object -ReferenceObject (Get-ADGroupMember $GroupNameA) -DifferenceObject (Get-ADGroupMember $GroupNameB) | ? {$_.SideIndicator -eq "=>"}).InputObject

http://technet.microsoft.com/de-de/library/ee156812.aspx

Mit compare-object kannst du diese 2 Gruppen vergleichen und dir exakt ausgeben lassen, welche User in welcher Gruppe sind und welche nicht.

Diese verarbeitest du dann einfach weiter:

Add-ADGroupMember $GroupNameB -Members (Compare-Object -ReferenceObject (Get-ADGroupMember $GroupNameA) -DifferenceObject (Get-ADGroupMember $GroupNameB) | ? {$_.SideIndicator -eq "=>"})

Ist eigentlich ein Einzeiler, ich steh auf Einzeiler ;)

 

Falls du was nicht verstehst, einfach Fragen ;)

Link zu diesem Kommentar

Hi,

 

super vielen Dank für eure Antworten:-)

 

Jetzt würde mich noch interessieren was der Teil am Ende deines Einzeilers bedeutet:

? {$_.SideIndicator -eq "=>"}

 

Um am Ende auch nur die aktiven User zu kopieren, würde ich dann noch folgende Ergänzung eibnbauen, richtig?

 

{ $_.Enabled -eq 'True' }

Also dann so:

 

$MembersA = (Get-ADGroupMember $GroupNameA) | Foreach{$_.SamAccountName}
$MembersB = (Get-ADGroupMember $GroupNameB) | Foreach{$_.SamAccountName}
$Members2Add = $MembersA | Where {$MembersB -NotContains $_}
Add-ADGroupMember $GroupNameB -Members $Members2Add | Where { $_.Enabled -eq 'True' }

Wäre dies korrekt?

 

 

Bzw. so?

 

 

 

$Members2Add = $MembersA | Where {$MembersB -NotContains $_.sAMAccountName -and $_.Enabled -eq 'True'}
bearbeitet von bernardo
Link zu diesem Kommentar

OK Danke das werde ich mal testen.

 

Ich habe um nur die aktiven AD User einer Gruppe zu erhalten folgendes geändert:

$MembersA = Get-ADGroupMember $GroupNameA | Get-ADUser | Where-Object { $_.Enabled -eq 'True' } | ForEach-Object {$_.sAMAccountName}

Das funktioniert auch.

 

OK veieln Dank für eure reichhaltige Unterstützung.

 

MfG

 

Bernardo

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...