设为首页 收藏本站
查看: 817|回复: 0

[经验分享] c#创建exchange邮箱问题

[复制链接]

尚未签到

发表于 2015-9-11 07:16:46 | 显示全部楼层 |阅读模式
       登 录..      [注 册]      忘记密码      注销登录

[td]


iyunv.com
首 页 |第二书店 |社 区 |专 题 |精 华 |SUN |IBM |微 软 |微 创 |书 社 |《程序员》 |调 查 |聊 天 |黄 页
新 闻 |Donews |文 档 |FAQ |专 栏 |人 才 |培 训 |移 动 |人 邮 |清 华 |《开发高手》 |搜 索 |软 件 |会 员

2004.10.22


CSDN - 技术社区 - .NET技术 ASP.NET问题
回复 | 推荐 | 收藏 | 专题 | 公告 | 管理 | 保存 | 关闭窗口

我的问题
我参与问题
我得分问题
我的短消息
我的收藏夹

主  题:c#创建exchange邮箱问题,有代码?
作  者:towhere (天涯)
等  级:
信 誉 值:91
所属社区:.NET技术 ASP.NET
问题点数:100
回复次数:13
发表时间:2004-10-21 19:55:45
c#创建AD用户和exchange邮箱,在asp.net 方式下:有的机器上能够运行,有的不能(能够创建用户,不能创建邮箱)。在不能运行的机器上:未安装C#编程环境。:但 同样的程序以c/s win form方式能够运行。代码如下:DirectoryEntry myAD……     //创建用户,代码正确CDOEXM.IMailboxStore mailbox;mailbox = (CDOEXM.IMailboxStore)myAD.NativeObject;string HomeMDB="…";  //邮箱路径mailbox.CreateMailbox( HomeMDB );   myAD.CommitChanges();错误提示:参数不正确。 说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.ArgumentException: 参数不正确。源错误: 执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。  堆栈跟踪: [ArgumentException: 参数不正确。]CDOEXM.IMailboxStore.CreateMailbox(String HomeMDBURL) +0ADInfo.WebForm1.Button4_Click(Object sender, EventArgs e) in c:\inetpub\wwwroot\ADInfo\webform1.aspx.cs:161System.Web.UI.WebControls.Button.OnClick(EventArgs e) +108System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +57System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +18System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33System.Web.UI.Page.ProcessRequestMain() +1277--------------------------------------------------------------------------------版本信息: Microsoft .NET Framework 版本:1.1.4322.573; ASP.NET 版本:1.1.4322.573 高手指教!!!
回复人: cancersyf(fengzhimei) ( ) 信誉:88 2004-10-21 20:19:52 得分: 0
通过c#创建exchange不成功的原因有很多,如果你的AD和Exchange在一台机器上,原因有可能是HomeMDB参数不正确,或者是ASPNET帐号没有权限打开exchange帐号。而如果你的AD和Exchange不在一台机器上,使用你的代码基本上就不可能成功,这是一个bug,而我当时的解决方法就是通过com+来实现的。
Top
回复人: cancersyf(fengzhimei) ( ) 信誉:88 2004-10-21 20:38:23 得分: 0
下面我把我的实现代码给你贴出来,通过调用Com+是肯定可以实现的,首先我用vb创建了一个组件,代码如下:Dim m_ErrorInfo As StringFunction CreateCDOEXMailBox( _ByVal ADSIUserPath As String, _ByVal MDBUrl As String) As BooleanOn Error GoTo CatchErrorDim objMailbox As CDOEXM.IMailboxStoreDim objADSIuser As ActiveDs.IADsUserSet objADSIuser = GetObject(ADSIUserPath)Set objMailbox = objADSIuserobjMailbox.CreateMailbox MDBUrlobjADSIuser.SetInfoCreateCDOEXMailBox = Truem_ErrorInfo = ""Exit FunctionCatchError:CreateCDOEXMailBox = Falsem_ErrorInfo = Err.DescriptionEnd FunctionPublic Property Get errorInfo() As StringerrorInfo = m_ErrorInfoEnd Property创建成功后把组件部署到Exchange服务器上的Com+服务中,然后导出应用程序代理,把该代理安装在web服务器上。下面是C#调用Com+创建Exchange邮箱的代码:/// <summary>/// &acute;&acute;&frac12;&#168;&ETH;&Acirc;&micro;&Auml;&Oacute;&Atilde;&raquo;&#167;/// </summary>/// <param name="strLDAPPath">LDAP&Egrave;&laquo;&Acirc;&#183;&frac34;&para;</param>/// <param name="commonName">&sup1;&laquo;&sup1;&sup2;&Atilde;&ucirc;&sup3;&AElig;</param>/// <param name="sAMAccountName">&Otilde;&Ecirc;&ordm;&Aring;</param>/// <param name="password">&Atilde;&Uuml;&Acirc;&euml;</param>/// <param name="strDepartment">&sup2;&iquest;&Atilde;&Aring;</param>/// <returns><see cref="System.DirectoryServices.DirectoryEntry"/></returns>public static DirectoryEntry CreateNewUser(string strLDAPPath, string commonName, string sAMAccountName, string password,string strDepartment){DirectoryEntry deUser;try{DirectoryEntry entry = GetDirectoryObject(strLDAPPath);//获取你要在其下创建用户的DirectoryEntry对象deUser = entry.Children.Add("CN=" + sAMAccountName, "user");deUser.Properties["sAMAccountName"].Value = sAMAccountName;deUser.Properties["givenName"].Value = commonName;deUser.Properties["displayName"].Value = commonName;deUser.Properties["department"].Value = strDepartment;deUser.CommitChanges();ADHelper.EnableUserByAccount(sAMAccountName);//启用帐号deUser.Invoke("Put", new object[] {"userPrincipalName",sAMAccountName+"@"+GetShortDomain(ADDomain)});ADHelper.SetPasswordByAccount(sAMAccountName, password);//设置密码deUser.CommitChanges();bool emailAdded = CreateCDOEXMailBox(deUser.Path,ExchangeSRV,ADDomain);//调用Com+创建邮箱if (!emailAdded)//如果邮箱创建失败,则删除已经创建成功的用户{deUser.Parent.Children.Remove(deUser);deUser.CommitChanges();deUser.Close();deUser = null;}entry.Close();}catch(Exception ex){if(ex.InnerException != null){ex = ex.InnerException;}Trace.WriteLine(ex.ToString());deUser = null;}return deUser;}/// <summary>/// &acute;&acute;&frac12;&#168;&Oacute;&Ecirc;&Iuml;&auml;/// </summary>/// <param name="strADSIUserPath">&Oacute;&Atilde;&raquo;&#167;LDAP&Acirc;&#183;&frac34;&para;</param>/// <param name="strExchServer">Exchange&#183;&thorn;&Icirc;&ntilde;&AElig;&#247;&Atilde;&ucirc;</param>/// <param name="strDomainName">&Oacute;&#242;&Atilde;&ucirc;</param>private static bool CreateCDOEXMailBox(string strADSIUserPath, string strExchServer, string strDomainName){bool rv = false;try{string mdbURL = ADPath + "/" +"CN=&Oacute;&Ecirc;&Iuml;&auml;&acute;&aelig;&acute;&cent;("+ strExchServer + ")," +"CN=&micro;&Uacute;&Ograve;&raquo;&cedil;&ouml;&acute;&aelig;&acute;&cent;&#215;&#233;," +"CN=InformationStore," +"CN="+ strExchServer + "," +"CN=Servers," +"CN=&micro;&Uacute;&Ograve;&raquo;&cedil;&ouml;&sup1;&Uuml;&Agrave;&#237;&#215;&#233;," +"CN=Administrative Groups," +"CN=GWBN," + "CN=Microsoft Exchange," +"CN=Services," +"CN=Configuration," +strDomainName;Type objMailType = Type.GetTypeFromProgID("CreateMail.CreateExMail");Object objMail = Activator.CreateInstance(objMailType);Object[] myArg = {strADSIUserPath,mdbURL};object objAddStatus,objErrorInfo;objAddStatus = objMailType.InvokeMember("CreateCDOEXMailBox",BindingFlags.InvokeMethod,null,objMail,myArg);objErrorInfo = objMailType.InvokeMember("errorInfo",BindingFlags.GetProperty, null, objMail, new object[]{});rv = true;}catch(Exception ex){if(ex.InnerException != null){ex = ex.InnerException;}Trace.WriteLine(ex.ToString());}return rv;}/// <summary>/// 创建邮箱/// </summary>/// <param name="strADSIUserPath">用户LDAP路径</param>/// <param name="strExchServer">Exchange服务器名</param>/// <param name="strDomainName">域名</param>private static bool CreateCDOEXMailBox(string strADSIUserPath, string strExchServer, string strDomainName){bool rv = false;try{string mdbURL = ADPath + "/" +"CN=邮箱存储("+ strExchServer + ")," +"CN=第一个存储组," +"CN=InformationStore," +"CN="+ strExchServer + "," +"CN=Servers," +"CN=第一个管理组," +"CN=Administrative Groups," +"CN=GWBN," + "CN=Microsoft Exchange," +"CN=Services," +"CN=Configuration," +strDomainName;Type objMailType = Type.GetTypeFromProgID("CreateMail.CreateExMail");Object objMail = Activator.CreateInstance(objMailType);Object[] myArg = {strADSIUserPath,mdbURL};object objAddStatus,objErrorInfo;objAddStatus = objMailType.InvokeMember("CreateCDOEXMailBox",BindingFlags.InvokeMethod,null,objMail,myArg);objErrorInfo = objMailType.InvokeMember("errorInfo",BindingFlags.GetProperty, null, objMail, new object[]{});rv = true;}catch(Exception ex){if(ex.InnerException != null){ex = ex.InnerException;}Trace.WriteLine(ex.ToString());}return rv;}注意如果你使用的exchange2003,则mdbURL不需改变,如果不是,则mdbURL变量你需要改一下。这么做肯定是能成功的,如果有什么问题,可以和我联系。
Top
回复人: towhereto() ( ) 信誉:95 2004-10-21 20:41:28 得分: 0
现在情况:AD 和 exchange在一台机器上,我的代码用 非b/s 方式能够运行,在b/s方式下,能够创建用户,但不能创建邮箱?  ASPNET帐号没有权限打开exchange帐号:是用管理员用户在b/s 下,是否与 HomeMDB 字符串或web.config设置有关系?
Top
回复人: cancersyf(fengzhimei) ( ) 信誉:88 2004-10-21 20:43:32 得分: 0
第一个函数怎么有乱码,重新贴一下:/// <summary>/// 创建新的用户/// </summary>/// <param name="strLDAPPath">LDAP全路径</param>/// <param name="commonName">公共名称</param>/// <param name="sAMAccountName">帐号</param>/// <param name="password">密码</param>/// <param name="strDepartment">部门</param>/// <returns><see cref="System.DirectoryServices.DirectoryEntry"/></returns>public static DirectoryEntry CreateNewUser(string strLDAPPath, string commonName, string sAMAccountName, string password,string strDepartment){DirectoryEntry deUser;try{DirectoryEntry entry = GetDirectoryObject(strLDAPPath);//获取你要在其下创建用户的DirectoryEntry对象deUser = entry.Children.Add("CN=" + sAMAccountName, "user");deUser.Properties["sAMAccountName"].Value = sAMAccountName;deUser.Properties["givenName"].Value = commonName;deUser.Properties["displayName"].Value = commonName;deUser.Properties["department"].Value = strDepartment;deUser.CommitChanges();ADHelper.EnableUserByAccount(sAMAccountName);//启用帐号deUser.Invoke("Put", new object[] {"userPrincipalName",sAMAccountName+"@"+GetShortDomain(ADDomain)});ADHelper.SetPasswordByAccount(sAMAccountName, password);//设置密码deUser.CommitChanges();bool emailAdded = CreateCDOEXMailBox(deUser.Path,ExchangeSRV,ADDomain);//调用Com+创建邮箱if (!emailAdded)//如果邮箱创建失败,则删除已经创建成功的用户{deUser.Parent.Children.Remove(deUser);deUser.CommitChanges();deUser.Close();deUser = null;}entry.Close();}catch(Exception ex){if(ex.InnerException != null){ex = ex.InnerException;}Trace.WriteLine(ex.ToString());deUser = null;}return deUser;}
Top
回复人: cancersyf(fengzhimei) ( ) 信誉:88 2004-10-21 20:45:42 得分: 0
你是用的域管理员帐号吗?
Top
回复人: cancersyf(fengzhimei) ( ) 信誉:88 2004-10-21 20:47:18 得分: 0
我第一个回复有些问题,应该是web服务器和exchange服务器是否在同一台机器上。
Top
回复人: cancersyf(fengzhimei) ( ) 信誉:88 2004-10-21 20:48:19 得分: 0
另外,如果你的web服务器和exchange服务器不是在同一台机器上,则需要在web服务器上安装exchange管理工具。
Top
回复人: towhereto() ( ) 信誉:95 2004-10-21 20:49:25 得分: 0
Top
回复人: cancersyf(fengzhimei) ( ) 信誉:88 2004-10-21 20:50:23 得分: 0
在我实际项目中,如果web服务器和exchange服务器不是在同一台机器上,即时配置了使用域管理员的模拟帐号,创建也不会成功。
Top
回复人: cancersyf(fengzhimei) ( ) 信誉:88 2004-10-21 20:52:04 得分: 0
你所说的有的机器上可以,有的机器上不可以,那么这两台机器环境有差异吗?
Top
回复人: towhereto() ( ) 信誉:95 2004-10-21 20:54:57 得分: 0
在我的开发机器上:win2003+AD + exchange2004 + .net + IIS  能够运行但把代码放到公司的 web 服务器上:win2003+AD + exchange2003 + .net framework +IIS 就出现这样的错误,太郁闷了!
Top
回复人: towhereto() ( ) 信誉:95 2004-10-21 20:57:47 得分: 0
在我的开发机器上:win2003+AD + exchange2003 + .net + IIS  能够运行
Top
回复人: cancersyf(fengzhimei) ( ) 信誉:88 2004-10-21 21:03:48 得分: 0
实在不行,你就使用Com+来做吧,这里面的问题有些比较怪异,你现在web、AD及exchange都在一台机器上,这样能测试成功,但是到实际部署的时候往往会出现问题,因为实际环境可能使用的负载均衡,我在以前的项目中就遇到这样的问题,吃了不少苦头,导致在客户现场调试了好几天。
Top


 
   

管理 | 关闭窗口


网站简介 - 广告服务 - 网站地图 - 帮助信息 - 联系方式
百联美达美公司 版权所有 京ICP证020026号
Copyright &#169; CSDN.net, Inc. All rights reserved

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-112052-1-1.html 上篇帖子: 调用Exchange收发邮件(无组件收发) 下篇帖子: OutLook中添加Exchange失败问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表