首页 > 代码库 > [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.