`
s_jiangwei2011
  • 浏览: 19496 次
  • 性别: 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是...

    lync power shell

    通过以上介绍,我们不仅了解了Lync Server 2010与PowerShell集成的基本操作和高级技巧,还深入探讨了权限管理的重要性以及如何获取有效的技术支持。这对于任何希望提升企业通信系统管理技能的IT专业人员来说,都是...

    基于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 这一强大工具来...

    Microsoft Exchange Server 2016 PowerShell Cookbook

    《Microsoft Exchange Server 2016 PowerShell Cookbook》是一本适合从初级到中级Exchange管理员的实用手册,尤其是对于那些希望通过脚本技术提升工作效率的管理员来说,本书无疑提供了一套完备的实践指南。通过学习...

    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. 将用于管理...

Global site tag (gtag.js) - Google Analytics