如何基于distinguishedName查询AD对象并获取指定OU及子OU主机
问题描述
我有两个数据库表,表中Host列存储Active Directory主机列表,Location列存储其组织单元(Organizational Unit,OU)的distinguishedName(即AD中的位置),OU层级范围为3至11级:
Table1是与特定应用配置对齐的主机及其OU位置的唯一列表:
Host | Location |
|---|---|
| 'HostA' | OU=Production,OU=SubApp,OU=App,DC=Domain1,DC=com |
| 'HostB' | OU=Development,OU=SubApp2,OU=App,DC=Domain1,DC=com |
Table2包含公司所有Active Directory OU中的全部主机:
Host | Location |
|---|---|
| 'HostC' | OU=Pre-Prod,OU=SubApp3,OU=App,DC=Domain1,DC=com |
我需要查询指定3级OU下的所有Table2主机,以及该OU所有子OU中的Table2主机,是否可行?
示例:若输入AD OU为OU=App,DC=Domain1,DC=com,需返回HostA、HostB和HostC(尽管HostC不在Table1中),该如何编写查询语句?
解决方案
完全可行,核心逻辑是利用AD的distinguishedName格式特性:子OU的DN必然包含父OU的DN作为后缀部分,通过字符串匹配即可筛选出目标OU及其所有子OU下的主机。
基础查询(仅返回符合条件的Table2主机)
直接查询Table2即可(需求目标是获取全量符合条件的主机,Table1仅为背景信息无需强制关联)。以参数化查询为例(避免SQL注入):
SQL Server 版本
SELECT t2.Host, t2.Location FROM Table2 t2 WHERE t2.Location LIKE '%,' + @TargetOU OR t2.Location = @TargetOU -- 匹配直接在目标OU下的主机
MySQL 版本
SELECT t2.Host, t2.Location FROM Table2 t2 WHERE t2.Location LIKE CONCAT('%', ',', @TargetOU) OR t2.Location = @TargetOU
PostgreSQL 版本
SELECT t2.Host, t2.Location FROM Table2 t2 WHERE t2.Location LIKE '%,' || @TargetOU OR t2.Location = @TargetOU
带Table1标记的查询(显示主机是否属于特定应用)
如果需要同时标注主机是否存在于Table1的特定应用列表中,可使用左连接:
SELECT t2.Host, t2.Location, CASE WHEN t1.Host IS NOT NULL THEN '是' ELSE '否' END AS 是否属于特定应用 FROM Table2 t2 LEFT JOIN Table1 t1 ON t2.Host = t1.Host WHERE t2.Location LIKE '%,' + @TargetOU OR t2.Location = @TargetOU
注意事项
- 参数化输入:必须使用参数(如
@TargetOU)传递目标OU,禁止直接拼接字符串,防止SQL注入。 - 精准匹配:用
,@TargetOU作为后缀匹配,可避免类似OU=AppTest,DC=...被误判为OU=App子OU的情况。 - 性能优化:若
Table2数据量较大,建议为Location列创建索引,提升查询效率。
内容的提问来源于stack exchange,提问作者LostInSQL
相关产品推荐
相关产品推荐

