1) - 我正在寻找LDAP查询(Active Directory)来获取给定用户的角色(组),而不指定用户的dinstinguished名称。
我能够使用此请求获得此信息:(&(objectclass = group)(成员:1.2.840.113556.1.4.1941:= cn = admin,ou = users,ou = OUTest,dc =例如,DC = COM))
但我不想为用户指定整个根(ou = users,ou = OUTest,dc = example,dc = com)。
2) - 我如何使用" sAMAccountName"来获取给定用户的组。而不是通用名CN?
(*)成员:1.2.840.113556.1.4.1941用于获取Active Directory中的所有嵌套组。
提前谢谢。
答案 0 :(得分:1)
有关ActiveDirectory中1.2.840.113556.1.4.1941
matching rule的文档是明确的。强调我的:
1.2.840.113556.1.4.1941
LDAP_MATCHING_RULE_IN_CHAIN
此规则仅限于适用于DN的过滤器。这是一个特殊的“扩展”匹配运算符,它将对象中的祖先链一直遍历到根,直到找到匹配为止
除了完整的DN之外,不可能将它与任何内容一起使用,因为它与包含完整DN的属性匹配。
但我不想为用户指定整个根
虽然运气好。 ;)
以允许用户使用更方便的方式构建程序,例如samAccountName
并将其转换为具有完整DN的搜索字符串。
例如在Powershell中:
function Get-ADUserGroups($username) {
if ($username) {
Get-ADUser $username | ForEach-Object {
$userDN = $_.DistinguishedName
$ldapFilter = "(&(objectClass=group)(member:1.2.840.113556.1.4.1941:=$userDN))"
Get-ADObject -LDAPFilter $ldapFilter
}
}
}
用法
Get-ADUserGroups userXYZ
或者,为此,常规Windows批处理(GetADUserGroups.bat)中的内容相同:
@echo off
setlocal enabledelayedexpansion
set USER=%~1
if "%USER%" neq "" (
for /f "delims=" %%d in ('dsquery user -samid "%USER%"') do (
set "LDAP_FILTER=(&(objectClass=group)(member:1.2.840.113556.1.4.1941:=%%~d))"
dsquery * -filter "!LDAP_FILTER!" -limit 1000
)
)
用法
GetADUserGroups userXYZ