zoukankan      html  css  js  c++  java
  • [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)

    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('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)

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

    最后,也是很多文章都没有提及的,就是必须有至少是impersonation的role权限,

    http://msdn.microsoft.com/en-us/library/office/bb204095(v=exchg.140).aspx

  • 相关阅读:
    WPF 中依赖属性的继承(Inherits)
    使用FluentValidation来进行数据有效性验证
    使用ASP.Net WebAPI构建REST服务(六)——Self-Host
    使用ASP.Net WebAPI构建REST服务(五)——客户端
    使用ASP.Net WebAPI构建REST服务(四)——参数绑定
    使用ASP.Net WebAPI构建REST服务(三)——返回值
    使用ASP.Net WebAPI构建REST服务(二)——路由
    使用ASP.Net WebAPI构建REST服务(一)——简单的示例
    WPF在代码中创建DataTemplate时候的异常
    一个简单的WeakList的实现
  • 原文地址:https://www.cnblogs.com/LarryAtCNBlog/p/4061861.html
Copyright © 2011-2022 走看看