Правило атрибутов диспетчера Active Directory - PullRequest
0 голосов
/ 06 мая 2019

Я знаю, что Active Directory позволяет, по крайней мере, одному объекту иметь назначенного менеджера (атрибут), который совпадает с текущим объектом. Другими словами, работник является их собственным менеджером (то есть генеральным директором).

Кто-нибудь знает, возможно ли иметь более одного объекта, в котором менеджер совпадает с данным объектом (т. Е. Есть со-генеральный директор)? Microsoft молчит на эту тему (см. Ссылку ниже).

Я извлекаю объекты AD из таблицы SQL-сервера и разрабатываю рекурсивный запрос для построения иерархии между сотрудниками и менеджерами. Первый шаг запроса получает генеральный директор, где DistinguishedName = ManagerDistinguishedName. Второй шаг запроса получает всех сотрудников, где DistinguishedName <> ManagerDistinguishedName.

Запрос в настоящее время работает, когда для фирмы существует только один генеральный директор. К сожалению, у меня нет среды разработки для AD для тестирования со-генеральных директоров и того, как это может повлиять на запрос. Другими словами, я не уверен, существует ли потенциал для бесконечного цикла, основанного на данных и ограничениях запросов.

Атрибут менеджера

UPDATE

;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

Где:

  1. . # TEMP_ManagerToEmployeeHierarchy - временная таблица, которая содержит только активные учетные записи пользователей.
  2. ObjectKey - это значение IDENTITY, основанное на порядке вставки объектов. Другими словами, это перевод атрибута objectGuid.

1 Ответ

1 голос
/ 08 мая 2019

Создайте фиктивную учетную запись, назовите ее по имени организации. Это можно отключить. Заполните таблицу #TEMP_ManagerToEmployeeHierarchy всеми активными пользователями и фиктивной учетной записью.

Сделайте пользователя организации руководителем генерального директора / генеральных директоров / президента или любого другого.

Явно установите GUID для фиктивной учетной записи org. Этот GUID никогда не изменится, даже если генеральный директор уйдет.

Это должно решить вашу проблему рекурсии, так как вы теперь отслеживаете голову, по крайней мере.

Теперь это должно сработать, оно идет сверху и опускается.

;WITH EmployeeList AS (
        SELECT EmployeeObjectKey = ObjectKey, EmployeeFullName = FullName, EmployeeSamAccountName = SamAccountName, ManagerObjectKey
            ,ManagerFullName = FullName, ManagerSamAccountName = SamAccountName, EmployeeLevel = 1
        FROM #TEMP_ManagerToEmployeeHierarchy
        WHERE ObjectKey = '{objectGuidOfTheOrganizationDummyAccount}' -- Root Node (Company name)
        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 -- This should probably be remove. If there is no manager, then nothing is returned and we should be good.
        )

SELECT *
FROM EmployeeList
ORDER BY EmployeeLevel, ManagerFullName, EmployeeFullName
WHERE EmployeeLevel <> 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...