Запросы к Active Directory

SQL Server позволяет производить выборки данных из множества источников данных при помощи многочисленных доступных драйверов. В том числе MS SQL Server позволяет выполнять запросы к контроллеру домена. В моем случае к Active Directory. Это очень полезная функция, которая может быть использована для множества задач. Я в основном использую ее для динамической настройки прав доступа к отчетным системам. По хорошему, настройка прав должна производиться с использованием групп пользователей домена. В таком случае, при добавлении нового пользователя в группу домена, для него автоматически будут применены соответствующие права. Но не все системы позволяют настроить роли с учетом групп пользователей контроллера домена. Например, я столкнулся с такой проблемой в MS SQL Server SSAS Multidimensional. Чтобы решить данную проблему, необходимо получить список пользователей необходимой группы контроллера домена и автоматически добавить каждого пользователя в нужную нам роль.

Настройка Linked Server

Параметр Значение
Provider
OLE DB provider for Microsoft Directory Services 
Product Name  ADSI
Data Source afsdatasource
Security Be made using the login's current security context

Настройка связного сервера к MS AD не представляет из себя ничего трудного. Достаточно указать следующие свойства:

Запросы к AD

Запросы к AD могу писаться в двух форматах:
  • SQL
  • LDAP
SQL-формат:
SELECT * FROM OPENQUERY(AD,
'SELECT name, ADsPath, title  
FROM ''LDAP://DC=domain_name'' 
WHERE objectCategory = ''User''' 
) 
LDAP-формат:
SELECT * FROM OPENQUERY(AD,'<LDAP://DC=domain_name>;(&(objectcategory=user));name, ADsPath, title ')
Но существует ограничение на получение данных из AD -- 900 строк с данными. Данное ограничение можно обойти настроив соответствующим образом контроллер доменов.
Далее я приведу примеры запросов, которые я использую:

1. Получить пользователей по определенному фильтру

SELECT top 100 * FROM OPENQUERY(AD,
'SELECT name, ADsPath, DistinguishedName, UserPrincipalName, title, 
  description,  whenCreated, sn, givenName, displayName, 
  telephoneNumber, accountExpires, userAccountControl, department, company
FROM ''LDAP://DC=domain_name'' 
WHERE objectCategory = ''User'' and sAMAccountName =''username*''
') 

2. Получить группы по определенному фильтру

SELECT top 100 * FROM OPENQUERY(AD,
'SELECT name, ADsPath ,info
FROM ''LDAP://DC=domain_name'' WHERE objectCategory = ''Group'' and sAMAccountName =''groupname*'' ')

3. Получить все группы, в которые входит пользователь

SELECT * FROM OPENQUERY(AD,
'SELECT name, ADsPath
FROM ''LDAP://DC=DomainName'' 
WHERE objectCategory = ''Group'' AND member=''CN=UserName,OU=OrgUnit,DC=DomainName''
') 

4. Получить всех пользователей входящих в группу

SELECT * FROM OPENQUERY(AD,
'SELECT  name, title, DistinguishedName, UserPrincipalName
FROM ''LDAP://DC=DomaninName'' 
WHERE objectCategory = ''User'' AND memberof=''CN=GroupName,OU=OrgUnit,DC=DomainName''' 
) order by name 

Список полей доступных для запроса представлен в ссылках ниже. Отдельно стоит отметить, что для пользователей и групп могут содержаться кастомные атрибуты. Данные атрибуты именуются следующим образом extensionAttribute1,..,extensionAttributeN

Дополнительные материалы