none
Exchange 2010: Powershell -> Alle Verteilergruppen anzeigen RRS feed

  • Frage

  • Hi Community,

    für die Wartung der Verteilergruppen habe ich ein Powershell-Kommando gesucht, welches mir die nötigen Informationen liefert:

    foreach ($group in Get-DistributionGroup) { get-distributiongroupmember $group | ft @{expression={$_.displayname};Label="$group"}}

    Das funktioniert soweit ganz ordentlich, jedoch werden mir Verteilergruppen ohne Mitglieder erst gar nicht angezeigt und davon hats auch einige. Kann man das og Kommando soweit modifizieren, dass auch "leere" Verteilergruppen angezeigt werden?

    BTW: Was passiert eigentlich mit einem Mitglied einer Verteilergruppe, wenn der User gelöscht wird? Kommen so die leeren Verteilergruppen zustande?

    Thx & Bye Tom

    Donnerstag, 11. Februar 2016 14:04

Antworten

  • Hi,

    Bei Löschung eines Benutzers fliegt dieser aus der Gruppe raus.

    Hier ein Beispiel das nur leere Gruppen aufzeigt. Möchtest du beides in einem, müsste da vermutlich schon ein Script mit if/else im foreach Loop sowie Error Handling geschrieben werden.

    $DistributionGroups = Get-DistributionGroup -Resultsize Unlimited
    $DistributionGroups |? {!(Get-DistributionGroupMember $_)} | Select-Object Name


    Georg

    Freitag, 12. Februar 2016 08:00
  • > In der Variablen $_ ist dann jeweils ein (einzelnes?) Objekt aus der Variablen $DistributionGroups.

    Korrekt.

    > Die Bedingung 'where -not' ist wahr, wenn das Kommando Get-DistributionGroupMember nichts ausgibt.

    Als Ergebnis hast Du das richtig verstanden. Inhaltlich funktioniert es aber etwas anders.

    "where" ist ein Alias für "where-object", genauso wie das Fragezeichen im ersten Beispiel. Aliase sollte man in der Lernphase am besten noch nicht verwenden, den eine Stärke der PS sind auch die sprechenden Befehle.

    -not dagegen ist ein Operator. Wichtig ist, dass er in geschweiften Klammern steht (das weglassen geht erst mit PS 3.0, also ab Ex 2013). Die { } sind ein sog. "Code-Block", d.h. was in ihnen steht, wird in jeder Iteration durchlaufen und ausgeführt.

    > Wie kommt es aber dazu, dass das in einer Schleife abläuft? Das Kommando hat keinen Schleifenoperator?

    Die Schleife baute die PowerShell alleine, weil der Input $DistributionGroups mit Hilfe des senkrechten Strichs übergeben wird. Das nennt sich "Pipeline".

    Wenn mir eine ganz einfache Schleife reicht, egal ob es 0, 1 oder n Inputobjekte gibt, dann reicht die Pipeline hierfür aus und ich muss eben keine Schleife extra dafür bauen. Wenn ich will kann ich aber trotzdem Schleifen mit "for", "foreach" oder "foreach-object" bauen.

    In dem Beispiel hast Du technisch sogar zwei Schleifen:

    $DistributionGroups | where = geht alle Elemente einmal durch und "filtert" auf die Where-Bedingung.
    | Select-Object Name = erzeugt von jedem Where-Ergebnis ein neues Objekt, dass nur noch die Eigenschaft "Name" enthält.

    Übrigens befindet sich in dem Beispiel noch eine schicke Sache der PowerShell (schick in Hinblick auf die Umsetzung)

    -not(Get-DistributionGroupMember $_)

    Die runden Klammern sind in diesem Fall eine Vorangsteuerung, d.h. sie sorgen dafür, dass diese Befehl zuerst ausgeführt wird und das Ergebnis hier eingesetzt wird. In der Vorrangsteuerung kann alles eingesetzt werden, was die PowerShell kann (nur neue Pipelines funktioniere nur begrenzt oder gar nicht).

    Das Beispiel zeigt, wie genial einfach die PowerShell für den Admin sein kann.

    In Hinblick auf Fehlertoleranz und Performance könnte man das optimieren, aber für einen Admin ist das "quick & dirty": Es funktioniert grundlegend korrekt, egal, wie große die Umgebung ist und ob die Ausführung 30 Sekunden oder 1 Minute dauert, ist egal. Aber die Erstellung des Einzeilers hat für einen Erfahrenen Admin weniger als 5 Minuten gedauert.

    Gruesse aus Berlin schickt Robert - MVP Office Servers and Services (Exchange Server)

    Freitag, 12. Februar 2016 12:17

Alle Antworten

  • Hi,

    Bei Löschung eines Benutzers fliegt dieser aus der Gruppe raus.

    Hier ein Beispiel das nur leere Gruppen aufzeigt. Möchtest du beides in einem, müsste da vermutlich schon ein Script mit if/else im foreach Loop sowie Error Handling geschrieben werden.

    $DistributionGroups = Get-DistributionGroup -Resultsize Unlimited
    $DistributionGroups |? {!(Get-DistributionGroupMember $_)} | Select-Object Name


    Georg

    Freitag, 12. Februar 2016 08:00
  • Servus Georg,

    $DistributionGroups = Get-DistributionGroup -Resultsize Unlimited
    $DistributionGroups |? {!(Get-DistributionGroupMember $_)} | Select-Object Name

    Die beiden Zeilen hab ich gestern auch noch gefunden. Danke hierfür. Mit dem intuitiven Lesen der Syntax tue ich mich aber doch recht schwer aber gut, steht jetzt so in der Doku ;-)

    Bye Tom

    Freitag, 12. Februar 2016 08:36
  • Hallo Tom

    So wäre es dann ausgeschrieben:

    $DistributionGroups | where {-not(Get-DistributionGroupMember $_)} | Select-Object Name


    Georg

    Freitag, 12. Februar 2016 09:50
  • Servus Georg,

    $DistributionGroups | where {-not(Get-DistributionGroupMember $_)} | Select-Object Name

    Okay Danke. In der Variablen $_ ist dann jeweils ein (einzelnes?) Objekt aus der Variablen $DistributionGroups. Die Bedingung 'where -not' ist wahr, wenn das Kommando Get-DistributionGroupMember nichts ausgibt.

    Wie kommt es aber dazu, dass das in einer Schleife abläuft? Das Kommando hat keinen Schleifenoperator?

    Thx & Bye Tom

    Freitag, 12. Februar 2016 10:37
  • > In der Variablen $_ ist dann jeweils ein (einzelnes?) Objekt aus der Variablen $DistributionGroups.

    Korrekt.

    > Die Bedingung 'where -not' ist wahr, wenn das Kommando Get-DistributionGroupMember nichts ausgibt.

    Als Ergebnis hast Du das richtig verstanden. Inhaltlich funktioniert es aber etwas anders.

    "where" ist ein Alias für "where-object", genauso wie das Fragezeichen im ersten Beispiel. Aliase sollte man in der Lernphase am besten noch nicht verwenden, den eine Stärke der PS sind auch die sprechenden Befehle.

    -not dagegen ist ein Operator. Wichtig ist, dass er in geschweiften Klammern steht (das weglassen geht erst mit PS 3.0, also ab Ex 2013). Die { } sind ein sog. "Code-Block", d.h. was in ihnen steht, wird in jeder Iteration durchlaufen und ausgeführt.

    > Wie kommt es aber dazu, dass das in einer Schleife abläuft? Das Kommando hat keinen Schleifenoperator?

    Die Schleife baute die PowerShell alleine, weil der Input $DistributionGroups mit Hilfe des senkrechten Strichs übergeben wird. Das nennt sich "Pipeline".

    Wenn mir eine ganz einfache Schleife reicht, egal ob es 0, 1 oder n Inputobjekte gibt, dann reicht die Pipeline hierfür aus und ich muss eben keine Schleife extra dafür bauen. Wenn ich will kann ich aber trotzdem Schleifen mit "for", "foreach" oder "foreach-object" bauen.

    In dem Beispiel hast Du technisch sogar zwei Schleifen:

    $DistributionGroups | where = geht alle Elemente einmal durch und "filtert" auf die Where-Bedingung.
    | Select-Object Name = erzeugt von jedem Where-Ergebnis ein neues Objekt, dass nur noch die Eigenschaft "Name" enthält.

    Übrigens befindet sich in dem Beispiel noch eine schicke Sache der PowerShell (schick in Hinblick auf die Umsetzung)

    -not(Get-DistributionGroupMember $_)

    Die runden Klammern sind in diesem Fall eine Vorangsteuerung, d.h. sie sorgen dafür, dass diese Befehl zuerst ausgeführt wird und das Ergebnis hier eingesetzt wird. In der Vorrangsteuerung kann alles eingesetzt werden, was die PowerShell kann (nur neue Pipelines funktioniere nur begrenzt oder gar nicht).

    Das Beispiel zeigt, wie genial einfach die PowerShell für den Admin sein kann.

    In Hinblick auf Fehlertoleranz und Performance könnte man das optimieren, aber für einen Admin ist das "quick & dirty": Es funktioniert grundlegend korrekt, egal, wie große die Umgebung ist und ob die Ausführung 30 Sekunden oder 1 Minute dauert, ist egal. Aber die Erstellung des Einzeilers hat für einen Erfahrenen Admin weniger als 5 Minuten gedauert.

    Gruesse aus Berlin schickt Robert - MVP Office Servers and Services (Exchange Server)

    Freitag, 12. Februar 2016 12:17
  • Das ist so, die Objekte werden in die Pipeline übergeben und dort sepaat abgearbeitet.
    $_ ist das übergebene Pipeline Objekt.

    http://ss64.com/ps/syntax-pipeline.html


    Georg

    Freitag, 12. Februar 2016 12:39