如何编写LDAP查询来testing用户是否是组的成员?
我想编写一个LDAP查询来testing用户(sAMAccountName)是否是特定组的成员。 是否有可能这样做,我得到0或1个结果logging?
我想我可以得到用户的所有组,并testing每一个匹配,但我想知道如果我可以打包到一个LDAPexpression式。
有任何想法吗?
谢谢
你应该可以在这里用这个filter创build一个查询:
(&(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"); }
谨慎的说法:这只会testing即时群组成员资格,并且不会在您的域中testing所谓的“主要群组”(通常是“cn = Users”)的成员身份。 它不处理嵌套成员资格,例如用户A是组B的成员的组A的成员 – 事实上,用户A实际上是组B的成员,也没有在这里得到体现。
渣子
如果您正在使用Linux服务器上常见的OpenLDAP(即slapd),则必须启用叠加成员才能使用(memberOf = XXX)属性匹配filter。
另外,一旦启用覆盖,它不会更新现有组的memberOf属性(您将需要删除现有组并将其重新添加)。 如果你启用覆盖开始,当数据库是空的,那么你应该没问题。
我会在Marc的答案中再增加一个:memberOf属性不能包含通配符,所以你不能说“memberof = CN = SPS *”,并期望它find所有以“SPS”开头的组。
您必须将您的查询基础设置为相关用户的DN,然后将您的filter设置为您想知道他们是否为其成员的组的DN。 要查看jdoe是否是办公室组的成员,那么您的查询将如下所示:
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)'
如果你想看到他所属的所有组,只要在你的search中只要求'memberof'属性就可以了,如下所示:
ldapsearch -x -D "ldap_user" -w "user_passwd" -b "cn=jdoe,dc=example,dc=local" -h ldap_host **memberof**