Using the Exchange Management Shell for Bulk Recipient Management

 

Letztes Änderungsdatum des Themas: 2007-03-26

Von Serdar Soysal

In Exchange Server 2007 können Sie die meisten Empfängerverwaltungsaufgaben über die Exchange-Verwaltungsshell und die Exchange-Verwaltungskonsole ausführen. Für Aufgaben, die sich auf einzelne Empfänger beziehen, ist es in der Regel einfacher, die Exchange-Verwaltungskonsole zu verwenden (es sei denn, Tippfehler sind Ihnen unbekannt). Wenn Sie jedoch mehrere Empfänger konfigurieren möchten, gibt es keine Alternative zur Leistungsfähigkeit und einfachen Verwendung der Exchange-Verwaltungsshell.

In meinem Fall bestand die Lernkurve für die Exchange-Verwaltungsshell aus drei Phasen:

  1. "Das sieht cool, aber auch ein wenig kompliziert aus".

  2. "Gerade habe ich ein Postfach erstellt, ohne die Maus zu verwenden"!

  3. "Ich werde nie wieder mit der Benutzeroberfläche arbeiten. Nie wieder! Bestimmt nicht! Und niemand wird mich umstimmen"!

Gut, die Beschreibung der dritten Phase ist ein wenig übertrieben, trifft aber de Kern der Sache. Der Artikel A Primer on the Exchange Management Shell, der im Januar 2007 veröffentlicht wurde, unterstützt Sie beim Durchlaufen der ersten beiden Phasen. Was Sie im Folgenden lesen werden, wird Sie hoffentlich in der dritten Phase unterstützen – zumindestens, was die Empfängerverwaltung betrifft.

Damit es ein wenig unterhaltsamer wird, wollen wir eine Empfängeradministratorin – Amy – dabei beobachten, wie sie die Exchange-Verwaltungsshell verwendet, um die Aufgaben zu erledigen, die ihr an einem Montag übertragen werden.

Erstellen von Postfächern

Amy muss jeden Montag als erstes Postfächer für alle Mitarbeiter erstellen, die in dieser Woche neu eingestellt wurden. Die Personalabteilung sendet jeden Montag eine CSV-Datei (Comma-Separated Value, durch Kommas getrennte Werte) an Amy, die die Namen und die Benutzernamen der neuen Angestellten enthält. Eine typische CSV-Datei von der Personalabteilung sieht folgendermaßen aus:

Name,User Name
David Hamilton,DHamilton
Ezio Alboni,EAlboni
Rajesh M. Patel,RPatel
Kevin Liu,KLiu

Beim Erstellen der neuen Postfächer muss Amy die folgenden Aufgaben erledigen:

  • Hinzufügen der UPN-Erweiterung (User Principal Name, Benutzerprizipalname) contoso.com zu jedem Benutzernamen.

  • Zuweisen von pass@word1 als Anfangskennwort.

  • Konfigurieren des Benutzers für die Änderung des Kennworts bei der ersten Anmeldung.

  • Angeben der Postfachdatenbank und der Organisationseinheit (Organizational Unit, OU), in der die neuen Postfächer gespeichert werden sollen.

Als ihr diese Aufgabenserie erstmals zugewiesen wurde, entschied sich Amy, die Exchange-Verwaltungsshell für eine schnelle Erledigung einzusetzen. Sie begann, indem Sie den Befehl New-Mailbox ausführte, der einen Testbenutzer namens Test User 1 erstellt.

New-Mailbox -Name "Test User 1" -UserPrincipalName "TUser1@contoso.com" -OrganizationalUnit "contoso.com/Users" -Database "Server01\Mailbox Database" -ResetPasswordOnNextLogon $true

Der Befehl funktionierte, sie wurde jedoch aufgefordert, das Kennwort für den neuen Benutzer einzugeben. Das Cmdlet New-Mailbox akzeptiert nur sichere Zeichenfolgen für den Parameter password, daher konnte sie nicht den Wert des Standardkennworts als unverschlüsselten Text im Befehl verwenden. Um dieses Problem zu umgehen, verwendete sie das Cmdlet ConvertTo-SecureString, um aus de Kennwort eine sichere Zeichenfolge zu erstellen und diese in der benutzerdefinierten Variablen $Temp zu speichern. Anschließend konnte sie die Variable an den Parameter password des Cmdlets New-Mailbox übergeben.

$Temp = ConvertTo-SecureString "pass@word1" -asPlainText -force
New-Mailbox -Name "Test User 1" -UserPrincipalName "TUser1@contoso.com" -OrganizationalUnit "contoso.com/Users" -Database "Server01\Mailbox Database" -Password $Temp -ResetPasswordOnNextLogon $true

Der nächste Schritt bestand darin, die Benutzerinformationen aus der CSV-Datei zu lesen und die Bereitstellung zu automatisieren. Nachdem sie sich die Beispiele zur Massenverwaltung im Blog-Artikel Exchange Server 2007 recipient management one-liners des Microsoft Exchange-Teams angesehen hatte, änderte sie ihr eigenes Skript so, dass diese Aufgabe ausgeführt werden konnte.

Hinweis

UNRESOLVED_TOKEN_VAL(exBlog)

$Temp = ConvertTo-SecureString "pass@word1" -asPlainText -Force
Import-CSV "C:\NewUsers.csv" | ForEach-Object -Process {New-Mailbox -Name $_.Name -UserPrincipalName "$($_.UserName)@contoso.com" -OrganizationalUnit "contoso.com/Users" -Database "Server01\Mailbox Database" -Password $Temp -ResetPasswordOnNextLogon $true}

Amy konnte dieses Skript einrichten, indem sie die Syntax aus dem Beispiel im Blog-Artikel kopierte. Sie verstand jedoch nicht, was die $_-Syntax bewirkte. Sie recherchierte ein wenig und fand das Thema Shellvariablen. In diesem Thema stand, dass $_ eine Variable der Exchange-Verwaltungsshell ist, die das aktuelle Pipelineobjekt enthält. Bei jeder Ausführung des Skriptblocks, der mit dem Parameter Process angegeben ist, in ihrem Skript enthält die Variable $_ die Daten aus der nächsten Zeile der CSV-Datei.

Amy war außerdem die zum Festlegen des UPNs verwendete Syntax nicht klar. Hier unterschied sich die Vorgehensweise, weil der Wert der Variablen nicht direkt einem Parameter des Cmdlets New-Mailbox zugewiesen wurde, sondern zum Ändern einer dem Parameter zugewiesenen Zeichenfolge verwendet wurde. Amy las das Thema Syntax, in dem die Befehlssyntax für die Exchange-Verwaltungsshell behandelt wird, und fand heraus, dass die $()-Syntax zum Ersetzen der Ausgabe eines Befehls als ein Argument in einem Skript verwendet wird. Wenn Sie nur eine Variable eingeben, ist in der Exchange-Verwaltungsshell die Ausgabe der Wert dieser Variablen. Wenn Sie eine Variable innerhalb eines $()-Blocks platzieren, wird dieser Block daher durch den Wert der Variablen ersetzt. In Amys Skript enthält die Variable $_.UserName den Benutzernamen. Indem sie diese Variable innerhalb einer $()-Syntax platzierte, konnte Amy den Wert der Variablen in die Zeichenfolge einfügen, die dem Parameter UserPrincipalName zugewiesen wird.

Nachdem sie sich weiter über die Befehlssyntax in der Exchange-Verwaltungsshell informiert hatte, ging Amy noch einen Schritt weiter und verschob die erste Zeile ihres Skripts in den Parameter Begin des Cmdlets ForEach-Object und wandelte diese Anweisung in ihren persönlichen Einzeiler für die Massenverwaltung von Empfängern um. Jeden Montag liest sie einfach die aktuelle CSV-Datei aus der Personalabteilung in das folgende Skript ein.

Import-CSV "C:\NewUsers.csv" | ForEach-Object -Begin {$Temp = ConvertTo-SecureString "pass@word1" -asPlainText -Force} -Process {New-Mailbox -Name $_.Name -UserPrincipalName "$($_.UserName)@contoso.com" -OrganizationalUnit "contoso.com/Users" -Database "Server01\Mailbox Database" -Password $Temp -ResetPasswordOnNextLogon $true}

Die CSV-Datei des heutigen Tages sieht jedoch ein wenig anders aus. Die Personalabteilung hat der CSV-Datei die Titel und Abteilungen der neuen Mitarbeiter hinzugefügt.

Name,User Name,Title,Department
Deepak Kumar,DKumar,Marketing Analyst,Marketing
Ray Chow,RChow,Sales Associate,Sales
David Simpson,DSimpson,Sales Associate,Sales
Isabel Martins,IMartins,Administrative Assistant,Accounting

Das derzeitige Skript von Amy funktioniert nicht mit der neuen CSV-Datei, weil die Felder für den Titel und die Abteilung nur mithilfe des Cmdlets Set-User aktualisiert werden können. Zuerst überlegt sie sich, ein weiteres Skript zu erstellen, um die gleiche Datei zu lesen und dann das Cmdlet Get-User zu verwenden, um seine Ausgabe mittels Pipelining an das Cmdlet Set-User umzuleiten. Da sie jedoch auch die Ausgabe des Cmdlets New-Mailbox mittels Pipelining an das Cmdlet Set-User umleiten kann, ändert sie einfach ihren vorhandenen Einzeiler.

Import-CSV "C:\NewUsers.csv" | ForEach-Object -Begin {$Temp = ConvertTo-SecureString "pass@word1" -asPlainText -force} -Process {New-Mailbox -Name $_.Name -UserPrincipalName "$($_.UserName)@contoso.com" -OrganizationalUnit "contoso.com/Users" -Database "Server01\Mailbox Database" -Password $Temp -ResetPasswordOnNextLogon $true | Set-User -Title $_.Title -Department $_.Department}

Um sicherzustellen, dass ihre Syntax richtig ist, liest Amy noch die Themen Verwenden der Exchange-Verwaltungsshell und Postfach- und Empfänger-Cmdlets in der Dokumentation zu Microsoft Exchange Server 2007. Nachdem sie ihren neuen Einzeiler ausgeführt hat, liest sie Skripting mit der Windows PowerShell: Script Center, um weitere Einzelheiten zum Skripting in Microsoft Windows PowerShell zu erfahren.

Verwenden von Filtern mit Empfängeraufgaben

Kurz vor der Mittagspause erhält Amy eine dringende E-Mail-Nachricht von ihrem Vorgesetzten Joe. Joe hat eine Beschwerde von der Marketingabteilung erhalten: Da die Marketingmitarbeiter regelmäßig Nachrichten mit großen Anlagen senden, ist das aktuelle Speicherkontingent des Unternehmens zu klein für diese Abteilung. Joe bittet Amy, das Kontingent für "Senden verbieten" für alle Mitarbeiter des Marketings auf 500 MB zu erhöhen und das Kontingent für "Empfangen verbieten" zu entfernen. Er bittet sie außerdem, den gleichen Vorgang für alle Manager im Unternehmen auszuführen.

Amy weiß, dass sie das Cmdlet Get-User zum Abrufen einer Liste aller Mitarbeiter der Marketingabteilung oder der Personen, die einen bestimmten Titel haben, verwenden kann. Sie ist sich jedoch nicht sicher, wie die richtigen Filter für diese Aufgabe eingerichtet werden. Erneut zieht Amy die Produktdokumentation zu Rate. Um weitere Informationen zum Einrichten benutzerdefinierter Empfängerfilter zu erhalten, liest sie das Thema Erstellen von Filtern in Empfängerbefehlen. Um die Liste der verfügbaren Operatoren zu untersuchen, die sie in ihren Filtern verwenden kann, liest sie das Thema Vergleichsoperatoren. Amy vergewissert sich dann, dass der folgende Befehl alle Benutzerpostfächer in der Marketingabteilung zurückgibt.

Get-User -Filter {Department -eq 'Marketing' -and RecipientTypeDetails -eq 'UserMailbox'}

Dank der konsistenten Standards für die Postfachbereitstellung in ihrem Unternehmen weiß Amy, dass alle Manager (und nur die Manager) in der Organisation das Wort Manager, VP oder Officer in ihrem Titel verwenden. Um die Postfächer aller Manager in der Organisation zurückzugeben, richtet sie den folgenden Filter ein.

Get-User -Filter {((Title -like '*Manager*') -or (Title -like '*VP*') -or (Title -like '*Officer*')) -and (RecipientTypeDetails -eq 'UserMailbox')}

Amy kombiniert anschließend die beiden Filter und liest die Ausgabe im folgenden Einzeiler in das Cmdlet Set-Mailbox ein. Sie legt das Warnungskontingent auf 450 MB fest, weil die Unternehmensrichtlinie verlangt, eine Warnung zu senden, wenn das Postfach eines Benutzers 90 Prozent seiner Kapazität erreicht hat.

Get-User -Filter {((Title -like '*Manager*') -or (Title -like '*VP*') -or (Title -like '*Officer*') -or (Department -eq 'Marketing')) -and (RecipientTypeDetails -eq 'UserMailbox')} | Set-Mailbox -IssueWarningQuota 450MB -ProhibitSendQuota 500MB -ProhibitSendReceiveQuota unlimited -UseDatabaseQuotaDefaults $false 

Amy sendet eine Nachricht an ihren Vorgesetzten, dass sie die Postfachkontingente für die Marketingabteilung und das Management geändert hat. Außerdem nimmt sie sich vor, eine Besprechung mit ihrem Vorgesetzten anzusetzen, in der sie nochmals die Speicheranforderungen für die Postfachserver besprechen. Endlich Zeit für das Mittagessen!

Konfigurieren von Empfängern

Als Amy aus der Mittagspause zurückkehrt, hat sich Joe per E-Mail bedankt, dass sie die Speicherkontingente so schnell geändert hat. Er bittet sie, ihm eine Liste der Personen zu senden, deren Speicherkontingente aktualisiert wurden, damit er sie in einer Nachricht über die Änderung informieren kann. Amy entscheidet sich, diese Aufgabe für Joe zu vereinfachen, indem sie eine Verteilergruppe erstellt. Zuerst erstellt sie eine Verteilergruppe namens Quota Exceptions. Um die Mitgliederliste für die neue Verteilergruppe mit Daten aufzufüllen, verwendet sie das Cmdlet ForEach-Object und den Filter, den sie zuvor zum Konfigurieren der Postfächer verwendet hat.

New-DistributionGroup -Name "Quota Exceptions" -OrganizationalUnit "contoso.com/Users" -SamAccountName "QuotaExceptions" -Type Distribution
Get-User -Filter {((Title -like '*Manager*') -or (Title -like '*VP*') -or (Title -like '*Officer*') -or (Department -eq 'Marketing')) -and (RecipientTypeDetails -eq 'UserMailbox')} | ForEach-Object -Process {Add-DistributionGroupMember -Identity "Quota Exceptions" -Member $_.Name}

Weil Amy sicherstellen möchte, dass diese Verteilergruppe nicht versehentlich verwendet wird, konfiguriert sie sie so, dass nur Nachrichten von ihrem Vorgesetzten angenommen werden. Außerdem blendet sie sie aus den Exchange-Adresslisten aus, indem sie den folgenden Befehl ausführt.

Set-DistributionGroup -Identity "Quota Exceptions" -AcceptMessagesOnlyFrom "Joe Healy" -HideFromAddressListsEnabled $true

Amy will Joe gerade benachrichtigen, dass er diese Verteilergruppe verwenden kann, als ihr auffällt, dass es in Zukunft erforderlich sein könnte, die Kontingente für diese Postfachbenutzer erneut zu konfigurieren. Es wäre sinnvoll, eine aktuelle Verteilergruppe für diese Benutzer zu besitzen. Daher entscheidet sie sich, eine dynamische Verteilergruppe zu verwenden, da diese immer aktuell ist. Sie entfernt die soeben erstellte Verteilergruppe und erstellt die dynamische Verteilergruppe namens Managers and Marketing Department Users. Sie verwendet den Filter, den sie für das Cmdlet Get-User erstellt hatte, als Empfängerfilter für die neue dynamische Verteilergruppe.

New-DynamicDistributionGroup -Name "Managers and Marketing Department Users" -Alias "MgrsMktgUsers" -OrganizationalUnit Users -RecipientFilter {((Title -like '*Manager*') -or (Title -like '*VP*') -or (Title -like '*Officer*') -or (Department -eq 'Marketing')) -and (RecipientTypeDetails -eq 'UserMailbox')} | Set-DynamicDistributionGroup -AcceptMessagesOnlyFrom "Joe Healy" -HiddenFromAddressListsEnabled $true

Mithilfe der unter Anzeigen der Mitglieder einer dynamischen Verteilergruppe beschriebenen Schritte stellt sie sicher, dass die dynamische Verteilergruppe ordnungsgemäß eingerichtet wurde. Sie sendet eine Nachricht an ihren Vorgesetzten und informiert ihn, dass er seine Nachricht einfach an die E-Mail-Adresse MgrsMktgUsers@contoso.com senden soll. Außerdem erläutert sie, wie die dynamische Verteilergruppe konfiguriert ist.

Verbinden von Postfächern

Amy meldet sich anschließend am Vorfallsverwaltungstool ihres Unternehmens an und überprüft die Diensttickets, die der Helpdesk an sie eskaliert hat. Es liegt eine Anforderung zum erneuten Verbinden eines Postfachs (Don Hall) vor, das vor zwei Wochen deaktiviert wurde. Amy musste im Vormonat bereits ein anderes Postfach erneut verbinden. Damals wusste sie nicht, in welcher Datenbank das Benutzerpostfach gespeichert war, als es getrennt wurde. Mithilfe der Exchange-Verwaltungskonsole musste sie jeden Postfachserver verbinden, um zu ermitteln, ob das getrennte Postfach auf dem betreffenden Server gespeichert war.

Amy möchte diesen Suchvorgang nicht nochmals ausführen. Daher entscheidet sie sich, ein einfacheres Verfahren zum Ermitteln des Servers herauszufinden, der das getrennte Postfach enthält. Sie findet heraus, dass die vom Cmdlet Get-MailboxStatistics zurückgegebenen Daten Informationen zu den getrennten Postfächern enthalten. Sie möchte die Ausgabe dieses Cmdlets jedoch auf das Postfach beschränken, nach dem die sucht. Nachdem sie das Thema Arbeiten mit Ausgaben von Befehlen gelesen hat, weiß sie nun, dass sie das Cmdlet Where für diese Aufgabe verwenden kann. Um dies zu testen, erstellt sie ein Testpostfach namens Test User 1 in der Postfachdatenbank MBX4 auf Server03 und deaktiviert dieses. Dann führt sie den folgenden Befehl aus.

Get-MailboxStatistics -Database "Server03\MBX4" | Where {$_.DisplayName -eq 'Test User 1'}

Das Cmdlet gibt das folgende Ergebnis zurück:

DisplayName         ItemCount    StorageLimitStatus    LastLogonTime
-----------         ---------    ------------------    -------------
Test User 1         434                  BelowLimit

Der Filter arbeitet wie erwartet, die Ausgabe des Cmdlets ist in ihrer aktuellen Form für Amy jedoch nicht wirklich sinnvoll. Da sie plant, dieses Cmdlet für die Suche nach dem Server in der Organisation zu verwenden, auf dem das getrennte Postfach gespeichert ist, verlangt sie, dass die Ausgabe den Anzeigenamen, den Servernamen und den Datenbanknamen enthält. Zu diesem Zweck formatiert sie die Ausgabe des Cmdlets.

Get-MailboxStatistics -Database "Server03\MBX4" | Where {$_.DisplayName -eq 'Test User 1'} | Format-Table DisplayName,ServerName,DatabaseName

Nun wird das folgende Ergebnis angezeigt, das für ihre Zwecke sinnvoller ist:

Display Name        ServerName          DatabaseName
------------        ----------          ------------
Test User 1         Server03            MBX4

Da Amy jetzt über die gewünschte Befehlssyntax verfügt, muss sie den Befehl veranlassen, alle Postfachdatenbanken in der Organisation anstatt einer bestimmten Postfachdatenbank zu durchsuchen. Also leitet sie die Ausgabe des Cmdlets Get-MailboxDatabase mittels Pipelining an die Befehlssyntax um, die sie erstellt hat, und führt den folgenden Einzeiler aus.

Get-MailboxDatabase | Get-MailboxStatistics | Where {$_.DisplayName -eq 'Don Hall'} | Format-Table DisplayName,ServerName,DatabaseName

Das Cmdlet funktioniert wie erwartet, und sie ermittelt die Postfachdatenbank, in der das Postfach von Don Hall vorhanden war, als es getrennt wurde. Im nächsten Schritt kombiniert sie die unter Herstellen einer Verbindung mit einem Postfach beschriebenen Schritte mit ihrem Einzeiler und verwendet den folgenden Befehl, um eine Verbindung mit dem Postfach herzustellen.

Get-MailboxDatabase | Get-MailboxStatistics | Where {$_.DisplayName -eq 'Don Hall'} | Connect-Mailbox -User DHall@contoso.com

Amy verbringt den Rest des Tages damit, im Microsoft Exchange Server TechCenter neue Informationen zu sammeln und Beiträge im Blog des Microsoft Exchange-Teams zu lesen.

Hinweis

UNRESOLVED_TOKEN_VAL(exBlog)

Weitere Informationen

Wie sie den oben beschriebenen Beispielen entnehmen können, können auf den ersten Blick komplexe Aufgaben der Empfängerverwaltung schnell durch Kombinieren mehrerer Cmdlets und verschiedener Features der Exchange-Verwaltungsshell gelöst werden.

Weitere Informationen zur Empfängerverwaltung in Exchange 2007 sowie zur Exchange-Verwaltungsshell finden Sie in den folgenden Ressourcen:

Serdar Soysal Serdar Soysal - Leitender technischer Autor, Microsoft Exchange Server