将针对 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 子句中。