我知道之前已经问过这个问题,我为打开另一个问题而道歉,但是我在线阅读的所有解决方案都没有解决我遇到的问题。由于最好的原因没有说明,我需要在接下来的三天内完成这项工作。我之前只使用过一次LDAP,我这里没有人可以帮助我(甚至不是管理员)。
以下是我正在尝试的基本代码:
DirectoryEntry rootEntry = new DirectoryEntry("LDAP://serverName.dev.domain.com:portNumber/o-domain,o=dxc.com","uid=userName,ou=bindids,o=domain,o=dcx.com", "password", AuthenticationTypes.None);
DirectorySearcher dSearch = new DirectorySearcher(rootEntry);
try
{
foreach (SearchResult result in dSearch.FindAll())
等。这在dSearch.FindAll()行
上失败我此时没有编写查询(建议/语法就是AWESEOME)因为我不知道从目录中撤回需要什么值。管理员告诉我,这不是Active Directory。
当我删除AuthenticationTypes时,我得到一个不同的错误,说我有一个未知的用户名或密码错误。我的管理员检查了两个并向我保证他们的工作。他甚至重置密码,以防它是保留字符问题。
我们非常感谢您提供的任何帮助或想法。我已经在这里工作了大约12个小时,我的大脑已经疲惫不堪。
编辑:这是完整的错误
@Alexanderius - 感谢您提供替代格式。有了这个,我得到一个COMException:服务器不可操作。
@ X3074861X - 这是一个Oracle Directory Server(又名SUN One Directory Server)。
编辑:我稍微修改了我的代码。 (将o-Domain更改为o = Domain并添加了不同的查询)。现在我得到一个COMException:“服务器上没有这样的对象”。
DirectoryEntry rootEntry = new DirectoryEntry("LDAP://ServerName.Domain.com:2394/o=Domanin,o=dxc.com",
"uid=UserName,ou=bindids,o=Domain,o=dcx.com", "Password", AuthenticationTypes.None);
DirectorySearcher dSearch = new DirectorySearcher(rootEntry);
dSearch.Filter = "uid=" + "AUser";
dSearch.SizeLimit = 100;
dSearch.SearchScope = SearchScope.Subtree;
try
{
SearchResult newTest = dSearch.FindOne();
ETC。
更新:还有一个我没有注意到的错误!在绑定语句之后,当我将鼠标悬停在“rootEntry”上时,我看到它有一个'System.Runtime.InteropServices.COMException:未指定的错误\ r \ n“。这对我没有帮助,但也许你们其中一个人见过它之前呢?
答案 0 :(得分:1)
我正在连接到我的AD:
DirectoryEntry = new DirectoryEntry("LDAP://Myserver/MyRootEntry,dc=MyDomainName,dc=net", "SomeUserName", "SomeUserPassword", AuthenticationTypes.Secure);
我的服务器名称是: myserver.mydomain.net
尝试连接。
答案 1 :(得分:0)
我一直在使用这个实现来验证iPlanet的顾客,iPlanet是从SUN堆栈构建的,所以它也应该对Oracle Directory服务器起作用。对于自定义和一些较低级别的细节,我是System.DirectoryServices
和System.DirectoryServices.Protocols
库的忠实粉丝,特别是在使用非AD目录服务器时:
// build your server name - we'll use 'serverName.dev.domain.com' and port 389
var BuildServerName = new StringBuilder();
BuildServerName.Append("serverName.dev.domain.com");
BuildServerName.Append(":" + Convert.ToString(389));
// setup an ldapconnection to that endpoint
var ldapConnection = new LdapConnection(BuildServerName.ToString());
现在我们需要详细介绍一下这种连接的一些信息:
// it looks like you have an administrative account to bind with, so use that here
var networkCredential = new NetworkCredential("userName", "password", "dc=MyDomainName,dc=net");
// set the following to true if it's over ssl (636), if not just set it to false
ldapConnection.SessionOptions.SecureSocketLayer = SSL;
ldapConnection.SessionOptions.VerifyServerCertificate += delegate { return true; };
// now set your auth type - I typically use 'negotiate' over LDAPS, and `simple` over LDAP
// for this example we'll just say you're not using LDAPS
ldapConnection.AuthType = AuthType.Basic;
ldapConnection.Bind(networkCredential);
现在您应该绑定到该目录,这意味着您可以使用SearchRequest
对象进行搜索。以下是我如何使用它的示例:
// setup a new search request
var findThem = new SearchRequest();
findThem.Filter = "This is where you need to construct a filter for what you're looking for"
findThem.Scope = System.DirectoryServices.Protocols.SearchScope.Subtree;
// we'll execute a search using the binded administrative user
var searchresults = (SearchResponse) ldapConnection.SendRequest(findThem);
// this will contain entries if your search filter returned any results
if(searchresults.Entries.Count >= 1)
{
// here are your list of returned entries
SearchResultEntryCollection entries = searchresults.Entries;
// do some work\extraction on them
}
这里的最后一部分是您的实际LDAP过滤器。如果您想在自己的域内搜索uid
userName
的用户,则您的过滤器将为:
findthem.Filter = "(uid=username)";
如果您想将objectClass
与特定属性结合起来,您可以这样做:
findthem.Filter = "(&(objectClass=user)(uid=username))";
这里有一些关于过滤的好链接: