当我在CentOS 6.4的bash提示符下执行此操作时
ldapsearch -LLL -H ldap://adserver.example.com -x -D [email protected] -w somepass -b 'OU=Users,DC=example,DC=com' '(&(objectClass=person)(sAMAccountName=testuser))'
我明白了
dn: CN=TestUser Surname,OU=Area,OU=Users,DC=example,DC=com ... objectClass: person ... cn: TestUser Surname sn: Surname ... distinguishedName: CN=TestUser Surname,OU=Area,OU=Users,DC=example,DC=com ... memberOf: CN=Group1,OU=Area,OU=Users,DC=example,DC=com memberOf: CN=Gropu2,OU=Users,DC=example,DC=com ... sAMAccountName: testuser
只有在testuser属于名为X的组时,我才想得到响应,而不pipe组X在AD层次结构中的位置。 例如:我想要一个叫做testuser的用户的数据,它是一个名为Group1的组的成员。
我曾尝试更改filter:
无济于事。
您可以从上面的输出中看到,testuser属于组
当我使用filter'(&(objectClass = person)(sAMAccountName = testuser)(memberOf = CN = Group1,OU = Area,OU = Users,DC = example,DC = com))'它工作,但我需要仅使用组名查询(不使用完整的“path”)。
有没有办法做到这一点?
我正在尝试这样做,因为我需要使用Active Directory定义的组作为squid(linux代理)ACL。 要做到这一点,我需要定义一个外部ACLtypes,如
external_acl_type ADGroup %LOGIN /usr/lib64/squid/squid_ldap_group -R -b "OU=Users,DC=example,DC=com" -D [email protected] -w somepass -f "(&(objectclass=person)(sAMAccountName=%u)(memberof=CN=%g,OU=Users,DC=example,DC=com))" -h adserver.example.com
然后使用该types来定义这样的ACL
acl ADGroup_Group1 external ADGroup Group1 acl ADGroup_Group2 external ADGroup Group2 ... http_access allow ADGroup_Group1; http_access deny ADGroup_Group2;
当squid检查这个“允许”时,它会用%u用用户login名和%greplaceACL(Group1,Group2)中定义的组名,然后进行LDAP查询。
正如你可以从上面看到“http_access allow ADGroup_Group1;” 将按预期工作,但“http_access拒绝ADGroup_Group2;” 将不起作用,因为Group1和Group2的父OU是不同的。
所以我有3个select:
不幸的是, LDAP对象的通用名称不是全局唯一的; 它只是相对于其父OU而言是唯一的。 所以,如果你可以问一个用户是否是一个组的成员,根据一个组的CN,你可能会得到多个结果。
正是由于这个原因,用户对象的memberOf属性是一个DN列表(可分辨名称或全X.500path)。