使用远程服务器上的LdapConnection类连接到Active Directory

时间:2016-09-13 22:26:13

标签: c# .net active-directory ldap ldap-query

我遇到了一个问题:我需要从远程服务器连接到Active Directory,但代码必须使用LdapConnection类。我需要这个,因为这样我只能在某些事件发生时测试更改通知程序(例如用户被停用或他更改了组,数据等)。远程服务器上的操作系统是Windows Server 2012.

我设法使用DirectoryServices使用以下代码从本地执行此操作:

String ldapPath = "LDAP://XRMSERVER02.a24xrmdomain.info";
directoryEntry = new DirectoryEntry(ldapPath, @"A24XRMDOMAIN\username", "pass");

//// Search AD to see if the user already exists.
DirectorySearcher search = new DirectorySearcher(directoryEntry);
search.Filter = "(&(objectClass=user))";
SearchResult result = search.FindOne();

这没关系,连接正常,但现在我需要使用LdapConnection类进行连接。

我在很多方面尝试过这样的事情,但这些都没有帮助我:

LdapConnection connection = new LdapConnection(XRMSERVER02.a24xrmdomain.info);
var credentials = new NetworkCredential(@"A24XRMDOMAIN\username", "pass");             
connection.Credential = credentials;
connection.Bind();

它说凭证无效,但事实并非如此。

解释:

  • XRMSERVER02 - 域控制器
  • a24xrmdomain.info - 域
  • A24XRMDOMAIN - 用于记录的域

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

尝试使用带有3个参数的NetworkCredential构造函数:用户名,密码和域。与用户名分开指定域

答案 1 :(得分:0)

即使我解决了我的问题,我想与其他开发者分享到目前为止我所取得的成就。我遇到的问题是我有远程服务器,其中包含操作系统Windows server 2012和Active目录。我需要通过我的本地机器(Windows 10)连接他。  正如我在我的问题中所述,可以通过DirectoryServices使用以下代码执行此操作:

String ldapPath = "LDAP://(DomainController).a24xrmdomain.info";
directoryEntry = new DirectoryEntry(ldapPath, @"DOMAIN\username","pass");

//// Test search on AD to see if connection works.
DirectorySearcher search = new DirectorySearcher(directoryEntry);
search.Filter = "(&(objectClass=user))";
SearchResult result = search.FindOne();

这是其中一个解决方案,但由于我的任务是获取通知并确定Active Directory中某个对象何时发生更改,因此我需要通过LDAP类连接到远程服务器上的Active Directory。获取通知人的代码取自: - Registering change notification with Active Directory using C#

我通过下一个代码成功连接LDAP课程:

String ldapPath2 = "(DomainController).a24xrmdomain.info";
LdapConnection connection = new LdapConnection(ldapPath2);
var credentials = new NetworkCredential(@"username", "pass");             
connection.Credential = credentials;
connection.Bind();

想要提及的是,不需要远程服务器的IP地址,只需要在他身上使用的域控制器,以及用于记录的域名是不必要的。

快乐编码