AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Администрирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.04.2015, 16:58   #1  
sanya_123 is offline
sanya_123
Участник
 
93 / 11 (1) +
Регистрация: 18.04.2005
Скрипт копирует всех пользователей домена erc в некую табличку Navision.
Зачем всё это? для запуска SSRS нам потребовался нормальный справочник SID- имя, т к nav хранит данные по SID в отрыве от имени пользователя.
Вычислять можно, но это шаманство.
забавно, что очень много на эту тему писано именно коллегами, которые занимаются NAV. MVP Stryk например отметился.

ключевые особенности

1. нужно зарегить linked сервер ADSI для доступа к БД
2. синтаксис LDAP отличается извращенностью, например не возвращается более 1000 записей. отсюда - перебор по первой букве пользователя
3. SID (атрибут objectSid )возвращается из AD в шестнадцатиричном формате, а в navision хранится в формате S-1-5-21-.....
то есть что-то куда-то нужно перекодировать. что и было сделано (HEX --> S-1-5-21-....)

дополнительная литература/откуда скопипастил:

--хороший справочник по разным возможным критериям. если скажем нужно вернуть не всех пользователей, а всех убитых/активных/всех компов, а не пользователей и т д
http://social.technet.microsoft.com/...dap-ru-ru.aspx

--хабра рулит. Обо всём сразу. Помогла например понять почему все глючило, если не ограничивать количество записей. и что делать.
http://habrahabr.ru/post/168699/

-=====
-- линкуем 'Active Directory Services'

/****** Object: LinkedServer [ADSI] Script Date: 04/08/2015 16:44:58 ******/
EXEC master.dbo.sp_addlinkedserver @server = N'ADSI', @srvproduct=N'Active Directory Services', @provider=N'ADsDSOObject', @datasrc=N'adsdatasource'
/* For security reasons the linked server remote logins password is changed with ######## */
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'ADSI',@useself=N'False',@locallogin=NULL,@rmtuser=N'mydomain\myuser',@rmtpassword='########'
GO
EXEC master.dbo.sp_serveroption @server=N'ADSI', @optname=N'collation compatible', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ADSI', @optname=N'data access', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'ADSI', @optname=N'dist', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ADSI', @optname=N'pub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ADSI', @optname=N'rpc', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ADSI', @optname=N'rpc out', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ADSI', @optname=N'sub', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ADSI', @optname=N'connect timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'ADSI', @optname=N'collation name', @optvalue=null
GO
EXEC master.dbo.sp_serveroption @server=N'ADSI', @optname=N'lazy schema validation', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'ADSI', @optname=N'query timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'ADSI', @optname=N'use remote collation', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'ADSI', @optname=N'remote proc transaction promotion', @optvalue=N'true'
GO

-- делаем табличку для возврата результата. (на самом деле она делалась в Navision)
USE [Etalon_2]
GO

/****** Object: Table [dbo].[Windows all SID to Login] Script Date: 04/08/2015 16:50:13 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Windows all SID to Login](
[timestamp] [timestamp] NOT NULL,
[Key] [int] IDENTITY(1,1) NOT NULL,
[SID] [varchar](119) NOT NULL,
[ID] [varchar](132) NOT NULL,
[Name] [varchar](250) NOT NULL,
CONSTRAINT [Windows all SID to Login$0] PRIMARY KEY CLUSTERED
(
[Key] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Data Filegroup 1]
) ON [Data Filegroup 1]

GO

SET ANSI_PADDING OFF
GO




-=====
-- основной скрипт

set nocount on

DECLARE @cmdstr varchar(4000)
DECLARE @nAsciiValue smallint
DECLARE @sChar char(1)


delete from ercmskdb10.[etalon_2].[dbo].[Windows all SID to Login]

SELECT @nAsciiValue = 65

WHILE @nAsciiValue < 91
BEGIN

--формируем хвост запроса
SELECT @sChar= CHAR(@nAsciiValue)
EXEC master..xp_sprintf @cmdstr OUTPUT, ' FROM OPENQUERY( ADSI, ''SELECT cn, sAMAccountName, objectSid FROM ''''LDAP://erc.rgs.ru/ DC=erc,DC=rgs,DC=ru'''' WHERE
objectClass=''''person'''' AND SAMAccountName = ''''%s*'''''' )', @sChar

--добавляем хвост к голове
SELECT @cmdstr =
'SELECT cn, sAMAccountName,

''S-1-5-21-''
+CAST(CAST(CAST(REVERSE(CONVERT(binary(4),''0x''+sys.fn_varbintohexsubstring(0,cast(objectSid as varbinary(39)),13,4),1)) as varbinary(4)) as bigint) as varchar(10))
+''-''+CAST(CAST(CAST(REVERSE(CONVERT(binary(4),''0x''+sys.fn_varbintohexsubstring(0,cast(objectSid as varbinary(39)),17,4),1)) as varbinary(4)) as bigint) as varchar(10))
+''-''+CAST(CAST(CAST(REVERSE(CONVERT(binary(4),''0x''+sys.fn_varbintohexsubstring(0,cast(objectSid as varbinary(39)),21,4),1)) as varbinary(4)) as bigint) as varchar(10))
+''-''+CAST(CAST(CAST(REVERSE(CONVERT(binary(4),''0x''+sys.fn_varbintohexsubstring(0,cast(objectSid as varbinary(39)),25,4),1)) as varbinary(4)) as bigint) as varchar(10)) ' + @cmdstr



INSERT ercmskdb10.[etalon_2].[dbo].[Windows all SID to Login](Name,ID,[SID]) EXEC( @cmdstr )
--PRINT @cmdstr
SELECT @nAsciiValue = @nAsciiValue + 1
END
За это сообщение автора поблагодарили: mira (1).
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 15:07.