This arctical will be published in English also - http://www.cnblogs.com/LarryAtCNBlog/p/4062593.html
環境Exchange 2010 SP2 + Outlook 2010
加delegate其實並不是一條命令的事,因爲在server上用命令行操作和outlook本地操作完全不一樣,outlook會自動做其它很多事情,如下圖是outlook中默認會勾上的幾個功能。
1. Calendar的editor權限
2. Tasks的editor權限
3. Delegate receives copies of meeting-related messages sent to me 會打上勾
這其實在outlook2003中就是如此,但這導致了一個問題,在exchange 2010中,雖然提供了一個Set-Mailbox -GrantSendOnBehalfTo來加delegate,但這僅僅是加一個delegate,完全沒有默認設置上圖中的各種選項,因此就要通過其它一些命令來做。
1. Calendar和Tasks都可以用Add-MailboxFolderPermission來添加權限。
2. 問題在於"Delegate receives copies of meeting-related messages sent to me",這個功能是很多Assistant都要的,但是唯獨它沒有一個cmdlet能直接做到修改。
於是,下面就是怎麼利用EWS(Exchange web service)來做一個完整的delegate,其實outlook也是通過它做的。
第一步,下載EWS API - http://www.microsoft.com/en-us/download/details.aspx?id=35371
安不安裝都無所謂,我們只需要用到裏面的Microsoft.Exchange.WebServices.dll,用7z其實可以解壓出來跳過安裝。
然後打開powershell,由於用的是Webservice,這個powershell在哪運行就無所謂了。
用import-module引導該dll,它的類纔可以被我們使用,當然如果喜歡高大上的代碼,也可以用[Reflection.Assembly]::LoadFile()方法。
Import-Module .\Microsoft.Exchange.WebServices.dll
運行下面的代碼建立一個ExchangeService的instance,如果沒有後面的Exchange2010_SP2,該instance會默認以API裏最新的建立。
$Service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService('Exchange2010_SP2')
再輸入$Service可以看到一些屬性,或者用get-member也可以得到方法,這裏我就不貼出來了。
這時候需要指定EWS的url,有兩種辦法,一種是直接指定EWS的URL,或者用$Service裏帶的一個method叫AutodiscoverUrl自動發現一下,個人是推薦AutodiscoverUrl的,因爲這是直接從AD裏讀取Autodiscover的配置,只要outlook能正常discover,那這個功能肯定也沒問題。
$Service.AutodiscoverUrl('[email protected]')
或者像下面直接指定CAS服務器上的ews
$Service.Url = 'https://CASServer/ews/exchange.asmx'
從$Service的方法中,可以看到和delegate相關的方法($Service | get-member)
AddDelegates
GetDelegates
RemoveDelegates
UpdateDelegates
還是很明顯的,用AddDelegates就可以添加delegate了,使用$Service.AddDelegates可以直接輸出它接收的幾個參數,輸出結果可能有些亂,清理如下,
參數1是一個mailbox,也就是我們的目標mailbox
Microsoft.Exchange.WebServices.Data.Mailbox mailbox
參數2是一個meetingRequestsDeliveryScope
Microsoft.Exchange.WebServices.Data.MeetingRequestsDeliveryScope meetingRequestsDeliveryScope
參數3是一個delegateUsers的集合
Microsoft.Exchange.WebServices.Data.DelegateUser
其中參數2就是下圖outlook中的設置,
現在方法有了,參數也知道了,參數類型也有了,那就一個個把它們生成出來就好了。
生成參數1,
$Mailbox = New-Object Microsoft.Exchange.WebServices.Data.Mailbox('[email protected]')
生成參數2,
$Scope = [Microsoft.Exchange.WebServices.Data.MeetingRequestsDeliveryScope]::DelegatesOnly
生成參數3,
$dgUser = New-Object Microsoft.Exchange.WebServices.Data.DelegateUser('zzz@yyy.com') $dgUser.Permissions.CalendarFolderPermissionLevel = 'editor' $dgUser.Permissions.TasksFolderPermissionLevel = 'editor' $dgUser.ReceiveCopiesOfMeetingMessages = $true
好了,3個參數完成,下面是調用AddDelegates把delegates加上去。
$Service.AddDelegates($Mailbox, $Scope, $dgUser)
運行正確是不會報錯的,但是可能會失敗,這個方法的返回是執行結果,如果錯誤的話也會包括具體的錯誤信息非常好排錯。
最後,也是很多文章都沒有提及的,就是必須有至少是impersonation的role權限,
http://msdn.microsoft.com/en-us/library/office/bb204095(v=exchg.140).aspx