这几天也被CDOEXM狠狠折磨了一把,按照下面MSDN的标准方法,添加鸟对CDOEXM的引用,而且俺的cdo.dll,cdoexm.dll都是exchange 2000工作服务器上copy下来的,然后用下面MSDN提供的代码,报错,始终报错,一条道走到黑的报错!说是: System.Runtime.InteropServices.COMException (0x80072030): 在服务器上没有这样一个对象。
mailbox = (IMailboxStore)user.NativeObject;
mailbox.CreateMailbox(homeMDB);
user.CommitChanges();
我可以确定我的homeMDB扩展属性值绝对不会错,因为那是用微软自家windows系统的vbs脚本直接导出到文本文件的,vbs脚本如下,后面还要用它导出homeMTA和msExchHomeServerName
strBranchName="OU名1,OU=OU名0,OU=公司OU名" '上面的几层路径的ou下面只有一个有邮箱的user strDC="gdmailclus1" 'IIS服务器名 strDomain="DC=mail,DC=xxxx" 'AD服务器DN strLDAP="<LDAP://"+strDC+"/OU="+strBranchName+","+strDomain+">" Set oLDAPConn = CreateObject("AdoDB.Connection") oLDAPConn.Provider = "AdsDSOObject" oLDAPConn.open Set oCmd = CreateObject("AdoDB.Command") oCmd.ActiveConnection = oLDAPConn oCmd.CommandText = strLDAP+";(objectCategory=Person);DistinguishedName,mail;SubTree" Set oResult = oCmd.Execute Set fso = Wscript.CreateObject("Scripting.FileSystemObject") Set f = fso.CreateTextFile("C:/Documents and Settings/szadmin/桌面/homeMDB.txt") strGetUser="LDAP://"+strDC+"/"+oResult.Fields(0) Set oUser = GetObject(strGetUser) 'wscript.echo strGetUser+vbcrlf+"name:"+oUser.name+vbcrlf+"sAMAccountName:"+oUser.sAMAccountName+vbcrlf+"serverName:"+oUser.serverName+vbcrlf+"Mail:"+oUser.Mail f.WriteLine(oUser.homeMDB) 'wscript.echo oUser.homeMDB 'wscript.echo oUser.homeMTA 'wscript.echo oUser.mailNickName 'wscript.echo oUser.msExchUserAccountControl 'wscript.echo oUser.msExchHomeServerName 'wscript.echo oUser.mDBUseDefaults 'wscript.echo oUser.mail f.close |
而且,我又没法在exchange工作服务器上装开发环境,没法调试,只好上网找方法了。后来在网上终于搜到,原来CDOEXM在C#下就是不好用,有转换那一步出错的,调了VB.net的一个getobject可方法就ok,也有像我一样的问题的,说是要整个改成VB.net就好了。
天呢,我至此彻底晕倒,对微软的佩服再次上升鸟一层,都是自家的东东能搞成这样。。
幸好后来在一个跟帖里头找到了方法,原来根本不需要CDOEXM这个烂东东就可以完成建exchange邮箱的工作,直接写几个AD扩展属性就可以鸟,代码如下:
user.Properties["homeMDB"].Value=homeMDB; user.Properties["homeMTA"].Value=homeMTA; user.Properties["mailNickName"].Add(dr["UserID"].ToString()); user.Properties["msExchUserAccountControl"].Add(0); user.Properties["msExchHomeServerName"].Add("/o=MAIL001/ou=mailadmin/cn=Configuration/cn=Servers/cn=Mail-SERVER"); user.Properties["mDBUseDefaults"].Add("TRUE"); user.CommitChanges();
|
user是一个你找到的DirectoryEntry对象实例,dr是输入的数据集中的一个DataRow
homeMDB、homeMTA和msExchHomeServerName可以用上面的vbs脚本从服务器获得,脚本中的strBranchName改成适合你的
我的这三个参数如下供参考:
private string homeMDB = "CN=BE-SG2-MDB1,CN=GDMAIL-SG2,CN=InformationStore,CN=GDMAILEXCH,CN=Servers,CN=第一个管理组,CN=Administrative Groups,CN=xxxxORG,CN=Microsoft Exchange,CN=Services,CN=Configuration,DC=mail,DC=xxxx"; private string homeMTA = "CN=Microsoft MTA,CN=GDMAILEXCH,CN=Servers,CN=第一个管理组,CN=Administrative Groups,CN=xxxxORG,CN=Microsoft Exchange,CN=Services,CN=Configuration,DC=mail,DC=xxxx"; private string msExchHomeServerName = "/o=GMCCORG/ou=GDMAILEXAG/cn=Configuration/cn=Servers/cn=GDMAILEXCH"; |
试过在我们的工作环境下不能同时写mail属性,会引发约束冲突异常,所以,之后要通过另外一个vbs脚本批量改下默认邮件地址就可以。
改默认邮件地址的VBS:
strBranchName="深圳分公司" strBranchDomain="sz." strAll="gd.xxxx.com" strDC="gdmailclus1" strDomain="DC=mail,DC=xxxx" strLDAP="<LDAP://"+strDC+"/OU="+strBranchName+","+strDomain+">" Set oLDAPConn = CreateObject("AdoDB.Connection") oLDAPConn.Provider = "AdsDSOObject" oLDAPConn.open Set oCmd = CreateObject("AdoDB.Command") oCmd.ActiveConnection = oLDAPConn oCmd.CommandText = strLDAP+";(objectCategory=Person);DistinguishedName,mail;SubTree" Set oResult = oCmd.Execute wscript.echo oResult.Recordcount while not oResult.EOF strGetUser="LDAP://"+strDC+"/"+oResult.Fields(0) Set oUser = GetObject(strGetUser) 'wscript.echo oUser.name OldMail=oUser.mail If (Len(OldMail)>0) Then OldPrimaryEmail=Join(oUser.proxyAddresses,"!") iNotChange=inStr(OldPrimaryEmail,"SMTP:"+oUser.samAccountName+"@"+strBranchDomain+strAll) If (iNotChange=0) Then OldPrimaryEmail=Replace(OldPrimaryEmail,"SMTP:","smtp:") OldPrimaryEmail=Replace(OldPrimaryEmail,"smtp:"+oUser.samAccountName+"@"+strBranchDomain+strAll,"SMTP:"+oUser.samAccountName+"@"+strBranchDomain+strAll) Newmail=oUser.samAccountName+"@"+strBranchDomain+strAll 'wscript.echo "mail-:"+ NewMail 'wscript.echo "proxy-:"+oldPrimaryEmail strProxy=Split(OldPrimaryEmail,"!") oUser.msExchPoliciesExcluded="{26491CFC-9E50-4857-861B-0CB8DF22B5D7}" ' oUser.msExchPoliciesExcluded=VBNull oUser.Mail=Newmail oUser.ProxyAddresses=strProxy oUser.SetInfo End If End If oResult.MoveNext Wend wscript.echo "done" |
至此搞定,以后建exchange邮箱,让CDOEXM见鬼去吧!