背景:公司里有eHR系统,有网域,IBM Lotus Notes邮件系统,新人入职会在eHR系统里提前建好档案,网域帐号、邮箱帐号均会在入职前提前建好,因为邮箱帐号是晚于eHR建档的,因此在eHR建档时邮箱地址都是没有维护的,即使有维护,也可能维护是员工的个人邮箱,需要统一维护成公司的邮箱地址。
公司人资部虽然有要求员工自行维护个人信息,包括邮箱地址,但是收效甚微,因此才想到能否实现从LDAP中直接获取邮箱地址信息并与eHR同步?
我咨询了一下公司的邮件系统负责人,Notes有没有接口可以查到每个人的邮箱,他说应该是可以的,因为反垃圾邮件系统就设过,里面有设服务器和端口,既然反垃圾邮箱系统可以从Notes里获邮箱地址,其他系统应该也可以。
接下来就搜索C#访问LDAP,这方面的资料还算不少,网上找一找,很容易写,大致就是以下几行,查询的结果就在result变量里。
DirectoryEntry directoryEntry = new DirectoryEntry("LDAP://ip:port", @"user", "password", AuthenticationTypes.Anonymous); DirectorySearcher searcher = new DirectorySearcher(directoryEntry) { Asynchronous = false, CacheResults = false, ClientTimeout = new TimeSpan(0, 0, 1), Filter = "((cn=" + empName + "))" }; searcher.PropertiesToLoad.AddRange(new[] { "cn", "sn", "displayName", "mail", "department", "company" }); SearchResultCollection result = searcher.FindAll();
有几个地方需要注意
1、LDAP后面的地址错误,会提示”该服务器不可操作“
2、验证方式不对,会提示”出现了一个协议错误"或者“该服务器不可操作”,我选的是AuthenticationTypes.Anonymous匿名方式,这种方式用户名和密码是可以不用输的。
3、Filter就是要查找的条件了,怎么写这个条件,可以下载一款软件,LDAPSoft LDAP Browser,用这个就可以很清楚的看到公司 LDAP的层次架构,知道该如何下条件了。
以上代码在测试工程中调试,很快就成功了,接下来将此段代码封装成web service,然后就利用上一章节所讲的Sql Server里Call Web service的技术,写一个Job,循环获取公司里邮箱为空或者非公司邮箱地址的人员,调用该接口实现同步,这样就能实现eHR同LDAP的邮箱地址同步了。
因为公司里会有员工同名的问题,Notes里是可以将工号输入进去的,因为工号是唯一的,按工号找邮箱地址就会非常准确了。
在用.net写web service时,访问时报错,提示“因 URL 意外地以“/****”结束,请求格式无法识别。”,这个错误只要在web.config配置下就可以了
web.config文件中的 <system.web> 节点下加入:
<webServices>
<protocols>
<add name= "HttpPost"/>
<add name= "HttpGet"/>
</protocols>
</webServices>
不过这段落是有风险的,如果是查询的Web Service还好,但是如果是更新或删除类的web service,被人知道后可以随意操作乱改你的数据。