将针对 Active Direct 组的查询限制为 Return 到特定组织单位 SQL
Limit Return of SQL Query against Active Direct groups to specific Organisation Unit
我有一个查询要获取 AD 人员所在的所有组;但我无法将结果限制在我想做的仅选定的组织单位。这是我的查询:
-- Test Variable --
DECLARE @Username NVARCHAR(254) = 'ABC'
DECLARE
@DomainController NVARCHAR(50) = N'DC=DOMAIN,DC=COM'
,@Fields NVARCHAR(256) = N'ADsPath,cn'
,@ParamDefn NVARCHAR(50) = N'@PathOut NVARCHAR(1024) OUTPUT'
DECLARE
@SQL NVARCHAR(4000)
,@Path NVARCHAR(1024)
SET @SQL =
'SELECT @PathOut = distinguishedName
FROM OPENQUERY(ADSI, ''
SELECT distinguishedName
FROM ''''LDAP://' + @DomainController + '''''
WHERE
objectClass = ''''user''''
AND sAMAccountName = ''''' + @Username + ''''''')'
EXEC sp_executesql @SQL, @ParamDefn, @PathOut = @Path OUTPUT
SET @SQL =
'SELECT *
FROM OPENQUERY (ADSI, ''<LDAP://' + @DomainController + '>;(&(objectClass=group)(member:1.2.840.113556.1.4.1941:=' + @Path +'));' + @Fields + ';subtree'')'
EXEC SP_EXECUTESQL @SQL
returns @Username
是其中成员的所有组,这很棒。但是,结果返回时 ADsPath
列看起来像这样:
LDAP://CN=Group1,OU=Role Groups,OU=Groups,DC=DOMAIN,DC=COM
LDAP://CN=Group2,OU=Application Groups,OU=Groups,DC=DOMAIN,DC=COM
LDAP://CN=Group3,OU=Role Groups,OU=Groups,DC=DOMAIN,DC=COM
LDAP://CN=Group4,OU=File System Groups,OU=Groups,DC=DOMAIN,DC=COM
我的问题是:如何更改查询以便(例如)仅返回 OU=Role Groups
的组?
目前我能看到的唯一成功方法是在事件发生后检查 ADsPath
的内容,使用字符串函数,如果可以避免,我不想那样做,因为获得所有组然后获得该结果的子集似乎效率低下(更不用说其他方式的解决方案的肮脏)。
也许我遗漏了什么,但将查询限制到特定 OU 的最直接方法是向 ADSI 查询添加另一个过滤器。
如果您想使用 LDAP dialect for ADSI,您可以将 (distinguishedName=*,OU=Role Groups,OU=Groups,DC=DOMAIN,DC=COM)
添加到您的 ADSI 过滤器。
如果您想使用 SQL dialect for ADSI,您可以将 AND distinguishedName = '*,OU=Role Groups,OU=Groups,DC=DOMAIN,DC=COM'
添加到 ADSI 查询的 WHERE 子句中。
我有一个查询要获取 AD 人员所在的所有组;但我无法将结果限制在我想做的仅选定的组织单位。这是我的查询:
-- Test Variable --
DECLARE @Username NVARCHAR(254) = 'ABC'
DECLARE
@DomainController NVARCHAR(50) = N'DC=DOMAIN,DC=COM'
,@Fields NVARCHAR(256) = N'ADsPath,cn'
,@ParamDefn NVARCHAR(50) = N'@PathOut NVARCHAR(1024) OUTPUT'
DECLARE
@SQL NVARCHAR(4000)
,@Path NVARCHAR(1024)
SET @SQL =
'SELECT @PathOut = distinguishedName
FROM OPENQUERY(ADSI, ''
SELECT distinguishedName
FROM ''''LDAP://' + @DomainController + '''''
WHERE
objectClass = ''''user''''
AND sAMAccountName = ''''' + @Username + ''''''')'
EXEC sp_executesql @SQL, @ParamDefn, @PathOut = @Path OUTPUT
SET @SQL =
'SELECT *
FROM OPENQUERY (ADSI, ''<LDAP://' + @DomainController + '>;(&(objectClass=group)(member:1.2.840.113556.1.4.1941:=' + @Path +'));' + @Fields + ';subtree'')'
EXEC SP_EXECUTESQL @SQL
returns @Username
是其中成员的所有组,这很棒。但是,结果返回时 ADsPath
列看起来像这样:
LDAP://CN=Group1,OU=Role Groups,OU=Groups,DC=DOMAIN,DC=COM
LDAP://CN=Group2,OU=Application Groups,OU=Groups,DC=DOMAIN,DC=COM
LDAP://CN=Group3,OU=Role Groups,OU=Groups,DC=DOMAIN,DC=COM
LDAP://CN=Group4,OU=File System Groups,OU=Groups,DC=DOMAIN,DC=COM
我的问题是:如何更改查询以便(例如)仅返回 OU=Role Groups
的组?
目前我能看到的唯一成功方法是在事件发生后检查 ADsPath
的内容,使用字符串函数,如果可以避免,我不想那样做,因为获得所有组然后获得该结果的子集似乎效率低下(更不用说其他方式的解决方案的肮脏)。
也许我遗漏了什么,但将查询限制到特定 OU 的最直接方法是向 ADSI 查询添加另一个过滤器。
如果您想使用 LDAP dialect for ADSI,您可以将 (distinguishedName=*,OU=Role Groups,OU=Groups,DC=DOMAIN,DC=COM)
添加到您的 ADSI 过滤器。
如果您想使用 SQL dialect for ADSI,您可以将 AND distinguishedName = '*,OU=Role Groups,OU=Groups,DC=DOMAIN,DC=COM'
添加到 ADSI 查询的 WHERE 子句中。