Using the Exchange Management Shell for Bulk Recipient Management

 

上次修改主題的時間: 2007-03-26

作者:Serdar Soysal

在 Microsoft Exchange Server 2007 中,您可以在 Exchange 管理命令介面及 Exchange 管理主控台中執行大部分的收件者管理工作。若是只有單一收件者的工作,通常使用 Exchange 管理主控台會比較簡單 (除非您不會打錯字)。然而,當您嘗試設定多個收件者時,Exchange 管理命令介面的功能和方便性都是無可取代的。

對我而言,Exchange 管理命令介面的學習曲線包含三個階段:

  1. 「哇,真酷,但看起來有點複雜。」

  2. 「嘿,我沒有用滑鼠,就建立了一個信箱!」

  3. 「我再也不會回頭使用 UI 了。我不要!也不想!不管你說什麼,我都不會改變!」

好吧,也許第三階段的描述是有點誇張,但您知道重點是什麼。2007 年 1 月發行的功能文章<Exchange 管理命令介面入門>(英文) 有助於您了解前兩個階段。希望接下來的內容有助於您了解第三階段,至少會了解收件者管理。

為了增加趣味性,我們一起跟著收件者系統管理員 Amy,看她如何使用 Exchange 管理命令介面來處理她星期一接獲任命的工作。

建立信箱

Amy 每個星期一要做的第一件事,就是為那個星期的所有新進員工建立信箱。每個星期一早上,人力資源 (HR) 部門都會傳送一個以逗點分隔值的檔案 (CSV) 給 Amy,該檔案含有新進員工的姓名和使用者名稱。HR 傳來的典型 CSV 檔案看起來像下面這樣:

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

在建立新信箱時,Amy 需要完成下列所有工作:

  • 將使用者主要名稱 (UPN) 副檔名 contoso.com 新增至每一個使用者名稱。

  • 指定 pass@word1 為初始密碼。

  • 設定使用者要在第一次登入時變更密碼。

  • 指定要將新信箱放在哪個信箱資料庫及組織單位 (OU)。

最早指派她執行這項週期性的工作時,她就決定要使用 Exchange 管理命令介面快速完成工作。她一開始先執行下列 New-Mailbox 命令,以建立一個名為 Test User 1 的測試使用者。

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

該命令開始運作,但會提示她輸入新使用者的密碼。New-Mailbox 指令程式的 password 參數僅接受安全字串,所以她無法在命令中使用純文字的預設密碼。為了解決這個問題,她使用 ConvertTo-SecureString 指令程式,從預設密碼來建立安全字串,並將它儲存在使用者定義的變數 $Temp 中。然後她可以將該變數傳傳至 New-Mailbox 指令程式的 password 參數。

$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

下一個步驟是從 CSV 檔案中讀取使用者資訊,並將提供作業自動化。檢閱 Microsoft Exchange 團隊部落格<Exchange Server 2007 收件者管理單行指令>(英文) 中的大量管理範例之後,她修改自己的指令碼來完成這項工作。

note附註:
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 可以從部落格文章中的範例複製語法,來設定此指令碼。但是,她不太了解 $_ 語法的用處是什麼。在稍加研究之後,她找到<命令介面變數>(英文) 這個主題。此文章說明 $_ 是 Exchange 管理命令介面變數,其中包含目前的管線物件。.因此,每次在她的指令碼中執行以 Process 參數來指定的指令碼區塊時,$_ 變數都會包含 CSV 檔案中的下一列資料。

還有一點 Amy 不是很清楚,就是設定 UPN 時使用的語法。這是不一樣的,因為該變數值不是直接指派給 New-Mailbox 指令程式的參數,而是用來修改指派給參數的字串。Amy 檢閱了<語法>(英文) 這個主題,其中討論適用於 Exchange 管理命令介面的命令語法,她也發現 $() 語法可用來替代命令的輸出,以作為指令碼中的引數。在 Exchange 管理命令介面中,如果您只輸入一個變數,則輸出就是該變數的值。因此,當您在 $() 區塊中放置一個變數時,就會將該區塊替換成變數的值。在她的指令碼中,$_.UserName 變數包含使用者名稱。將此變數放在 $() 語法中,Amy 就可以將變數值插入指派給 UserPrincipalName 參數的字串。

在深入了解 Exchange 管理命令介面中的命令語法之後,Amy 繼續進行下一個步驟,並將她的指令碼第一行移至 ForEach-Object 指令程式的 Begin 參數,再將它轉換成她自己的大量收件者管理單行指令。每個星期一,她只要將 HR 傳來的最新 CSV 檔案外掛在下列指令碼。

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}

然而,今天的 CSV 檔案看起來有些不同。HR 部門在 CSV 檔案中加入了新進員工的職稱和部門。

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

Amy 的指令碼無法與新的 CSV 檔案搭配使用,因為 [職稱] 和 [部門] 欄位只能使用 Set-User 指令程式來更新。起先,她想要撰寫另一個指令碼來讀取相同的檔案,然後使用 Get-User 指令程式,並將它的輸出藉由管線連接至 Set-User 指令程式。然而,由於她也可以將 New-Mailbox 指令程式的輸出藉由管線連接至 Set-User 指令程式,所以她最後只修改現有的單行指令。

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}

為了確保她的語法正確,Amy 參閱了 Microsoft Exchange Server 2007 中的<使用 Exchange 管理命令介面>(英文) 以及<信箱與收件者指令程式>(英文) 主題。她在執行新的單行指令之後,瀏覽了<使用 Windows PowerShell 建立指令碼:指令碼中心>(英文),以深入了解如何在 Microsoft Windows PowerShell 中建立指令碼。

使用篩選器來進行收件者工作

就當 Amy 中午要外出用餐之際,她收到經理 Joe 傳來一封緊急的電子郵件。Joe 收到行銷部門傳來的抱怨。由於行銷人員經常會傳送含有大型附件的郵件,所以對這個部門而言,目前的公司儲存區配額太小。Joe 要求 Amy 將行銷部門每個人的禁止傳送配額增加到 500 MB,並移除禁止接收配額。他也要求她為公司的所有經理做同樣的修改。

Amy 知道她可以使用 Get-User 指令程式來取得在行銷部門工作或是有特定職稱的所有人員名單。但是,她不確定如何設定正確的篩選器來執行這項工作。Amy 又再度參閱產品文件。為了深入了解如何設定自訂收件者篩選器,她參閱了<在收件者命令中建立篩選器>(英文)。為了檢查她可以用在篩選器中的運算子清單,她參閱了<比較運算子>(英文)。然後,Amy 查證下列命令會傳回行銷部門中的所有使用者信箱。

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

由於公司有一致的信箱提供標準,所以 Amy 知道組織中所有的經理 (而且也只有經理) 的職稱當中會有 ManagerVPOfficer 等字樣。為了傳回組織中所有經理的信箱,她設定了下列篩選器。

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

然後,Amy 將這兩個篩選器合併,並將輸出加入下列單行指令中的 Set-Mailbox 命令。她將警告配額設為 450 MB,因為公司的原則是當使用者信箱容量達 90% 時,就要傳送警告。

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 傳送通知給她的經理,告訴他已經處理好行銷部門及管理階層的信箱配額。她暗忖著要與她的經理排定一場會議,重新討論信箱伺服器的儲存需求。該是好好享受午餐的時刻了。

設定收件者

當 Amy 用餐回來,她看到 Joe 送來的郵件,感謝她這麼快就處理好儲存配額的事。他問她是否可以將已更新儲存配額的人員名單傳送給他,讓他可以傳送郵件給那些人,通知他們有這項變更。她決定建立通訊群組,以方便他使用。首先,她建立了一個名為 Quota Exceptions 的通訊群組。為了填入新通訊群組的成員資格清單,她使用 ForEach-Object 指令程式,以及她之前用來設定信箱的篩選器。

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}

由於 Amy 想要確保此通訊群組不會不小心遭到使用,便執行下列命令,將通訊群組設為僅接受她的經理傳來的郵件,並將它隱藏,不讓 Exchange 通訊清單被看到。

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

正當 Amy 要通知 Joe 使用此通訊群組時,她想到將來可能還有需要再對這些信箱使用者設定配額。留著這些使用者最新的通訊群組會很有用。所以她決定改用動態通訊群組,因為這樣它永遠都是最新的。她移除了剛才建立的通訊群組,另外再建立一個名為 Managers and Marketing Department Users 的動態通訊群組。她利用之前用於 Get-User 指令程式的篩選器來作為新的動態通訊群組的收件者篩選器。

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

她利用<如何檢視動態通訊群組成員>(英文) 中所描述的步驟,驗證動態通訊群組的設定無誤。她傳送郵件告訴她的經理,只要將他的郵件傳送到 MgrsMktgUsers@contoso.com 這個電子郵件地址即可,並說明如何設定動態通訊群組。

連接信箱

然後,Amy 登入公司的事件管理工具,檢閱服務台提報給她的服務票證。有一個要重新連接 Don Hall 信箱的要求,但是該信箱在二週前停用了。Amy 上個月必須連接另一個信箱。當時她不知道該使用者信箱中斷連線時,是由哪個資料庫來保管。使用 Exchange 管理主控台,她必須連接至每部信箱伺服器,以查看中斷連線的信箱是否儲存在那裡。

Amy 不想再經歷相同的搜尋工作。因此,她決定找出較簡單的方法來判斷哪個伺服器包含那個中斷連線的信箱。她發現 Get-MailboxStatistics 指令程式傳回的資料含有中斷連線信箱的相關資訊。然而,她想要將這個指令程式的輸出縮小到她要尋找的信箱。在參閱<使用命令輸出>(英文) 這個主題之後,她發現她可以使用 Where 指令程式來達成這個目的。為了測試這個作法,她在 Server03 上的 MBX4 信箱資料庫中建立一個名為 Test User 1 的測試信箱,然後停用它。接著,她執行下列命令。

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

該指令程式傳回下列結果:

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

篩選器的運作如同預期,但是指令程式輸出的現行格式對 Amy 來說不是很有幫助。因為她計畫要使用這個指令程式,找出組織中的哪一個伺服器有中斷連線的信箱,所以她需要輸出能夠顯示伺服器名稱、顯示名稱及資料庫名稱。因此,她將指令程式的輸出格式化,來達到此目的。

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

結果顯示如下,現在比較符合她的用途了:

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

現在,既然 Amy 有了她想要的命令語法,便需要讓該命令查看組織中的所有信箱資料庫,而不是特定的資料庫。因此,她將 Get-MailboxDatabase 指令程式的輸出透過管線連接到她已建立的命令語法,並執行下列單行指令。

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

指令程式的運作如同預期,而且她找到了 Don Hall 信箱中斷連線時所在的信箱資料庫。她又向前跨了一步,將<如何連接信箱>(英文) 中描述的步驟與她的單行指令合併,並使用下列命令來連接信箱。

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

Amy 花了一整個下午的時間瀏覽 Microsoft Exchange Server 技術資源中心Microsoft Exchange 小組部落格 (英文),以取得新資訊。

note附註:
UNRESOLVED_TOKEN_VAL(exBlog)

相關資訊

如上述範例所示,藉由合併多重指令程式與 Exchange 管理命令介面的各種功能,您可以快速地完成看似複雜的收件者管理工作。

若要深入了解 Exchange 2007  及 Exchange 管理命令介面中的收件者管理工作,請參閱下列資源:

Serdar Soysal Serdar Soysal - Microsoft Exchange Server 資深技術作者