You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于distinguishedName查询AD对象并获取指定OU及子OU主机

问题描述

我有两个数据库表,表中Host列存储Active Directory主机列表,Location列存储其组织单元(Organizational Unit,OU)的distinguishedName(即AD中的位置),OU层级范围为3至11级:

  • Table1是与特定应用配置对齐的主机及其OU位置的唯一列表:
HostLocation
'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中的全部主机:
HostLocation
'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

注意事项

  1. 参数化输入:必须使用参数(如@TargetOU)传递目标OU,禁止直接拼接字符串,防止SQL注入。
  2. 精准匹配:用,@TargetOU作为后缀匹配,可避免类似OU=AppTest,DC=...被误判为OU=App子OU的情况。
  3. 性能优化:若Table2数据量较大,建议为Location列创建索引,提升查询效率。

内容的提问来源于stack exchange,提问作者LostInSQL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 04:40:29