Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 t-sql get ldap users into table  [new]
Profeccor
Member

Откуда:
Сообщений: 78
Доброго времени суток дорогие форумчане.
Использовал до этого СУБД Oracle, сейчас пришлось перейти на ms sql.
Пытаюсь выгрузить список всех пользователей из ldap в таблицу. ( в дальнейшем это должен стать джобом и отрабатываться ночью обновляя информацию о пользовательских данных.)
Как делать джобы я вроде понял. При их создании можно выбрать довольно много вариантов того что они должны исполнять.
я решил сделать самый на текуший момент понятный мне на t-sql. нашел примеры, но что-то не очень понимаю, как они работают.
ПО идее выгрузка из ldapа происходит из под пользователя с правами на чтение. Такой пользователь у меня есть. Все тропинки в структуре я тоже знаю, но не понимаю что писать. Мне бы простенький пример или ссылку на то, как выгрузить пользователя.
Как я понимаю, это должен быть цикл, в котором я получаю по одному пользователю за шаг и записываю его в таблицу, перехожу к следующему.

Заранее спасибо всем откликнувшимся.
14 дек 17, 09:15    [21032603]     Ответить | Цитировать Сообщить модератору
 Re: t-sql get ldap users into table  [new]
aleks222
Guest
Хто на ком стоял?

"всех пользователей из ldap" - какой-такой LDAP?
Доменный, штоле?


ЗЫ. Учись излагать отсутствие мыслей связно.
14 дек 17, 09:26    [21032621]     Ответить | Цитировать Сообщить модератору
 Re: t-sql get ldap users into table  [new]
Profeccor
Member

Откуда:
Сообщений: 78
aleks222,

да! доменных пользователей выгрузить.
14 дек 17, 09:29    [21032629]     Ответить | Цитировать Сообщить модератору
 Re: t-sql get ldap users into table  [new]
aleks222
Guest
Ну... лет десять назад я выгружал так

ALTER PROCEDURE LDAP_SAMName_to_DisplayName_CreateTable
-- обновление данных LDAP домена, чтобы отображать имена пользователей красиво.
AS
SET NOCOUNT ON 
SET XACT_ABORT ON

begin tran LDAP
	if OBJECT_ID('dbo.[LDAP_SAMName_to_DisplayName]') is not null 
		DELETE dbo.[LDAP_SAMName_to_DisplayName]
	else begin
		CREATE TABLE dbo.[LDAP_SAMName_to_DisplayName] (
			[DisplayName] [nvarchar] (256) COLLATE Cyrillic_General_CI_AS NOT NULL ,
			[AccountName] [nvarchar] (256) COLLATE Cyrillic_General_CI_AS NOT NULL ,
			[SAMAccountName] [nvarchar] (128) COLLATE Cyrillic_General_CI_AS NOT NULL ,
			CONSTRAINT [PK_LDAP_SAMName_to_DisplayName] PRIMARY KEY  CLUSTERED ([AccountName]) 
		)	
		CREATE  UNIQUE  INDEX [IX_LDAP_SAMName_to_DisplayName] ON [dbo].[LDAP_SAMName_to_DisplayName]([SAMAccountName]) 
          end

	declare @sql_template nvarchar(4000), @sql nvarchar(4000), @fqdn nvarchar(128)

	select @fqdn=str FROM dbo.[isa2006 Глобальные параметры] WHERE ID=2
	if @fqdn is null  SET @fqdn=N''

	set @sql_template='SELECT Name DisplayName, ''' + dbo.LDAP_DomainName()+'\''+ SAMAccountName [AccountName], SAMAccountName '
		+' FROM OPENQUERY(ADSI, ''select Name, sAMAccountName from ''''LDAP://'
		+dbo.[LDAP_FQDN->DCs](@fqdn)
		+''''' where objectClass = ''''User'''' and objectCategory=''''Person'''' <<replace>> ORDER BY SAMAccountName ASC '')'
	declare @rc int, @name nvarchar(256)
	set @rc=1
	set @sql=REPLACE(@sql_template, N'<<replace>>', N'')
	while @rc>0 begin
		INSERT INTO dbo.[LDAP_SAMName_to_DisplayName] exec(@sql)
		set @rc=@@rowcount
		if @rc>0 begin
			select top 1 @name = SAMAccountName FROM dbo.[LDAP_SAMName_to_DisplayName]  ORDER BY SAMAccountName DESC
			set @sql=REPLACE(@sql_template, N'<<replace>>', N' AND SAMAccountName>'''''+@name+''''' ')
		end
	end
commit tran LDAP


	RETURN


Работает пока...
14 дек 17, 09:35    [21032641]     Ответить | Цитировать Сообщить модератору
 Re: t-sql get ldap users into table  [new]
Profeccor
Member

Откуда:
Сообщений: 78
aleks222,

сделал по статье
http://www.specialist.ru/center/advice/79

все работает.
но при выгрузке не дает больше 900 строк ругается

Cannot fetch a row from OLE DB provider "ADsDSOObject" for linked server "AD".
14 дек 17, 10:09    [21032761]     Ответить | Цитировать Сообщить модератору
 Re: t-sql get ldap users into table  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1507
Profeccor
но при выгрузке не дает больше 900 строк ругается

Cannot fetch a row from OLE DB provider "ADsDSOObject" for linked server "AD".
Так и должно быть. Работать порциями.
14 дек 17, 10:12    [21032774]     Ответить | Цитировать Сообщить модератору
 Re: t-sql get ldap users into table  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Profeccor,

https://blogs.msdn.microsoft.com/ikovalenko/2007/03/22/how-to-avoid-1000-rows-limitation-when-querying-active-directory-ad-from-sql-2005-with-using-custom-code/
14 дек 17, 10:19    [21032796]     Ответить | Цитировать Сообщить модератору
 Re: t-sql get ldap users into table  [new]
Profeccor
Member

Откуда:
Сообщений: 78
TaPaK,

видел эту статью, ничего в ней не понял совсем )).

но на Oracle я тоже обходил ограничения по кол записей. делал это не очень красиво. Тупо перебирая все символы начала имени и подставляя их в cn, но может быть и такое что в рамках одного символа будет больше чем 900 записей и все рухнет, в один прекрасный день )).

str := 'ёйцукенгшщзхъфывапролджэячсмитьбю qwertyuiopasdfghjklzxcvbnm,.;:[]()\|/~?!@#$%^&*_1234567890+-=<>';
      for i in 1..length(str) loop
        temp := get_group_ldap('OU='||current_select.name||',','(&(objectCategory=group)(cn='||substr(str,i,1)||'*))', current_select.id);
      end loop;


Может есть более красивое решение?
P.S. current_select это еще цикл сверху по определенному строению дерева в AD.

PSS как правильно называть linked server AD или LDAP ? чисто из эстетических соображений.
14 дек 17, 10:26    [21032813]     Ответить | Цитировать Сообщить модератору
 Re: t-sql get ldap users into table  [new]
Profeccor
Member

Откуда:
Сообщений: 78
aleks222

Подскажите что у Вас хранится в таблице
"dbo.[LDAP_FQDN->DCs](@fqdn)"

Там лежат ветки к определеным разделам с пользователями?
Если число пользователей в ветке превысит 900?
14 дек 17, 10:38    [21032850]     Ответить | Цитировать Сообщить модератору
 Re: t-sql get ldap users into table  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30773
Profeccor
видел эту статью, ничего в ней не понял совсем )).
Это один из вариантов обхода ограничения; автор сделал сборки CLR процедур для работы с AD (лежат в прикреплённом архиве MSADHelper2.rar), и показал, как ими пользоваться.
14 дек 17, 10:50    [21032885]     Ответить | Цитировать Сообщить модератору
 Re: t-sql get ldap users into table  [new]
aleks222
Guest
Profeccor
aleks222

Подскажите что у Вас хранится в таблице
"dbo.[LDAP_FQDN->DCs](@fqdn)"

Там лежат ветки к определеным разделам с пользователями?
Если число пользователей в ветке превысит 900?


Осподе, горе-программизд детектед!

Цикл там зачем? Анализируй ЭТО.
14 дек 17, 12:45    [21033300]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить