Сценарий SQL — получение objectGUID подразделения из атрибутов пользователя AD

#sql-server #active-directory

#sql-сервер #active-directory

Вопрос:

Я хочу присоединить идентификатор guid подразделения (фильтрующий objectClass = «organizationalunit») к организации пользователя (фильтрующий objectClass = «User»)… Я не вижу соответствующего кода (идентификатор guid подразделения в атрибутах пользователей из AD) для сопоставления с набором данных, в котором у меня есть все подразделения objectClass = «organizationalunit»)

 -- dataset to get all OUs --I have an OU ObjectGUId here! it looks ok.
select *
FROM            OPENQUERY([ADSI], 
                         'SELECT 
                        Name, ADsPath,objectguid , parentguid       
    FROM ''myLDAP path'' 

    WHERE 
            objectClass = ''organizationalunit''
        
            ')
                          AS t

-- dataset to get users attributes--I do not see an OU ObjectGUId related to users OU structure
-- I checked here but no luck http://www.kouti.com/tables/userattributes.htm
select *
FROM            OPENQUERY([ADSI], 
                         'SELECT 
            userPrincipalName,ADsPath,
            Name, 
            displayName,
            objectCategory,
            SN, 
            givenName,
            ST, 
            SamAccountName, 
            DistinguishedName,
            ObjectGUID, 
            physicalDeliveryOfficeName,
            department,
            ObjectSID, 
            mail    ,preferredOU    , ou ,o
    FROM ''myLDAP path'' 

    WHERE 
            objectClass = ''User''
        
            ')
 

Ответ №1:

Если я правильно понял ваш вопрос, вы хотите объединить список пользователей с подразделением, в котором они находятся.

Active Directory представляет собой древовидную структуру, а DistinguishedName — это путь, который описывает, где находится объект.

Таким образом, чтобы перейти от объекта к контейнеру, в котором находится этот объект, вы удаляете первый элемент DistinguishedName, который разделяется запятыми.

Таким образом, пользователь с различимым именем cn=user, ou= container, dc= domain, dc= local находится в организационном подразделении ou=container, dc= domain, dc= local

Таким образом, решение представляет собой что-то более или менее похожее на SELECT RIGHT(distinctedname, CHARINDEX(«,», DistinguishedName) 1) от пользователей, которые затем присоединяются к organizationalUnits distinctedname .

Объекты не связаны через objectGUIDs, как вы предлагаете.

Извините, я не могу предложить вам прямой рабочий SQL-код, вы, вероятно, в этом лучше, чем я 😉

Комментарии:

1. хорошо, спасибо, Ларс. Правильно.. Я искал атрибут guid пользователя ou, но, похоже, он не существует. Я сделал что-то подобное, как вы предложили. Спасибо.