Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Получить данные из Active Directory С помощью MS SQL по вхождению строки? / 13 сообщений из 13, страница 1 из 1
24.12.2020, 15:06
    #40030848
Pvase
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из Active Directory С помощью MS SQL по вхождению строки?
Нужно получить данные из 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
24.12.2020, 15:07
    #40030849
Pvase
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из Active Directory С помощью MS SQL по вхождению строки?
Еще, иногда появляется вот такая ошибка:
авторНе удалось преобразовать значение типа данных по другим причинам, нежели рассогласование или избыток знаков.

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

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

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

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

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

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


Вроде бы имеет " получить данные из Active Directory с помощью MS SQL "
...
Рейтинг: 0 / 0
28.12.2020, 13:22
    #40031760
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из Active Directory С помощью MS SQL по вхождению строки?
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
30.12.2020, 09:14
    #40032499
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из Active Directory С помощью MS SQL по вхождению строки?
Pvase
Код: sql
1.
givenName LIKE ''%иванов%''

если АД большое (50-100 тыс), то может тормозить
...
Рейтинг: 0 / 0
30.12.2020, 09:40
    #40032505
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из Active Directory С помощью MS SQL по вхождению строки?
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
30.12.2020, 11:56
    #40032560
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из Active Directory С помощью MS SQL по вхождению строки?
Сон Веры Павловны
Если использовать не SQL-ный, а нативный синтаксис LDAP-запросов
что-то мне сдаётся, что МССКЛ и в SQL-синтаксисе не сам фильтрует, а предоставляет это AD
...
Рейтинг: 0 / 0
30.12.2020, 12:42
    #40032578
Pvase
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из Active Directory С помощью MS SQL по вхождению строки?
Немного разобрался, спасибо всем ответившим. Синтаксис запроса LDAP немного не такой как SQL, LIKE писать нельзя. Также понятным стало почему выдает ошибку, ошибка возникает когда количество записей в запросе превышает 900. Т.е. если выбирать пользователей по 900 элементов, то ошибки не будет.

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

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

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


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