我正在尝试使用 LDAP ( DirectorySearcher class
) 列出位于域内组织单位中的所有用户。
我要连接的域不是当前域,我要查看的 OU 位于非常深的路径中,其中一些 OU 名称在其他地方重复,例如:
我可以使用以下代码列出域中的所有用户:
// Build the directory entry
var directoryEntry = new DirectoryEntry(_ldapServer, _domain + "\\" +
_systemUser, _systemPassword);
try
{
// Bind to the native AdsObject to force authentication of the system user.
// It will throw an exception if this is an invalid account
object obj = directoryEntry.NativeObject;
}
catch (Exception ex)
{
throw new Exception("Error authenticating system user. " + ex.Message, ex);
}
// create a directory searcher for that OU
DirectorySearcher users = new DirectorySearcher(directoryEntry);
// set the filter to get just the users
users.Filter = "(&(objectClass=user)(objectCategory=Person))";
// add the attributes you want to grab from the search
users.PropertiesToLoad.Add("givenName");
users.PropertiesToLoad.Add("sn");
users.PropertiesToLoad.Add("mail");
users.PropertiesToLoad.Add("name");
// grab the users and do whatever you need to do with them
var allFound = users.FindAll();
foreach (SearchResult oResult in allFound)
{
// etc
}
这有效,并抓取了位于根(域)中的所有用户的巨大列表。但是,我希望获取特定 OU 下的用户。
我尝试了以下行:
var directoryEntry = new DirectoryEntry(_ldapServer +
"/ou=MyCompany/Clients/Contoso/Financial Site/Financial Services/Users",
_domain + "\\" + _systemUser, _systemPassword);
我收到错误:验证系统用户时出错。发生操作错误。有谁知道我如何在我感兴趣的 OU 的
DirectorySearcher
中更具体?解决了!
最终路径字符串(对于我的示例)应如下所示(不带换行符):
LDAP://DomainControllerServer/OU=Users,OU=Financial Services,
OU=金融网站,OU=Contoso,OU=客户,OU=MyCompany,
DC=我的域,DC=本地
DomainControllerServer = 在我的例子中的 IP 地址。
-- FQDN: MyDomain.LOCAL - 句点分隔成 DC={part} 列表
|-- OU: 我的公司
|-- OU:客户
|-- OU:Contoso
|-- OU:金融网站
|-- OU:金融服务
|-- OU:用户
请记住使用反斜杠 (
\
) 转义无效字符,例如以下任何一项: + , \ = /
。这是一场噩梦,但谢天谢地,它现在起作用了。
最佳答案
您为用户 OU 提供的路径不是有效的 LDAP 路径。与您输入的文件系统路径或网络路径相比,LDAP 路径的构建方向相反。您的路径可能如下所示:
ou=用户,ou=金融服务,ou=金融网站,ou=Contoso,ou=客户,dc=MyCompany
前缀非常重要(即 ou= 或 dc=),如果任何对象属于不同的类,我提供的路径可能不正确。
我建议在原始代码示例的循环内,打印 oResult.Path 并复制粘贴所需的路径。这样就不会在构建 LDAP 路径时出错。
关于c# - LDAP:枚举组织单位用户,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3334041/