我正在尝试搜索在搜索请求中提供管理员用户名的活动目录用户,但无论经理的用户名是什么,我总是得到0条记录。
为此,我执行了以下LDAP查询:
(manager=sAMAccountName=Administrator)
我也尝试过经理的通用名字:
(manager=cn=John Smith)
有人可以给我写一个LDAP查询,该查询返回经理的sAMAccountName = administrator的所有用户吗?
答案 0 :(得分:1)
manager
具有可分辨的名称语法,因此,如果在断言中使用manager
,则必须将完整DN用作值。您提供的示例都不符合此标准。您必须更正过滤器以使用专有名称。
经理的语法:
attributeTypes: ( 0.9.2342.19200300.100.1.10 NAME 'manager'
EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12
X-ORIGIN 'RFC 4524' )
要确定语法,请使用LDAP Parameters Assignment页面。在该页面上,按照SYNTAX
关键字(1.3.6.1.4.1.1466.115.121.1.12
)搜索OID。这表明它是DN语法。此外,EQUALITY
匹配规则为distinguishedNameMatch
。
使用正确语法在过滤器中断言的示例:
manager=cn=Manager Number One,ou=managers,ou=people,dc=example,dc=com
断言中使用的所有属性值必须具有为架构中的该属性类型定义的语法。
使用已知良好的工具(例如ldapsearch
)验证条目是否存在,以确保搜索请求的参数已知正确。例如:
$ ldapsearch -h hostname -p port -b 'dc=sahara,dc=local' \
-D [your-bind-dn] -w [your-bind-dn-password] \
-s sub \
'(manager=cn=Izzeddeen Alkarajeh,ou=managers,ou=people,dc=sahara,dc=local)' \
1.1
如果此搜索未返回任何条目,请与LDAP管理员联系以确保正在使用的BIND DN具有读取这些条目的权限。
答案 1 :(得分:0)
我知道这已经过时了,但我想出了一种在C#中做到这一点的方法,我还没有在stackoverflow上找到它。
using (var pc = new PrincipalContext(ContextType.Domain, "yourdomain.com"))
using (var user = UserPrincipal.FindByIdentity(pc, IdentityType.SamAccountName, "samAccountName"))
{
DirectoryEntry de = (DirectoryEntry)user.GetUnderlyingObject();
if (de.Properties["directReports"].Count != 0)
managedFound = de.Properties["directReports"];
}
这将为您提供一个字符串列表,然后您可以使用此解析CN
:
managedUserName = Regex.Match(managedFound.ToString(), @"CN[=].*?[,]").Value.Replace("CN=", "").Replace(",", "");
然后,以下内容获取用户属性:
UserPrincipal managedUser = UserPrincipal.FindByIdentity(pc, IdentityType.Name, managedUserName);