首页 > 代码库 > [Outlook] 用powershell做outlook中的delegate.

[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(‘xxxxx@yyy.com‘)

或者像下面直接指定CAS服务器上的ews

$Service.Url = ‘https://CASServer/ews/exchange.asmx‘

 从$Service的方法中,可以看到和delegate相关的方法($Service | get-member)

AddDelegatesGetDelegatesRemoveDelegatesUpdateDelegates

还是很明显的,用AddDelegates就可以添加delegate了,使用$Service.AddDelegates可以直接输出它接收的几个参数,输出结果可能有些乱,清理如下,

参数1是一个mailbox,也就是我们的目标mailboxMicrosoft.Exchange.WebServices.Data.Mailbox mailbox参数2是一个meetingRequestsDeliveryScopeMicrosoft.Exchange.WebServices.Data.MeetingRequestsDeliveryScope meetingRequestsDeliveryScope参数3是一个delegateUsers的集合Microsoft.Exchange.WebServices.Data.DelegateUser

其中参数2就是下图outlook中的设置,

现在方法有了,参数也知道了,参数类型也有了,那就一个个把它们生成出来就好了。

生成参数1,

$Mailbox = New-Object Microsoft.Exchange.WebServices.Data.Mailbox(‘xxxxx@yyy.com‘)

生成参数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)

运行正确是不会报错的,但是可能会失败,这个方法的返回是执行结果,如果错误的话也会包括具体的错误信息非常好排错。

[Outlook] 用powershell做outlook中的delegate.