Exchange 2013 dynamische Verteiler - Anmerkungen befüllen

  • Hallo zusammen,


    bastele hier gerade, auf einem Exchange 2013, an einem Powershell-Befehl.


    Es existieren diverse dynamische Verteiler. Die Mitglieder in diesen Verteilern haben in der AD benutzerdefinierte Attribute und sind dadurch diesen Verteilern zugeordnet.
    Da diese dynamischen Verteiler zur Laufzeit erstellt werden, kann man sich im Outlook ja nicht die Mitglieder anzeigen lassen. Daher möchte ich die Namen der Mitglieder per Script ermitteln und dann in das Anmerkungs-Feld des Verteilers schreiben.


    Was habe ich bis jetzt versucht bzw. welche Befehle verwende ich:


    Mit dem Befehl: Get-DynamicDistributionGroup | Select Alias kann ich mir die Alias-Namen der Verteiler ausgeben lassen, damit ich weiß, wie diese heißen und um evtl. dies dann weiter zu verwenden


    Mit dem Befehl: $identity = Get-DynamicDistributionGroup -Identity "Alias-Name eines Verteilers" schreibe ich mit mal zuerst manuell einen Namen des Verteiler in die Variable $identity


    Mit dem Befehl: $memberNames = Get-Recipient -RecipientPreviewFilter $identity.RecipientFilter | Select Name ermittele ich mir anhand des Filters, die Namen der Mitglieder und schreibe diese dann in die Variable $memberNames


    Mit dem Befehl: Set-DynamicDistributionGroup -Identity "$identity" -Notes "$memberNames" möchte ich die ermittelten Namen in das Feld "Notes" der Verteiler-Gruppe schreiben, jedoch passiert dies nicht. Das Feld bleibt leer.


    Bei der Ausgabe der Variable $memberNames stehen die ermitteln Namen drin. Wenn für -Notes einfach eine Zeichenkette wie "Test" mit Befehl Set-DynamicDistributionGroup -Identity "$identity" -Notes "Test" übergebe, dann wird dies entsprechend ins Anmerkungs-Feld geschrieben.



    Was muss ich beachten, damit ich die Variable erfolgreich übergeben kann? Vielleicht kann mir ja ein Powershell-Guru da kurz weiterhelfen.



    Danke.


    Grüße

    • Offizieller Beitrag

    Moin,


    erste Regel in der PowerShell: Alles ist ein Objekt!


    Eine weitere Regel: Wenn Du ein Auflistung erwartest, dann sorge dafür, dass Du eine bekommst.



    Mit dem Befehl: Get-DynamicDistributionGroup | Select Alias kann ich mir die Alias-Namen der Verteiler ausgeben lassen, damit ich weiß, wie diese heißen und um evtl. dies dann weiter zu verwenden

    Das ist für Dich als Admin korrekt, Powershell-technisch nicht ganz (Regel 1). Macht aber nichts.



    Mit dem Befehl: $identity = Get-DynamicDistributionGroup -Identity "Alias-Name eines Verteilers" schreibe ich mit mal zuerst manuell einen Namen des Verteiler in die Variable $identity

    Das ist falsch. Du bekommst nicht einen Namen, sondern ein Objekt zurück. Das Objekt hat natürlich einen Namen und das kann die Standard-Ausgabe sein, muss es aber nicht.



    Mit dem Befehl: $memberNames = Get-Recipient -RecipientPreviewFilter $identity.RecipientFilter | Select Name ermittele ich mir anhand des Filters, die Namen der Mitglieder und schreibe diese dann in die Variable $memberNames

    Wieder falsch. Du ermittelst nicht die Namen, Du ermittelst Objekte, die allerdings nur eine Eigenschaft haben -> "Name". Diese sind in einem Du in ein Array. Zumindest wenn es mehr als einen Treffer gibt. Bei einem Treffer steht das Objekt selbst in $memberNames. Bei keinem Treffer ist $memberName ungültig, da NULL. Je nach Anzahl der Treffer können also drei unterschiedliche Dinge in $memberNames stehen.


    Besser ist das hier:

    Code
    $memberNames = @(Get-Recipient -RecipientPreviewFilter $identity.RecipientFilter | Select Name)



    Mit dem @() weist Du PowerShell an, immer ein Array zu erstellen. Du hast danach ein Array mit 0, 1, oder > 1 Anzahl Elementen. Das ist die Regel 2 von oben. Du willst ein Array haben, also sorge dafür, dass Du eines bekommst.




    Mit dem Befehl: Set-DynamicDistributionGroup -Identity "$identity" -Notes "$memberNames" möchte ich die ermittelten Namen in das Feld "Notes" der Verteiler-Gruppe schreiben, jedoch passiert dies nicht. Das Feld bleibt leer.


    Das ist aus Sicht der per PowerShell erstmal vollkommen korrekt. Du willst eine Array von Objekten in einem Text-Feld speichern. Wie soll das gehen?


    Außerdem funktionert das mit $identity an der Stelle nur zufällig. Wie bereits weiter oben beschrieben, ist in $identity ein Object. Es funktioniert aber, weil -identity verschiedene Typen verarbeiten kann.


    Für die Namen brauchst Du vorher eine kleine Schleife:


    $memberNames | ForEach-Object { $notes += ($_.name + ",") }


    Zusammen sieht dass dan so aus. Bitte beachte, dass ich in Zeile 4 neben der Variablen $notes auch ein Paar überflüssiger Anführungszeichen entfernt habe:



    Code
    $identity = Get-DynamicDistributionGroup -Identity "Alias-Name eines Verteilers"
    $memberNames = @(Get-Recipient -RecipientPreviewFilter $identity.RecipientFilter | Select Name)
    $notes = ""; $memberNames | ForEach-Object { $notes += ($_.name + ",") }
    Set-DynamicDistributionGroup -Identity $identity -Notes "$notes"

    Grüße aus Berlin schickt Robert