我有一个查询来获取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
这将返回其中的所有组@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查询添加另一个过滤器。
如果要对ADSI使用LDAP方言,则可以将其添加(distinguishedName=*,OU=Role Groups,OU=Groups,DC=DOMAIN,DC=COM)
到ADSI过滤器中。
如果要将SQL方言用于ADSI,可以将AND distinguishedName = '*,OU=Role Groups,OU=Groups,DC=DOMAIN,DC=COM'
ADSI查询添加到WHERE子句中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句