none
Powershell vergleich von 2 adgruppen RRS feed

  • Frage

  • Hallo,

    ich hätte eine Frage ich hab in meinem Script den vergleich von im 2 adgruppen aus dennen ich wiederum den SamAccountName vergleichen lasse mit compare-Object die namen und -includeEqual was auch super funktioniert. Da kommt dann für die User die nur in der einen Gruppe sind => das und für die nur in der anderen sind <= und für die in beiden sind == das. Jetzt hätte ich die Frage wie ich es schaffe das nur die namen der nicht gleichen mit z.B Write-Output ausgegeben werden also so das z.B das  die in der einen ad gruppe => in die Richtung mit Write-Output "User ... muss hinzugefügt werden also automatisch mit dem SamAccountName und bei den aus der anderen adgruppe <= in die Richtung der User muss entfernt werden und == soll einfach so gelassen werden bitte um Hilfe

    Danke :3

    Mfg

    Olli

    Mittwoch, 4. November 2020 13:37

Antworten

  • Auch wenn wir hier alle keine Deutsch-Lehrer sind, sollte man trotzdem ein wenig auf Rechtschreibung und Grammatik achten. Das macht die Fragen und Antworten dann auch leichter verständlich.

    Ich vermute, Du hast das Konzept des Forums vielleicht ein wenig missverstanden. Wir liefern hier keinen gebrauchsfertigen Code auf Anfrage. Mein Beispiel ist genau das - ein Beispiel. Das kannst Du benutzen, um den Code für Deine Zwecke entsprechend anzupassen. Du darfst auch gern mal Deine Lieblingssuchmaschine benutzen, um Dir ein paar Informationen selbst zu suchen. Und Du solltest unbedingt die Hilfe für die cmdlets lesen, die Du benutzen möchtest. Und zwar komplett inklusive der enthaltenen Beispiele bitte.

    Wie Du schon richtig erkannt hast, solltest Du einfach statt der Ausgabe auf der Konsole oder zusätzlich dazu, die entsprechenden Befehle zum Hinzufügen oder entfernen von Accounts zu Gruppen in den entsprechenden Anweisungsblock einfügen. Man braucht dafür im Übrigen nicht zwingend jeden einzelnen gefundenen Account in einer Schleife zu bearbeiten. Das kann man  mit Add-ADPrincipalGroupMembership für ganze User-Gruppen am Stück erledigen. Das würde dann ungeführ so aussehen:
    $ADGroupName1 = 'Name der 1. Gruppe'
    $ADGroupName2 = 'Name der 2. Gruppe'
    
    $ADGroup1Member = Get-ADGroupMember -Identity $ADGroupName1
    $ADGroup2Member = Get-ADGroupMember -Identity $ADGroupName2
    
    $AccountsMissingInGroup1 = 
        Compare-Object -ReferenceObject $ADGroup1Member -DifferenceObject $ADGroup2Member -Property sAMAccountName |
            Where-Object { $_.SideIndicator -eq '=>' }
    $AccountsMissingInGroup2 = 
        Compare-Object -ReferenceObject $ADGroup1Member -DifferenceObject $ADGroup2Member -Property sAMAccountName |
            Where-Object { $_.SideIndicator -eq '<=' }
    
    Add-ADPrincipalGroupMembership -Identity $ADGroupName1 -MemberOf $AccountsMissingInGroup1
    Add-ADPrincipalGroupMembership -Identity $ADGroupName2 -MemberOf $AccountsMissingInGroup2
    Und ich möchte es nochmal erwähnen: Ich würde mir eher nochmal die Gruppen-Struktur ansehen. Anstatt einen Haufen von redundanten Gruppen mit den gleichen Mitgliedern zu pflegen, solltest Du Dir über eine entsprechende (eventuell hierarchische) Struktur Gedanken machen. Dann brauchst Du einen User-Account nur einer einzigen Gruppe hinzufügen und er ist damit gleichzeitig in so vielen Verteilern und Berechtigungsgruppen wie nötig. 

    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Montag, 9. November 2020 23:46

Alle Antworten

  • Olli, hallo und willkommen im Deutschen Microsoft Powershell Forum.

    Ergebnis-Objekte filtern kann man bei Powershell mit Where-Object. Lies Dir einfach mal die Doku durch (komplett inklusive der Beispiele bitte)! Spiel ein bissl damit und wenn Du nicht weiterkommst, postest Du uns hier Deinen Code (als Code formatiert bitte) und wir können Dir bestimmt weiterhelfen.  ;-)


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Mittwoch, 4. November 2020 15:05
  • Wow .... ich glaub ich hab jetzt einen kleinen Knoten im Gehirn ... ;-) :-D

    Als Erstes: Wenn Du Code postest oder Fehlermeldungen oder Konsolen-Output oder Beispiel-Daten, solltest Du das alles als Code formatieren, bitte. Du kannst das auch für bereits existierende Posts machen!!  ;-)  How to Use the Code Feature in a TechNet Forum Post

    Üblicherweise sind solche "Texte" als Ausgabe in Powershell eher wenig hilfreich. Wir würden Powershell eher anweisen, die nötigen Änderungen gleich durchzuführen. Dazu automatisiert man solche Aufgaben ja  ...  ;-) 

    Aber hier erstmal wie Du zu der gewünschten Ausgabe kommst:

    $ADGroupName1 = 'Name der 1. Gruppe'
    $ADGroupName2 = 'Name der 2. Gruppe'
    
    $ADGroup1 = Get-ADGroupMember -Identity $ADGroupName1
    $ADGroup2 = Get-ADGroupMember -Identity $ADGroupName2
    
    Compare-Object -ReferenceObject $ADGroup1 -DifferenceObject $ADGroup2 -Property sAMAccountName |
    ForEach-Object {
        if ($_.SideINdicator -eq '=>') {
            "Der ADGruppe '$($ADGroupName1) 'muss der Account '$($_.sAMAccountName)' hinzugefügt werden"
        }
        else {
            "Der ADGruppe '$($ADGroupName2) 'muss der Account '$($_.sAMAccountName)' hinzugefügt werden"
        }
    }



    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''


    • Bearbeitet BOfH-666 Freitag, 6. November 2020 09:36
    Freitag, 6. November 2020 09:35
  • Vielen Dank. DU meintest ja du würdest Powershell eher anweisen, die Nötige Änderung gleich durchzuführen wie würde das funktionieren?
    Freitag, 6. November 2020 10:43
  • Und mir ist grade noch eingefallen manchmal müssen 2 adgruppen zusammen gefasst werden und mit einer verglichen werden also der gleiche Code wie oben nur das halt 2 adgruppen mit einer verglichen werden wie würde das gehen? Übrigens Vielen Dank das du dir die Mühe gemacht hast mir so weiter zu helfen. Dankeschön :3
    Freitag, 6. November 2020 11:58
  • Vielen Dank. DU meintest ja du würdest Powershell eher anweisen, die Nötige Änderung gleich durchzuführen wie würde das funktionieren?

    Fast hätte ich gesagt: Einmal darfst Du raten. ;-) 

    Du hast im Moment Code, der 2 AD-Gruppen miteinander vergleicht und im Ergebnis wird ausgegeben welcher Account zu welcher Gruppe hinzugefügt werden soll. Und Du möchtest jetzt die Accounts zu den entsprechenden Gruppen hinzufügen. Welchen Teil des Codes müsste man wohl verändern, um statt einer Text-Ausgabe (oder zusätzlich zur Text-Ausgabe ... ) eine entsprechende Aktion zu starten?  ;-) ;-)

    manchmal müssen 2 adgruppen zusammen gefasst werden und mit einer verglichen werden

    ... und am Ende haben alle Gruppen die gleichen Mitglieder? Ist das die Intention? Das wären dann aber viele redundante Gruppen. Wenn sowas häufiger vorkommt, würde ich mir über die Struktur der AD-Gruppen Gedanken machen. Man Gruppenmitgliedschaften auch verschachteln. Erstelle einfach eine neue Gruppe, der Du die anderen Gruppen hinzufügst. 


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Freitag, 6. November 2020 13:15
  • Also auf das erste müsste man doch reintheoretisch nur den Inhalt der if Anweisung ändern oder ?

    Bei der 2 ten Frage ich habe da z.B mehre ad Gruppen das eine sind verteilerlisten und das andere adgruppen aber die verteilerlisten sind ja auch adgruppen ,deswegen müsste ich da wissen wer in der verteilerliste drin ist und wer in der adgruppe damit ich die Leute zu der AdGruppe hinzufügen kann die nicht in der Verteilerlisten adgruppe sind oder die nicht in der Verteilerlisten adgruppe sind löschen. Manchmal passen aber auch 2 adgruppen zu dieser verteilerliste deswegen müssten manchmal auch 2 adgruppen mit der anderen verteileradgruppe  verglichen werden und dann sollten sie halt hinzugefügt oder gelöscht werden, aber weil ich dann noch nicht weiß zu welcher dachte ich mir da soll als erstes stehen wer hinzugefügt oder gelöscht werden soll. Alle adgruppen und verterilister haben halt unterschiedliche Mitglieder weil die Adgruppen ja für Unterschiedliche Sachen sind. Hoffe du konntest es einigermaßen verstehen. :-)

    Freitag, 6. November 2020 15:50
  • Hallo ich bins nochmal und zwar hat das mit  proberty nicht bei dem Compare und äh ich wollte das so das das im Endeffekt nur für eine Ad Gruppe ausgegeben wird also z.B so das 1 Distribution List die aber eine Adgruppe ist mit z.B 2 Ad gruppen verglichen wird oder eine Distribution List mit einer Gruppe und das wird dann nur in der Distribution List Adgruppe hinzugefügt oder gelöscht also nichts mit der anderen => so soll hinzugefügt werden so <= entfernt werden und bei == einfach nichts.
    Montag, 9. November 2020 21:45
  • Auch wenn wir hier alle keine Deutsch-Lehrer sind, sollte man trotzdem ein wenig auf Rechtschreibung und Grammatik achten. Das macht die Fragen und Antworten dann auch leichter verständlich.

    Ich vermute, Du hast das Konzept des Forums vielleicht ein wenig missverstanden. Wir liefern hier keinen gebrauchsfertigen Code auf Anfrage. Mein Beispiel ist genau das - ein Beispiel. Das kannst Du benutzen, um den Code für Deine Zwecke entsprechend anzupassen. Du darfst auch gern mal Deine Lieblingssuchmaschine benutzen, um Dir ein paar Informationen selbst zu suchen. Und Du solltest unbedingt die Hilfe für die cmdlets lesen, die Du benutzen möchtest. Und zwar komplett inklusive der enthaltenen Beispiele bitte.

    Wie Du schon richtig erkannt hast, solltest Du einfach statt der Ausgabe auf der Konsole oder zusätzlich dazu, die entsprechenden Befehle zum Hinzufügen oder entfernen von Accounts zu Gruppen in den entsprechenden Anweisungsblock einfügen. Man braucht dafür im Übrigen nicht zwingend jeden einzelnen gefundenen Account in einer Schleife zu bearbeiten. Das kann man  mit Add-ADPrincipalGroupMembership für ganze User-Gruppen am Stück erledigen. Das würde dann ungeführ so aussehen:
    $ADGroupName1 = 'Name der 1. Gruppe'
    $ADGroupName2 = 'Name der 2. Gruppe'
    
    $ADGroup1Member = Get-ADGroupMember -Identity $ADGroupName1
    $ADGroup2Member = Get-ADGroupMember -Identity $ADGroupName2
    
    $AccountsMissingInGroup1 = 
        Compare-Object -ReferenceObject $ADGroup1Member -DifferenceObject $ADGroup2Member -Property sAMAccountName |
            Where-Object { $_.SideIndicator -eq '=>' }
    $AccountsMissingInGroup2 = 
        Compare-Object -ReferenceObject $ADGroup1Member -DifferenceObject $ADGroup2Member -Property sAMAccountName |
            Where-Object { $_.SideIndicator -eq '<=' }
    
    Add-ADPrincipalGroupMembership -Identity $ADGroupName1 -MemberOf $AccountsMissingInGroup1
    Add-ADPrincipalGroupMembership -Identity $ADGroupName2 -MemberOf $AccountsMissingInGroup2
    Und ich möchte es nochmal erwähnen: Ich würde mir eher nochmal die Gruppen-Struktur ansehen. Anstatt einen Haufen von redundanten Gruppen mit den gleichen Mitgliedern zu pflegen, solltest Du Dir über eine entsprechende (eventuell hierarchische) Struktur Gedanken machen. Dann brauchst Du einen User-Account nur einer einzigen Gruppe hinzufügen und er ist damit gleichzeitig in so vielen Verteilern und Berechtigungsgruppen wie nötig. 

    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Montag, 9. November 2020 23:46