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 не представляет из себя ничего трудного. Достаточно указать следующие свойства:
Параметр | Значение |
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