none
Stapelverarbeitung mit Powershell RRS feed

  • Frage

  • Dieses Thema ist für mich absolut neu und ich hoffe auf eine kleine Starthilfe:

    Über die Powershell möchte ich bei Office 365 / Exchange Online Adresslisten hinzufügen. Folgenden Befehl verwende ich dafür:

    New-AddressList -Name "AL_Abteilungsname_Users" -RecipientFilter {((RecipientType -eq 'UserMailbox') -or (RecipientType -eq "MailUniversalDistributionGroup") -or (RecipientType -eq "DynamicDistributionGroup")) -and (CustomAttribute15 -eq "Abteilungsname")}

    Ich habe nun eine Liste mit 100 Abteilungsnamen in einer CSV-Datei. Diese möchte ich im Stapelverfahren abarbeiten und in dem oben genannten Befehl "Abteilungsname" ersetzen durch die 100 Werte aus der CSV-Datei. 

    Dass man hierfür die ForEach-Schleife nimmt, habe ich schon nachgelesen, jedoch schaffe ich es nicht, die einzelnen Werte zu nutzen. 

    Kann mir jemand da einen Tipp geben? Danke im Voraus

    Mittwoch, 10. Februar 2016 09:34

Antworten

  • Hi,

    get-Mailbox liefert nicht das Attribut Department zurück. Alle Attribute siehst du mit get-Mailbox -identity <Benutzer> | fl

    Man muss hier einen Umweg gehen:

    http://smtp25.blogspot.de/2009/07/powergui-get-mailbox.html

    Würde dann irgendwie so aussehen, wenn es mit O365 so geht:

    Get-Mailbox -resultsize unlimited | select @{Name="User Name";expression={$_.displayname}},@{Name="Department";expression={(get-msoluser $_.alias).department}}}

    Gruß

    Christian


    Christian Groebner MVP Forefront

    • Als Antwort markiert FlorianLG Donnerstag, 11. Februar 2016 16:12
    Donnerstag, 11. Februar 2016 13:35

Alle Antworten

  • Hi,

    den Inhalt der CSV-Datei kannst du mit $lists = Get-Content -Path <Dateiname> auslesen und dann mit

    foreach ($list in $lists)

    {

    New-AddressList -Name "$list" -RecipientFilter {((RecipientType -eq 'UserMailbox') -or (RecipientType -eq "MailUniversalDistributionGroup") -or (RecipientType -eq "DynamicDistributionGroup")) -and (CustomAttribute15  -eq "$list")}

    }

    darüber loopen, das sollte so funktionieren.

    Gruß

    Christian


    Christian Groebner MVP Forefront

    Mittwoch, 10. Februar 2016 09:44
  • Hallo Christian,

    vielen Dank für Deine schnelle Hilfe. Wie funktioniert es dann, wenn ich z.B. einen Wert habe "Hamburg", aber die Adressliste "AL_Hamburg" heißen soll? Ist es dann New-AddressList -Name "AL"+"$list" ?

    Mittwoch, 10. Februar 2016 09:51
  • Hi,

    ich würde das dann in einer Variablen zwischenspeichern ala:

    foreach ($list in $lists)
    {
    
    $foo = $list +"_Users"
    
    New-AddressList -Name "$foo" -RecipientFilter {((RecipientType -eq 'UserMailbox') -or (RecipientType -eq "MailUniversalDistributionGroup") -or (RecipientType -eq "DynamicDistributionGroup")) -and (CustomAttribute15  -eq "$list")}
    
    }
    
    

    Alternativ kannst du der Zusammenführung auch direkt machen.

    Gruß

    Christian


    Christian Groebner MVP Forefront

    Mittwoch, 10. Februar 2016 09:56
  • Hallo,

    ich würde die CSV erstmal importieren und dann prüfen, ob das CustomAttribute15 in der Liste Abteilungsnamen ist. Ich hoffe ich habe deine Frage richtig verstanden.

    $Abteilungsnamen = Write-host -NoNewline -Separator ","(get-content C:\Data.csv|convertfrom-csv|convertfrom-csv -header "Abteilungsname").Abteilungsname

    New-AddressList -Name "AL_Abteilungsname_Users" -RecipientFilter {((RecipientType -eq 'UserMailbox') -or (RecipientType -eq "MailUniversalDistributionGroup") -or (RecipientType -eq "DynamicDistributionGroup")) -and ($Abteilungsnamen -contains CustomAttribute15)}

    Ich hoffe ich konnte dir helfen.

    MfG

    Jan-Henrik

    Mittwoch, 10. Februar 2016 10:47
  • Hallo Jan-Henrik,

    ich muss mal definieren, was ich mit Abteilungen meinte. 

    Es geht um 100 Feuerwehren, die ich in einer CSV-Datei mit ";" als Trennzeichen habe. Die Lösung von Christian war nahezu perfekt. Es gibt nur ein Problem dabei: Das Trennzeichen wird mit in die Variable geschrieben. 

    Ich habe das hier durchgeführt:

    $feuerwehren = Get-Content -Path c:\Office365\Test.csv –Delimiter ';'

    C:\WINDOWS\system32> foreach ($list in $feuerwehren)
    {

    $AL = "AL_"+$list+"_Mitglieder"
    $DisName = "FF "+$list+" Mitglieder"

    New-AddressList -Name "$AL" -Displayname "$DisName" -RecipientFilter {((RecipientType -eq 'UserMailbox') -or (RecipientType
    q "MailUniversalDistributionGroup") -or (RecipientType -eq "DynamicDistributionGroup")) -and (CustomAttribute15  -eq "$list

    }

    Ausgabe:

    Name                      DisplayName               RecipientFilter
    ----                      -----------               ---------------
    AL_Hamburg;_Mitglieder    FF Hamburg; Mitglieder    ((((((RecipientType -eq 'UserMailbox') -or (RecipientType -eq 'MailUni...

    Wie kann ich das Trennzeichen noch loswerden?

    Mittwoch, 10. Februar 2016 15:16
  • Hi,

    wie schaut denn deine CSV aus?

    Gruß

    Christian


    Christian Groebner MVP Forefront

    Mittwoch, 10. Februar 2016 15:37
  • Die CSV sieht so aus: 

    Hamburg;München;Bad Bevensen;Paris

    Mittwoch, 10. Februar 2016 15:46
  • Hi,

    wenn die Orte alle hintereinander durch ; separiert sind, dann geht das mit Import-CSV nicht.

    $Liste = Get-Content -Path C:\temp\Liste.txt
    
    $Orte = $Liste.Split(";")
    
    foreach ($Ort in $Orte)
    {
    
        .. do the magic here :-)
    
    }

    Gruß

    Christian


    Christian Groebner MVP Forefront

    Mittwoch, 10. Februar 2016 16:02
  • Mal zum Verständnis, womit würde das bei CSV-Dateien denn gehen? Ich habe es auch mit Trennzeichen "," probiert - mit dem gleichen Ergebnis.
    Mittwoch, 10. Februar 2016 16:22
  • Hi,

    eine CSV-DAtei sieht so aus:

    München, Dorfweg 3, 80333
    Hamburg, Wasserweg 1, 12345
    Nürnberg, Platz 1, 90000

    Hier wäre dann das Trennzeichen das Komma und in den einzelnen Spalten würden Werte zu diesem Datensatz stehen.

    In deiner Datei ist das Format anders, hier stehen die Werte hintereinander und nicht pro Zeile ein Datensatz.

    Gruß

    Christian


    Christian Groebner MVP Forefront

    Mittwoch, 10. Februar 2016 16:27
  • Ich danke soweit für die super Antworten! 


    Mittwoch, 10. Februar 2016 17:17
  • Christian besteht die Möglichkeit, dass du auf mein Konstrukt einmal drüber schaust? Bin mir da noch nicht 100%ig sicher, weil es doch sehr komplex ist und ich keine Erfahrung damit habe.

    Da dort bereits die Daten eingearbeitet sind, wäre es privat am Besten...

    Donnerstag, 11. Februar 2016 08:27
  • Hi,

    klar, wo befürchtest du eventuelle Probleme?

    Gruß

    Christian


    Christian Groebner MVP Forefront

    Donnerstag, 11. Februar 2016 09:30
  • Da sind ein paar Bestandteile mit drin, die nicht für die Öffentlichkeit sind. 

    Ich habe auf einem Test-Tenant die Befehle mal durchlaufen lassen, aber es hakt noch etwas.

    Ich wollte die ABP zuordnen. Allerdings kann ich die Abteilung nicht filtern. 

    Get-Mailbox -resultsize unlimited | where {$_.Department -eq "$Ortswehr"} | Set-Mailbox -AddressBookPolicy "$ABPName" 

    $Ortswehr stammt aus der ForEach-Schleife

    Ich habe gerade auch bemerkt, dass die Adresslisten leer sind. Also auch da funktioniert die Zuordnung bzw der Filter nicht. 


    • Bearbeitet FlorianLG Donnerstag, 11. Februar 2016 09:43
    Donnerstag, 11. Februar 2016 09:36
  • Hi,

    mangels Account kann ich hier leider nicht viel testen, was für eine Fehlermeldung erhältst du?

    Gruß

    Christian


    Christian Groebner MVP Forefront

    Donnerstag, 11. Februar 2016 09:45
  • Die Schleife läuft ohne Fehler durch. Die ABP ist aber nicht zugewiesen und es ist kein Benutzer in der Adressliste. 


    Donnerstag, 11. Februar 2016 09:51
  • Hat denn $ABPName einen Wert?

    Lass den mal vorher in der Schleife ausgeben.


    Christian Groebner MVP Forefront

    Donnerstag, 11. Februar 2016 10:08
  • Ja, der Wert ist ABP_Celle 

    Celle ist der letzte Ortsname in der Liste. 

    Die Adressbuchrichtlinie ABP_Celle existiert auch. 

    Ich habe zwei Benutzer angemeldet zu der Stadt Magdeburg. Als Abteilung eingetragen Magdeburg.

    Die beiden Benutzer können auch die Adresslisten Magdeburg_Mitglieder, Magdeburg_Ressourcen, Kontakte sehen, aber diese Listen sind leer. 

    Die Adressbuchrichtlinie ist nicht zugeordnet worden, auch nach dem erneuten Ausführen des Befehls nicht. Ich konnte sie aber in der Liste im ECP auswählen. 




    • Bearbeitet FlorianLG Donnerstag, 11. Februar 2016 10:31
    Donnerstag, 11. Februar 2016 10:17
  • Hi,

    hast du mal folgendes probiert, vielleicht klappt das mit dem Pipen nicht:

    $users = Get-Mailbox -resultsize unlimited | where {$_.Department -eq "$Ortswehr"}
    
    foreach ($user in $users)
    {
      Set-Mailbox -identity $user -AddressBookPolicy "$ABPName" 
    }

    Gruß

    Christian


    Christian Groebner MVP Forefront

    Donnerstag, 11. Februar 2016 11:41
  • Die erste Variante mit Department hat nicht funktioniert. Komischerweise funktioniert es mit CustomAttribute15. Bei "Marko Magdeburg" aus Magdeburg habe ich das CustomAttribute15 auf "Magdeburg gesetzt". 

    Dann funktioniert es... ?

    $AlleFeuerwehren = Get-Content -Path C:\Office365\Test.txt

    $Ortswehren = $AlleFeuerwehren.Split(";")

    foreach ($Ortswehr in $Ortswehren)
    {
    $ALBenutzerName = "AL_"+$Ortswehr+"_Benutzer"
    $ALBenutzerDis = "FF "+$Ortswehr
    $ALRäume = "AL_"+$Ortswehr+"_Räume"
    $ALRäumeDis = "FF "+$Ortswehr+" Räume"
    $ALRessourcen = "AL_"+$Ortswehr+"_Ressourcen"
    $ALRessourcenDis = "FF "+$Ortswehr+" Ressourcen"
    $GALName = "GAL_"+$Ortswehr
    $OABName = "OAB_"+$Ortswehr
    $ABPName = "ABP_"+$Ortswehr
    $GALPfad = "\"+$GALName
    $OABPfad = "\"+$OABName
    $ALRäumePfad = "\"+$ALRessourcen

    $users = Get-Mailbox -resultsize unlimited | where {$_.CustomAttribute15 -eq "$Ortswehr"}
    Write-Host "Ortswehr: "$Ortswehr"   ABPName: "$ABPName

    foreach ($user in $users)
    {
    Write-Host $user
      Set-Mailbox -identity "$user" -AddressBookPolicy "$ABPName" 
    }
    }

    Ausgabe:

    Ortswehr:  Regensburg   ABPName: ABP_Regensburg
    Ortswehr:  Augsburg   ABPName: ABP_Augsburg
    Ortswehr:  Magdeburg   ABPName: ABP_Magdeburg
    Marko Magdeburg
    Ortswehr:  Rotenburg Wümme   ABPName: ABP_Rotenburg Wümme
    Ortswehr:  Celle   ABPName: ABP_Celle




    • Bearbeitet FlorianLG Donnerstag, 11. Februar 2016 13:01
    Donnerstag, 11. Februar 2016 12:40
  • Hi,

    ah ok, da war ich zu schnell :-)

    foreach ($user in $users)
     {
     Write-Host $user.Identity
       Set-Mailbox -identity $user.Identity -AddressBookPolicy "$ABPName" 
    }
     

    Es muss natürlich $user.Identity heissen.

    Gruß

    Christian



    Christian Groebner MVP Forefront


    Donnerstag, 11. Februar 2016 13:00
  • Bleibt nur die Frage wieso CustomAttribute15 gefiltert werden kann aber Department nicht...
    Donnerstag, 11. Februar 2016 13:26
  • Hi,

    get-Mailbox liefert nicht das Attribut Department zurück. Alle Attribute siehst du mit get-Mailbox -identity <Benutzer> | fl

    Man muss hier einen Umweg gehen:

    http://smtp25.blogspot.de/2009/07/powergui-get-mailbox.html

    Würde dann irgendwie so aussehen, wenn es mit O365 so geht:

    Get-Mailbox -resultsize unlimited | select @{Name="User Name";expression={$_.displayname}},@{Name="Department";expression={(get-msoluser $_.alias).department}}}

    Gruß

    Christian


    Christian Groebner MVP Forefront

    • Als Antwort markiert FlorianLG Donnerstag, 11. Februar 2016 16:12
    Donnerstag, 11. Februar 2016 13:35
  • Für die Nachwelt meine Lösung (etwas abgeändert mit Get-User -Filter)

    $AlleFeuerwehren = Get-Content -Path C:\Office365\Test.txt

    $Ortswehren = $AlleFeuerwehren.Split(";")

    foreach ($Ortswehr in $Ortswehren)
    {
    $ALBenutzerName = "AL_"+$Ortswehr+"_Benutzer"
    $ALBenutzerDis = "FF "+$Ortswehr
    $ALRäume = "AL_"+$Ortswehr+"_Räume"
    $ALRäumeDis = "FF "+$Ortswehr+" Räume"
    $ALRessourcen = "AL_"+$Ortswehr+"_Ressourcen"
    $ALRessourcenDis = "FF "+$Ortswehr+" Ressourcen"
    $GALName = "GAL_"+$Ortswehr
    $OABName = "OAB_"+$Ortswehr
    $ABPName = "ABP_"+$Ortswehr
    $GALPfad = "\"+$GALName
    $OABPfad = "\"+$OABName
    $ALRäumePfad = "\"+$ALRessourcen

    $users = Get-User -Filter "Department -eq '$Ortswehr'"
    Write-Host "Ortswehr: "$Ortswehr"   ABPName: "$ABPName

    foreach ($user in $users)
    {
    Write-Host $user
      Set-Mailbox -identity "$user" -AddressBookPolicy "$ABPName" 
    }
    }

    Danke Christian für die super Unterstützung!!!

    Donnerstag, 11. Februar 2016 14:07
  • Hi,

    gerne, freut mich, dass es jetzt läuft :-)

    Gruß

    Christian


    Christian Groebner MVP Forefront

    Donnerstag, 11. Februar 2016 14:25