我想编写一个LDAP查询,用于测试用户(sAMAccountName)是否是特定组的成员。是否可以这样做,以便得到0或1个结果记录?
我想我可以为用户获取所有组并测试每个组的匹配,但我想知道是否可以将其打包到一个LDAP表达式中。
有什么想法吗?
由于
答案 0 :(得分:155)
您应该可以在此处使用此过滤器创建查询:
(&(objectClass=user)(sAMAccountName=yourUserName)
(memberof=CN=YourGroup,OU=Users,DC=YourDomain,DC=com))
当您针对LDAP服务器运行时,如果您得到结果,您的用户“yourUserName”确实是“CN = YourGroup,OU = Users,DC = YourDomain,DC = com
试试看是否有效!
如果你使用C#/ VB.Net和System.DirectoryServices,这个代码片段可以解决这个问题:
DirectoryEntry rootEntry = new DirectoryEntry("LDAP://dc=yourcompany,dc=com");
DirectorySearcher srch = new DirectorySearcher(rootEntry);
srch.SearchScope = SearchScope.Subtree;
srch.Filter = "(&(objectClass=user)(sAMAccountName=yourusername)(memberOf=CN=yourgroup,OU=yourOU,DC=yourcompany,DC=com))";
SearchResultCollection res = srch.FindAll();
if(res == null || res.Count <= 0) {
Console.WriteLine("This user is *NOT* member of that group");
} else {
Console.WriteLine("This user is INDEED a member of that group");
}
提醒:这只会测试直接的群组成员资格,并且不会测试您所在域中所谓的“主要群组”(通常为“cn =用户”)的成员身份。它不处理嵌套的成员资格,例如用户A是A组的成员,该组是B组的成员 - 事实上用户A实际上是B组的成员,但这里没有反映出来。
马克
答案 1 :(得分:33)
如果您使用的是Linux服务器上常见的OpenLDAP(即slapd),则必须启用memberof overlay才能使用(memberOf = XXX)属性与过滤器匹配。
此外,一旦启用了叠加层,它就不会更新现有组的memberOf属性(您需要删除现有的组并重新添加它们)。如果您启用了覆盖,那么当数据库为空时,您应该没问题。
答案 2 :(得分:18)
我还要向Marc的答案添加一个:memberOf属性不能包含通配符,所以你不能说“memberof = CN = SPS *”之类的东西,并期望它找到所有以“ SPS”。
答案 3 :(得分:10)
您必须将查询库设置为相关用户的DN,然后将过滤器设置为您想知道他们是否是其成员的组的DN。要查看jdoe是否是office组的成员,那么您的查询将如下所示:
ldapsearch -x -D "ldap_user" -w "user_passwd" -b "cn=jdoe,dc=example,dc=local" -h ldap_host '(memberof=cn=officegroup,dc=example,dc=local)'
如果您想查看他所属的所有群组,只需在搜索中仅请求“memberof”属性,例如:
ldapsearch -x -D "ldap_user" -w "user_passwd" -b "cn=jdoe,dc=example,dc=local" -h ldap_host **memberof**