powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Получить данные из Active Directory С помощью MS SQL по вхождению строки?
13 сообщений из 13, страница 1 из 1
Получить данные из Active Directory С помощью MS SQL по вхождению строки?
    #40030848
Pvase
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно получить данные из Active Directory с помощью MS SQL. Сделал линкованный сервер:
Код: sql
1.
EXEC master.dbo.sp_addlinkedserver @server = N'ADSI', @srvproduct=N'Active Directory Service Interfaces', @provider=N'ADSDSOObject', @datasrc=N'adsdatasource'


И пытаюсь выполнить такой запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT * FROM OPENQUERY (ADSI,'SELECT 
	displayName, 
	sn, 
	givenName, 
	Initials, 
	sAMAccountName, 
	telephoneNumber
	


FROM 
	''LDAP://DC=Corp'' 
where
	givenName LIKE ''%иванов%''
	AND objectClass = ''User'''
	)


но получаю ошибку:
авторСообщение 7321, уровень 16, состояние 2, строка 1
Ошибка при подготовке запроса

Подскажите как можно выбрать по условию вхождения строки?
...
Рейтинг: 0 / 0
Получить данные из Active Directory С помощью MS SQL по вхождению строки?
    #40030849
Pvase
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще, иногда появляется вот такая ошибка:
авторНе удалось преобразовать значение типа данных по другим причинам, нежели рассогласование или избыток знаков.

Тоже непонятно что с этим делать.
...
Рейтинг: 0 / 0
Получить данные из Active Directory С помощью MS SQL по вхождению строки?
    #40030854
Pvase
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если делать условие во внешнем запросе, то получаю такую ошибку:
Не удалось получить строку от поставщика OLE DB "ADSDSOObject" для связанного сервера "ADSI".
...
Рейтинг: 0 / 0
Получить данные из Active Directory С помощью MS SQL по вхождению строки?
    #40030858
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pvase,

Сначала надо-бы удостоверится что линк работоспособный (чего пока из вышеприведённого неясно)
Хоть какой-нибудь запрос к нему выдаёт данные?
Сам обычно пишу через ADSDSOObject / LDAP с более полными путями OU/DC
...
Рейтинг: 0 / 0
Получить данные из Active Directory С помощью MS SQL по вхождению строки?
    #40031697
Pvase
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vikkiv
Pvase,

Сначала надо-бы удостоверится что линк работоспособный (чего пока из вышеприведённого неясно)
Хоть какой-нибудь запрос к нему выдаёт данные?
Сам обычно пишу через ADSDSOObject / LDAP с более полными путями OU/DC

Спасибо, могли бы привести пример такого запроса?
...
Рейтинг: 0 / 0
Получить данные из Active Directory С помощью MS SQL по вхождению строки?
    #40031711
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pvase,

какое отношение Ваша тема имеет к SQL? Правильно, никакого. Воспользуйтесь поисковой веб-системой, например Yandex и ищите "синтаксис LDAP запросов".
...
Рейтинг: 0 / 0
Получить данные из Active Directory С помощью MS SQL по вхождению строки?
    #40031740
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
Pvase,

какое отношение Ваша тема имеет к SQL? Правильно, никакого. Воспользуйтесь поисковой веб-системой, например Yandex и ищите "синтаксис LDAP запросов".


Вроде бы имеет " получить данные из Active Directory с помощью MS SQL "
...
Рейтинг: 0 / 0
Получить данные из Active Directory С помощью MS SQL по вхождению строки?
    #40031760
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pvase,

так не надо делать, там же в некоторых полях несколько значений,
лучше сделать SSIS-компонент, который будет тянуть данные,
примерно так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
public override void CreateNewOutputRows()
    {
        using (DirectoryEntry conn = new DirectoryEntry(Variables.FQDN))
        {
            using (DirectorySearcher searcher = new DirectorySearcher(conn))
            {
                searcher.Filter = "(&(objectCategory=person))";
                
                //searcher.PropertyNamesOnly = true;
                //searcher.SearchScope = SearchScope.Subtree;

                var propertiesToLoad = new[] { "manager", "title", "department", "cn", "SAMAccountName", "displayName", "givenName", "sn", "mail", "userAccountControl", "employeeNumber", "description", "distinguishedName" };
                searcher.PropertiesToLoad.AddRange(propertiesToLoad);
                searcher.PageSize = 500;


                using (SearchResultCollection results = searcher.FindAll())
                {
                    foreach (SearchResult result in results)
                    {

                        // добавляем записи в поток выводы
                        Output0Buffer.AddRow();
                        Output0Buffer.DOMAIN = Variables.domain;

                        if (result.Properties["employeeNumber"] != null && result.Properties["employeeNumber"].Count > 0)
                        {
                            Output0Buffer.EMPLOYEENUMBER = result.Properties["employeeNumber"][0].ToString();
                        }


                        if (result.Properties["samaccountname"] != null && result.Properties["samaccountname"].Count > 0)
                        {
                            Output0Buffer.SAMACCOUNTNAME = result.Properties["samaccountname"][0].ToString();
                        }


                        if (result.Properties["cn"] != null && result.Properties["cn"].Count > 0)
                        {
                            Output0Buffer.CN = result.Properties["cn"][0].ToString();
                        }


                        if (result.Properties["givenName"] != null && result.Properties["givenName"].Count > 0)
                        {
                            Output0Buffer.GIVENNAME = result.Properties["givenName"][0].ToString();
                        }


                        if (result.Properties["sn"] != null && result.Properties["sn"].Count > 0)
                        {
                            Output0Buffer.SN = result.Properties["sn"][0].ToString();
                        }


                        if (result.Properties["mail"] != null && result.Properties["mail"].Count > 0)
                        {
                            Output0Buffer.MAIL = result.Properties["mail"][0].ToString();
                        }


                        if (result.Properties["department"] != null && result.Properties["department"].Count > 0)
                        {
                            Output0Buffer.DEPARTMENT = result.Properties["department"][0].ToString();
                        }



                        if (result.Properties["title"] != null && result.Properties["title"].Count > 0)
                        {
                            Output0Buffer.TITLE = result.Properties["title"][0].ToString();
                        }


                        if (result.Properties["userAccountControl"] != null && result.Properties["userAccountControl"].Count > 0)
                        {
                            Output0Buffer.USERACCOUNTCONTROL = Convert.ToInt32(result.Properties["userAccountControl"][0]);
                        }

                        
                        if (result.Properties["description"] != null && result.Properties["description"].Count > 0)
                        {
                            Output0Buffer.DESCRIPTION = result.Properties["description"][0].ToString();
                        }
                        

                        if (result.Properties["distinguishedName"] != null && result.Properties["distinguishedName"].Count > 0)
                        {
                            Output0Buffer.DISTINGUISHEDNAME = result.Properties["distinguishedName"][0].ToString();
                        }


                        if (result.Properties["manager"] != null && result.Properties["manager"].Count > 0)
                        {
                            Output0Buffer.MANAGER = result.Properties["manager"][0].ToString();
                        }

                    }
                }
            }
        }
    }

...
Рейтинг: 0 / 0
Получить данные из Active Directory С помощью MS SQL по вхождению строки?
    #40032499
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pvase
Код: sql
1.
givenName LIKE ''%иванов%''

если АД большое (50-100 тыс), то может тормозить
...
Рейтинг: 0 / 0
Получить данные из Active Directory С помощью MS SQL по вхождению строки?
    #40032505
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx
Pvase
Код: sql
1.
givenName LIKE ''%иванов%''


если АД большое (50-100 тыс), то может тормозить

Если использовать не SQL-ный, а нативный синтаксис LDAP-запросов, то фильтрация будет делаться на стороне контроллера домена:
Код: sql
1.
2.
3.
4.
5.
SELECT * FROM OpenQuery(ADSI,  
  '<LDAP://mydomain/DC=mydomain,DC=ru>;
	(&(objectCategory=person)(sAMAccountType=805306368)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(displayName=* Иван *));
	sAMAccountName, displayName, objectSid,telephoneNumber;Subtree'
)


Подробности синтаксиса фильтров здесь .
...
Рейтинг: 0 / 0
Получить данные из Active Directory С помощью MS SQL по вхождению строки?
    #40032560
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
Если использовать не SQL-ный, а нативный синтаксис LDAP-запросов
что-то мне сдаётся, что МССКЛ и в SQL-синтаксисе не сам фильтрует, а предоставляет это AD
...
Рейтинг: 0 / 0
Получить данные из Active Directory С помощью MS SQL по вхождению строки?
    #40032578
Pvase
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немного разобрался, спасибо всем ответившим. Синтаксис запроса LDAP немного не такой как SQL, LIKE писать нельзя. Также понятным стало почему выдает ошибку, ошибка возникает когда количество записей в запросе превышает 900. Т.е. если выбирать пользователей по 900 элементов, то ошибки не будет.

Также есть вопрос, как получить с помощью такого запроса все группы пользователя? В интернете нашел примеры, но оны не работают для MS SQL. Может кто знает работающий пример, подскажите пожалуйста.
...
Рейтинг: 0 / 0
Получить данные из Active Directory С помощью MS SQL по вхождению строки?
    #40032605
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pvase,

В MSSQL может работать очень много неожиданного - но это не значит что туда нужно это всё пихать,
приоритетное предназначение немного другое
для разных задач используются подходящие для этого инструменты
можно и через CLR или polybase/cmd (xp_cmdshell / powershell) получить результат.
собственно сам вопрос сводится к тому как написать правильный запрос для LDAP а не для MSSQL, т.е. неправильный раздел.
ответ на него скорее будет добавление условия в запрос типа (objectClass=group)

п.с. ограничение на 900 строк - это в настройках с другого конца: на контроллере домена
(там по умолчанию вроде на 1000 записей как когда-то мне подсказал Владислав Колосов : 21586907 )
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Получить данные из Active Directory С помощью MS SQL по вхождению строки?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]