`
s_jiangwei2011
  • 浏览: 19156 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

通过Powershell操作Exchange/Lync Service 2010

    博客分类:
  • C#
阅读更多

      最近在做两个项目:邮箱管理系统和Lync开户系统。其中邮件管理系统主要对 Exchange Service上的邮箱和群组进行管理,邮箱(MailBox)管理包括创建邮箱、禁用邮箱、删除邮箱、设置主地址等功能,群组 (DistributionGroup)管理包括创建/删除群组、添加/删除群组成员、添加/删除群组白名单等;Lync开户系统主要是为邮箱开通使用 Microsoft Lync拨打电话的功能,并设置Lync内部号码。

       由于项目组成员都是Java程序员(声明自己也是一个Java程序员),两个项目都是使用java语句开发,但是用Java访问微软的东东还是很不方便 的,为此使用.net封装了操作Exchange/Lync Service的WebService服务,以供Java调用。呵呵,C#与Java语言最类似,入手最快就使用它了~

     在开发过程中,查了很多资料,但大部分都很凌乱,入门教程并有详细说明的只找到了一篇(还是值得看的: http://www.cnblogs.com/gongguo/archive/2012/03/12/2392049.html ),但需要多封装一个 COM 组件并且 COM 组件的配置也很复杂,为此写一篇 Exchange/Lync 开发的入门教程,一是总结最近的开发经验,二是让大家少走点弯路。看了网上很多资料,第一次决定开博客记录自己的技术成长轨迹,就多啰嗦了,请见谅 ~O( _ )O~

       .net 操作 Exchange/Lync Service 的基本思想 :利用 System.Management.Automation.dll 提供的接口调用 Windows Powershell cmdlets 命令,而 Windows Powershell 可以通过 Add-Pssnapin import-module 载入 Exchange Lync 模块,从而可以直接调用 Exchange Lync Service 的相关命令。【这种方式最大的缺点是执行速度太慢,为此像修改邮箱的基本信息这类的操作,建议通过 LDAP 的方式直接修改 AD 账号的属性 --- 详见后续文章(使用 LDAP 协议访问 AD )】

     开发环境: (x64)Win7 Service/AD 域( dc=test,dc=com)/Windows Powershell(x86,x64)/Exchange Service2010( Lync Service2010 /IIS7.0

     开发工具: Visual Studio 2010

       开发步骤:

首先,创建类库PowerShellComponent.dll,以封装Powershell命令的调用接口 :

1.打开VS,新建项目--->类库,名称PowerShellComponent,.net选择:.net Framework4.0(2.0或2.0以上即可)

2.将类名Class1.cs重命名为PowerShellCore.cs

3.添加Dll引用:C:\Windows\assembly\GAC_MSIL\System.Management.Automation\1.0.0.0__31bf3856ad364e35\System.Management.Automation.dll

4.引入两个命名空间:

using System.Management.Automation;
using System.Management.Automation.Runspaces;

5.创建执行Powershell命令的方法ExceCommand(cmdlet,parms):

public bool ExceCommand(string commandName, Hashtable parms)
        {
            RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();
            PSSnapInException warning = null;
            //Exchange Service
            PSSnapInInfo info = runspaceConfiguration.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.E2010", out warning);            
            Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
            /*
            InitialSessionState iss = InitialSessionState.CreateDefault();
            iss.ImportPSModule(new String[]{"Lync"});//Lync Service
            //Exchange Service2
            //iss.ImportPSSnapIn("Microsoft.Exchange.Management.PowerShell.E2010",out warning);
            Runspace runspace = RunspaceFactory.CreateRunspace(iss);
            */

            runspace.Open();
            Pipeline pipeline = runspace.CreatePipeline();
            string message = string.Empty;
            using (pipeline)
            {
                Command item = new Command(commandName);
                foreach (DictionaryEntry entry in parms)
                {
                    item.Parameters.Add(entry.Key.ToString(), entry.Value);
                }
                pipeline.Commands.Add(item);
                ICollection<PSObject> is2 = pipeline.Invoke();
                if ((pipeline.Error != null) && (pipeline.Error.Count > 0))
                {
                    foreach (object obj2 in pipeline.Error.ReadToEnd())
                    {
                        message = message + obj2.ToString() + "|";
                    }
                    throw new Exception(message);
                }
            }
            pipeline = null;
            runspace.Close();
            runspace = null;
            return string.IsNullOrEmpty(message);
        }
 

 从上面的代码可以看到,有两种方式将Exchange模块引入Powershell,但本质都是使用Add-Pssnapin命令,有一种方式载入Lync模块,本质是调用Import-Module命令。

6.另外,上述方法中的commandName参数取值也可也是脚本文件的路径,比如C:/ps/setLyncNumber.ps1。其中setLyncNumber.ps1的内容为:

 

param([string] $username,[string] $lineURI)

//Import-Module 'C:\Program Files\Common Files\Microsoft Lync Server 2010\Modules\Lync\Lync.psd1'

Set-CsUser -Identity $username  -LineURI $lineURI 
 
其中,Import-Module与代码iss.ImportPSModule(new String[]{"Lync"})的功能相同,可以去掉。

7.编译生成PowerShellcomponent.dll库。


其次,创建WebService服务ADBaseService,提供一个调用PowershellComponent的测试类

1.新建项目--->Web 服务程序,名称:ADBaserService, .net为.net framework3.5(我的.net4.0没有创建WS的选项)

2.重命名Service1.asmx为ADService.asmx,同时别忘修改"标记“

3.进入ADBaseService的属性,设置目标框架为:.net framework4.0. (完成后,测试HelloWorld程序,确保运行正常)

4.添加对项目或dll库PowerShellComponent的引用

5.添加测试类Test.cs,并添加方法NewMailbox(samAccountName)及SetLyncNumber(name,lineUri):

 public string NewMailbox(string samAccountName)
        {
            try
            {
                Hashtable parms = new Hashtable();
                parms.Add("Name", samAccountName);
                parms.Add("SamAccountName", samAccountName);
                parms.Add("UserPrincipalName", samAccountName + "@test.com");

                parms.Add("OrganizationalUnit", "TestOU");
                char[] chArray = "admin@1243".ToCharArray();
                SecureString str = new SecureString();
                foreach (char ch in chArray)
                {
                    str.AppendChar(ch);
                }
                parms.Add("Password", str);


                new PowerShellCore().ExceCommand("New-Mailbox", parms);
            }
            catch (Exception e)
            {
                return e.StackTrace;
            }

            return "Success";
        }
 
        public string SetLyncNumber(string name, string lineURI)
        {
            try
            {
                Hashtable parms = new Hashtable();
                parms.Add("Identity ", "test\\" + name);
                parms.Add("LineURI", lineURI);

                new PowerShellCore().ExceCommand("Set-CsUser", parms);
            }
            catch (Exception e)
            {
                return e.StackTrace;
            }

            return "Success";
        }

 6.在ADService.asmx.cs中添加调用上述两个方法的Webmethod:NewMailBox和SetLyncNumber.

7.启动VS的调试模式,分别在LyncService2010上测试SetLyncNumber、在ExchangeService2010上测试NewMailBox,结果为:

(1)SetLyncNumber测试通过!

(2)NewMailBox测试失败,抛出异常:没有为Windows PowerShell版本2注册管理单元

问题分析

      首先定位异常抛出位置为:

PSSnapInInfo info = runspaceConfiguration.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.E2010", out warning); 

而这行代码等同于在Powershell中调用命令:

Add-Pssnapin Microsoft.Exchange.Management.PowerShell.E2010

也就说在Windows Powershell中执行这条命令应该报同样的错误。

      其次,查找Powershell的问题。我们知道在X64 Service中,存在两个Powershell命令窗口,分别位于“%SystemRoot%\System32\WindowsPowerShell\V1.0” 和“%SystemRoot%\SysWOW64\WindowsPowerShell\V1.0”中。在这两个命令窗口中都执行上面的命令,结果发现System32下的正常,而SysWOW64下的报错了,错误与程序中的一样,验证了我们的猜测。

      到此应该清楚问题的原因了:VS调试时以x86程序的方式启动,而Win7 X64位系统中,X86程序只能以WOW64的模式运行,因此程序调用了SysWOW64下的Powershell。然而Exchange Service的cmdlets模块是X64的,无法在X86的Powershell中加载。[Lync Service的cmdlets模块是X86的,在两个Powershell中都可以加载,因此后续修复该问题时的变动对LyncService无影响,能一直保证它的正确性。]

(备注:SysWOW64下是X86的Powershell而不是X64,有关这方面的知识请查找”x86程序在x64为机器上执行的原理“;X64的程序可以加载X86的Dll库,但X86的程序无法加载X64的Dll库)

解决方案

       将ADBaseService以X64的方式运行。

方案一:

      首先将PowershellComponent项目的”目标平台“设为:x64;然后重新编译。其次将ADBaseService项目的”目标平台“也设置为:x64,最后启动调试即可。

 备注:(1)注意不要引用X86 下的System.Management.Automation.dll; 其他类库的引用可以不变。

           (2)启动调试时,如果报错误:Could not load file or assembly 'XXXXXX' or one of its dependencies. An attempt was made to load a program with an incorrect format【未能加载文件或程序集“ADBaseService”或它的某一个依赖项。试图加载格式不正确的程序。】 。。。。。

这是因为VS不支持X64位调试的原因,有关这个问题的描述及微软的答复,参考:http://connect.microsoft.com/VisualStudio/feedback/details/556670/could-not-load-file-or-assembly-error-when-referencing-a-64-bit-assembly

虽然上面提供了一种解决方案,但是本人对VS不熟,也没兴趣研究,不在做过多说明。

方案二:

      直接将ADBaseService部署到IIS7.0服务器上,利用IIS对X64位程序的支持来解决这个问题。

备注:(1)这种方案其实就是线上部署过程,详见下面的描述;

         (2)该方案的缺点是:调试不方便,但可以通过日志输出的方式代替。

 

最后,将WS服务ADBaseService部署到IIS7.0上,为Java程序调用提供接口:

1.打开Internet信息服务器IIS,选择添加网站:填写”网站名称“:ADBaseService,指定一个具体的”物理路径“,分配端口为8088,最后单击确定。

2.在”应用程序池中“找到ADBaseService,右键选择”高级设置“:.net framework版本---4.0,启用32位应用程序---False(默认就为False),标识--->自定义账户--->设置:用户名--域名\账号,密码---****(确保该账号具有执行Powershell命令的权限即可),确定即可。

3.VS中,选择发布ADBaseService,填写服务URL---localhost,网站/应用程序--ADBaseService,最后单击”发布“,完成发布工作。

4.重启IIS上的ADBaseService,然后浏览http://localhost:8088/ADService.asmx,测试WS方法NewMailBox。测试通过,大功告成!

 

备注:(1)如果你是IIS6.0,那需要设置IIS6.0,让它支持x64位的.net程序,设置方式参考:http://support.microsoft.com/kb/894435

        (2)如果测试没有通过,注意检查.net版本以及账号的权限,同时查看System.Management.Automation.dll的引用是否是x64的。

 

到此完成了通过Powershell访问Exchange Service2010/Lync Service2010的全部工作,本文也只给出了创建邮箱一个方法,其他操作查看msdn的帮助文档即可:http://msdn.microsoft.com/zh-cn/library/aa997174.aspx

 

文章开头提到的使用LDAP协议访问AD账号是对操作Exchange/Lync service的补充,能获得很好的效率。后面的文章中将会进一步介绍。

 

分享到:
评论
1 楼 xiaocao000 2014-11-03  
感谢LZ分项 ,最近正要做一个类似的需求,lz的文章让我有了一个实现的思路, 再次感谢~~

相关推荐

    exchange/powershell,Java调用powershell开通邮箱

    标题 "exchange/powershell,Java调用powershell开通邮箱" 暗示了这是一个关于使用Java编程语言调用PowerShell脚本在Exchange服务器上创建邮箱的教程或项目。Exchange是微软提供的一款企业级电子邮件服务器软件,而...

    Wrox - Professional Windows PowerShell for Exchange Server 2007 SP1 (Jan 2008)

    总而言之,《精通Windows PowerShell用于Exchange Server 2007 SP1》是Exchange Server管理员必备的参考资料,通过学习这本书,读者可以全面掌握使用PowerShell管理Exchange Server的技巧和策略,成为真正的...

    PowerShell重启服务命令Restart-Service详细介绍

    PowerShell重启服务(Restart-Service),使用PowerShell可以很方便的操作Windows系统服务,比如实现自动重启服务。本文就介绍如何使用PowerShell来重启服务,以及一些相关的内容。PowerShell中重启服务的cmdlet是...

    基于Powershell和Shell/Python语言的WSL设计优化源码

    该项目为基于Powershell核心,融合Shell和Python语言的WSL(Windows Subsystem for Linux)设计优化源码。项目包含32个文件,具体包括8个YAML配置文件、5个Markdown文件、4个GIF动画文件、3个PowerShell脚本文件...

    Chromium Browser通过PowerShell自动安装/更新

    标题中的“Chromium Browser通过PowerShell自动安装/更新”指的是使用Windows PowerShell自动化处理Chromium浏览器的安装和更新过程。Chromium是一款开源的浏览器项目,它是Google Chrome浏览器的基础,许多其他...

    Exchange_Server_2016_PowerShell_Cookbook_4th

    PowerShell是微软的一套任务自动化和配置管理框架,它包含在Windows操作系统中,可以用来控制和自动化Windows系统及其应用程序,如Exchange Server的操作。 《Exchange Server 2016 PowerShell Cookbook 4th》是...

    Microsoft Exchange 2010 PowerShell Cookbook

    无论是希望通过 PowerShell 提高 Exchange 2010 管理效率的系统管理员,还是希望深入学习 PowerShell 技术的开发人员,都能够从这本书中获益匪浅。通过阅读本书,读者将掌握如何有效利用 PowerShell 这一强大工具来...

    OWA-Toolkit, 在攻击 exchange/Outlook Web访问时,Powershell模块帮助.zip

    OWA-Toolkit, 在攻击 exchange/Outlook Web访问时,Powershell模块帮助 owa工具包帮助攻击交换/Outlook 网络访问的Powershell模块名称 otk init这是一个基本的cmd,让我们来生成一个交换Web服务对象----------------...

    Inveigh, 在中间工具中,Inveigh是一个 Windows PowerShell LLMNR/mDNS/NBNS spoofer/person.zip

    Inveigh, 在中间工具中,Inveigh是一个 Windows PowerShell LLMNR/mDNS/NBNS spoofer/person InveighInveigh是一个用于帮助渗透测试人员/red teamers,发现自己局限于一个 Windows 系统的工具。维基...

    一步一步配置Lync_Server_2010_企业版

    通过以上步骤,您可以成功地配置并部署Microsoft Lync Server 2010企业版,为组织提供全面的统一通信解决方案。需要注意的是,在实际部署过程中,可能会遇到各种技术问题,建议参考官方文档及社区论坛获取更多帮助和...

    Microsoft.Press.Windows.PowerShell.2.0.Administrators.Pocket.Consultant.May.2009.rar

    PowerShell是微软开发的一个强大命令行脚本环境,用于系统管理和自动化任务,它在Windows操作系统中扮演着重要角色,尤其对于系统管理员来说,是提高工作效率不可或缺的工具。 Windows PowerShell 2.0是PowerShell...

    Microsoft Lync Server 2010 会议协作

    - **Lync Server 2010 Management Shell**:这是基于命令行的管理工具,通过 PowerShell 命令实现对 Lync Server 的高级管理和复杂配置。对于批量操作和自动化任务尤其有用。 #### 知识点四:虚拟环境设置 - **...

    Exchange 2010 PowerShell Cheat Sheet

    Exchange 2010 PowerShell Cheat Sheet,介绍了Exchange 2010的命令及功能。

    exchange remote powershell

    在Windows 7和8系统上使用Exchange远程PowerShell进行Exchange 2010环境的管理,可以提高效率并减少对服务器的直接物理访问。 配置远程PowerShell是使用该功能的第一步,以下是一次性配置的步骤: 1. 将用于管理...

    使用PowerShell发送POST / GET请求

    在Windows操作系统环境中,PowerShell是一种强大的命令行工具,它提供了丰富的功能来处理系统管理和自动化任务,包括发送HTTP/HTTPS请求。本篇将深入探讨如何使用PowerShell发送POST和GET请求,以及这些请求在网络...

Global site tag (gtag.js) - Google Analytics