c#创建exchange邮箱问题 登 录.. [注 册] 忘记密码 注销登录 csdn.net 首 页 | 第二书店 | 社 区 | 专 题 | 精 华 | 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) +0 ADInfo.WebForm1.Button4_Click(Object sender, EventArgs e) in c:\inetpub\wwwroot\ADInfo\webform1.aspx.cs:161 System.Web.UI.WebControls.Button.OnClick(EventArgs e) +108 System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +57 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +18 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33 System.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 String Function CreateCDOEXMailBox( _ ByVal ADSIUserPath As String, _ ByVal MDBUrl As String) As Boolean On Error GoTo CatchError Dim objMailbox As CDOEXM.IMailboxStore Dim objADSIuser As ActiveDs.IADsUser Set objADSIuser = GetObject(ADSIUserPath) Set objMailbox = objADSIuser objMailbox.CreateMailbox MDBUrl objADSIuser.SetInfo CreateCDOEXMailBox = True m_ErrorInfo = "" Exit Function CatchError: CreateCDOEXMailBox = False m_ErrorInfo = Err.Description End Function Public Property Get errorInfo() As String errorInfo = m_ErrorInfo End Property 创建成功后把组件部署到Exchange服务器上的Com+服务中,然后导出应用程序代理,把该代理安装在web服务器上。下面是C#调用Com+创建Exchange邮箱的代码: /// <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; } /// <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; } /// <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 © CSDN.net, Inc. All rights reserved 相关文章: