[Outlook] 用powershell做outlook中的delegate.

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章