最近在做两个项目:邮箱管理系统和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):
从上面的代码可以看到,有两种方式将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的补充,能获得很好的效率。后面的文章中将会进一步介绍。
分享到:
相关推荐
标题 "exchange/powershell,Java调用powershell开通邮箱" 暗示了这是一个关于使用Java编程语言调用PowerShell脚本在Exchange服务器上创建邮箱的教程或项目。Exchange是微软提供的一款企业级电子邮件服务器软件,而...
总而言之,《精通Windows PowerShell用于Exchange Server 2007 SP1》是Exchange Server管理员必备的参考资料,通过学习这本书,读者可以全面掌握使用PowerShell管理Exchange Server的技巧和策略,成为真正的...
PowerShell重启服务(Restart-Service),使用PowerShell可以很方便的操作Windows系统服务,比如实现自动重启服务。本文就介绍如何使用PowerShell来重启服务,以及一些相关的内容。PowerShell中重启服务的cmdlet是...
该项目为基于Powershell核心,融合Shell和Python语言的WSL(Windows Subsystem for Linux)设计优化源码。项目包含32个文件,具体包括8个YAML配置文件、5个Markdown文件、4个GIF动画文件、3个PowerShell脚本文件...
标题中的“Chromium Browser通过PowerShell自动安装/更新”指的是使用Windows PowerShell自动化处理Chromium浏览器的安装和更新过程。Chromium是一款开源的浏览器项目,它是Google Chrome浏览器的基础,许多其他...
PowerShell是微软的一套任务自动化和配置管理框架,它包含在Windows操作系统中,可以用来控制和自动化Windows系统及其应用程序,如Exchange Server的操作。 《Exchange Server 2016 PowerShell Cookbook 4th》是...
无论是希望通过 PowerShell 提高 Exchange 2010 管理效率的系统管理员,还是希望深入学习 PowerShell 技术的开发人员,都能够从这本书中获益匪浅。通过阅读本书,读者将掌握如何有效利用 PowerShell 这一强大工具来...
OWA-Toolkit, 在攻击 exchange/Outlook Web访问时,Powershell模块帮助 owa工具包帮助攻击交换/Outlook 网络访问的Powershell模块名称 otk init这是一个基本的cmd,让我们来生成一个交换Web服务对象----------------...
Inveigh, 在中间工具中,Inveigh是一个 Windows PowerShell LLMNR/mDNS/NBNS spoofer/person InveighInveigh是一个用于帮助渗透测试人员/red teamers,发现自己局限于一个 Windows 系统的工具。维基...
通过以上步骤,您可以成功地配置并部署Microsoft Lync Server 2010企业版,为组织提供全面的统一通信解决方案。需要注意的是,在实际部署过程中,可能会遇到各种技术问题,建议参考官方文档及社区论坛获取更多帮助和...
PowerShell是微软开发的一个强大命令行脚本环境,用于系统管理和自动化任务,它在Windows操作系统中扮演着重要角色,尤其对于系统管理员来说,是提高工作效率不可或缺的工具。 Windows PowerShell 2.0是PowerShell...
- **Lync Server 2010 Management Shell**:这是基于命令行的管理工具,通过 PowerShell 命令实现对 Lync Server 的高级管理和复杂配置。对于批量操作和自动化任务尤其有用。 #### 知识点四:虚拟环境设置 - **...
Exchange 2010 PowerShell Cheat Sheet,介绍了Exchange 2010的命令及功能。
在Windows 7和8系统上使用Exchange远程PowerShell进行Exchange 2010环境的管理,可以提高效率并减少对服务器的直接物理访问。 配置远程PowerShell是使用该功能的第一步,以下是一次性配置的步骤: 1. 将用于管理...
在Windows操作系统环境中,PowerShell是一种强大的命令行工具,它提供了丰富的功能来处理系统管理和自动化任务,包括发送HTTP/HTTPS请求。本篇将深入探讨如何使用PowerShell发送POST和GET请求,以及这些请求在网络...