【发布时间】:2019-05-06 16:17:08
【问题描述】:
我知道 Active Directory 允许至少一个对象具有与当前对象相同的指定管理器(属性)。换句话说,员工是他们自己的经理(即 CEO)。
有谁知道是否有可能拥有多个对象,其中经理与给定对象相同(即,有联席 CEO)?微软对这个话题保持沉默(见下面的链接)。
我正在将 AD 对象提取到 SQL 服务器表并开发递归查询来构建员工到经理的层次结构。查询的第一步获取DistinguishedName = ManagerDistinguishedName 所在的CEO。查询的第二步获取DistinguishedName <> ManagerDistinguishedName 所在的所有员工。
该查询目前适用于公司只有一位 CEO 的情况。不幸的是,我没有用于 AD 的开发环境来测试联合 CEO 以及它如何影响查询。换句话说,我不确定是否存在基于数据和查询约束的无限循环的可能性。
更新
;WITH EmployeeList AS (
SELECT EmployeeObjectKey = ObjectKey, EmployeeFullName = FullName, EmployeeSamAccountName = SamAccountName, ManagerObjectKey
,ManagerFullName = FullName, ManagerSamAccountName = SamAccountName, EmployeeLevel = 1
FROM #TEMP_ManagerToEmployeeHierarchy
WHERE ObjectKey = ManagerObjectKey -- The CEO of the organization should be the only employee who's manager is themself.
UNION ALL
SELECT EmployeeObjectKey = E.ObjectKey, EmployeeFullName = E.FullName, EmployeeSamAccountName = E.SamAccountName, E.ManagerObjectKey
,ManagerFullName = M.EmployeeFullName, ManagerSamAccountName = M.EmployeeSamAccountName, EmployeeLevel = M.EmployeeLevel + 1
FROM #TEMP_ManagerToEmployeeHierarchy E -- Employee
INNER JOIN EmployeeList M -- Manager
ON E.ManagerObjectKey = M.EmployeeObjectKey
AND ObjectKey <> E.ManagerObjectKey -- Do not remove this exclusion, otherwise an infinite loop is created and the query will fail.
)
SELECT *
FROM EmployeeList
ORDER BY EmployeeLevel, ManagerFullName, EmployeeFullName
地点:
- .#TEMP_ManagerToEmployeeHierarchy 是一个临时表,仅包含活动用户帐户。
- ObjectKey 是一个基于对象插入顺序的 IDENTITY 值。换句话说,它是 objectGuid 属性的翻译。
【问题讨论】:
-
@GabrielLuci 你知道答案吗?
-
@J Weezy,我不明白为什么会有问题。如果你是递归地通过,那么当你说他们是他们自己的老板时它就会停止。然后它将基本返回false并继续循环,直到没有人离开并完全退出循环。您没有显示您的查询,但是应该可以。
-
@Matt 我倾向于同意。但是,问题仍然存在。是否可以创建循环引用?例如,AD 允许创建组中的循环引用——没有错误检查。结果是可以通过循环嵌套向较低级别的组授予访问权限,该访问仅适用于较高级别的组。当遍历所有组和嵌套的子组成员时,这会导致无限循环。我已经发布了查询逻辑。
-
@J Weezy 当然可以获得循环引用。让我们快速解决这个问题。暂时去掉 SQL 查询。如果我正在检查一堆对象并且在我的对象中我有 managerid 和 userid。我将 managerid 与 userid 进行比较,最终我到达了没有 managerid 并退出的地步。这行得通,但是......如果你确实有那个循环引用怎么办。我现在继续前进,没有办法停下来。唯一可行的方法是跟踪您从哪里开始。喜欢:stackoverflow.com/questions/50341133/…
-
@J Weezy 我以前从未考虑过 SQL 中的递归,所以不确定如何解决这个问题,但看起来有一个限制递归的选项stackoverflow.com/questions/14518090/…。这可能应该是层次结构编号。您也可以将 WHERE ObjectKey = CEOObjectID 放在开头,这至少应该为您提供头部参考。如果你有联合 CEO,它仍然无法解决这个问题,所以你需要一个假人来担任高层。
标签: sql-server active-directory