bernardo 10 Geschrieben 28. August 2013 Melden Teilen Geschrieben 28. August 2013 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 Zitieren Link zu diesem Kommentar
Dukel 455 Geschrieben 28. August 2013 Melden Teilen Geschrieben 28. August 2013 Wie sah denn die if Abfrage aus? Zitieren Link zu diesem Kommentar
blub 115 Geschrieben 29. August 2013 Melden Teilen Geschrieben 29. August 2013 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 Zitieren Link zu diesem Kommentar
bernardo 10 Geschrieben 29. August 2013 Autor Melden Teilen Geschrieben 29. August 2013 Hallo blub, sehr elegante Lösung. Wie schon erwähnt, bin ich ein Powershell Anfänger. Kannst du mir bitte zwei Sacher etwas erläutern? 1. das "@"-Zeichen vor der Klammer. 2. Was ist ein Array (wahrscheinlich die beiden Abfragen für MembersA und B)? Vielen Dank für deinen Support. MfG Bernardo Zitieren Link zu diesem Kommentar
Sunny61 807 Geschrieben 29. August 2013 Melden Teilen Geschrieben 29. August 2013 2. Was ist ein Array (wahrscheinlich die beiden Abfragen für MembersA und B)? Ein Array ist ein Datenfeld, evtl. hilft dir der Wikipedia Eintrag für das Verständnis: http://de.wikipedia.org/wiki/Feld_%28Datentyp%29 Zitieren Link zu diesem Kommentar
bernardo 10 Geschrieben 29. August 2013 Autor Melden Teilen Geschrieben 29. August 2013 OK und das @-Zeichen vor der Abfrage? Zitieren Link zu diesem Kommentar
blub 115 Geschrieben 29. August 2013 Melden Teilen Geschrieben 29. August 2013 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 Zitieren Link zu diesem Kommentar
mamamia 13 Geschrieben 29. August 2013 Melden Teilen Geschrieben 29. August 2013 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 ;) Zitieren Link zu diesem Kommentar
bernardo 10 Geschrieben 29. August 2013 Autor Melden Teilen Geschrieben 29. August 2013 (bearbeitet) 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 29. August 2013 von bernardo Zitieren Link zu diesem Kommentar
mamamia 13 Geschrieben 29. August 2013 Melden Teilen Geschrieben 29. August 2013 ? {$_.SideIndicator -eq "=>"} Führe das mal ohne aus. Dann siehst du bei der Ausgabe, warum ich hier nochmal filtere. Zitieren Link zu diesem Kommentar
bernardo 10 Geschrieben 29. August 2013 Autor Melden Teilen Geschrieben 29. August 2013 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 Zitieren Link zu diesem Kommentar
blub 115 Geschrieben 29. August 2013 Melden Teilen Geschrieben 29. August 2013 Hallo Bernardo, Schön, wenns geholfen hat. Ich habe mir erlaubt, deinen letzten Code in meine Website einzubauen http://powershellpraxis.de/index.php/active-directory/5-klassen-im-ad-cmdlets#5.3%20Gruppen blub Zitieren Link zu diesem Kommentar
mamamia 13 Geschrieben 30. August 2013 Melden Teilen Geschrieben 30. August 2013 :thumb1: Zitieren Link zu diesem Kommentar
bernardo 10 Geschrieben 30. August 2013 Autor Melden Teilen Geschrieben 30. August 2013 Hallo blub, gerne doch. Da fühle ich mich glatt geehrt :D Grüße Bernardo Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.