Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как получить имя доменной учетки по SID этой учетной записи?  [new]
Tepes
Member

Откуда:
Сообщений: 40
Добрый день!

Есть необходимость получить доменную учетную записть пользователя, при условии, что в таблице есть только SID этой учетки вида S-1-5-21-3879291865-2298129343-1096376209 стандартными средствами MsSQL.
версия 2000 SP4 и 2005 SP3.
Кто-нибудь может подсказать, возможно ли таковое в принципе?
24 сен 09, 13:41    [7702916]     Ответить | Цитировать Сообщить модератору
 Re: Как получить имя доменной учетки по SID этой учетной записи?  [new]
aleks2
Guest
SUSER_SNAME(sid)
24 сен 09, 13:50    [7702999]     Ответить | Цитировать Сообщить модератору
 Re: Как получить имя доменной учетки по SID этой учетной записи?  [new]
aleks2
Guest
ну... только придется ЭТО
S-1-5-21-3879291865-2298129343-1096376209
перевести в binary.
24 сен 09, 13:51    [7703007]     Ответить | Цитировать Сообщить модератору
 Re: Как получить имя доменной учетки по SID этой учетной записи?  [new]
Tepes
Member

Откуда:
Сообщений: 40
Спасибо, попробуем =)
24 сен 09, 13:58    [7703049]     Ответить | Цитировать Сообщить модератору
 Re: Как получить имя доменной учетки по SID этой учетной записи?  [new]
Tepes
Member

Откуда:
Сообщений: 40
В принципе, тогда можно имя учетки забрать сразу из master..sysxlogins.
24 сен 09, 13:59    [7703063]     Ответить | Цитировать Сообщить модератору
 Re: Как получить имя доменной учетки по SID этой учетной записи?  [new]
Tepes
Member

Откуда:
Сообщений: 40
Еще следующий вопрос а как правильно конвертнуть SID из S-1-5-21-3879291865-2298129343-1096376209 в 0x0105000000000005150000004077F641EF3DA92588DC6B8B430E0000

select cast ('S-1-5-21-1106671424-631848431-2339101832-3651' as varbinary)

не очень получается.
24 сен 09, 14:09    [7703132]     Ответить | Цитировать Сообщить модератору
 Re: Как получить имя доменной учетки по SID этой учетной записи?  [new]
Gerros
Member

Откуда: Харьков
Сообщений: 501
How do I convert a SID between binary and string forms?
24 сен 09, 15:14    [7703732]     Ответить | Цитировать Сообщить модератору
 Re: Как получить имя доменной учетки по SID этой учетной записи?  [new]
Tepes
Member

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

Спасибо; если честно, хотелось бы обойтись средствами СУБД.
24 сен 09, 15:20    [7703788]     Ответить | Цитировать Сообщить модератору
 Re: Как получить имя доменной учетки по SID этой учетной записи?  [new]
ТАРАКАН
Member

Откуда:
Сообщений: 439
Tepes
Добрый день!

Есть необходимость получить доменную учетную записть пользователя, при условии, что в таблице есть только SID этой учетки вида S-1-5-21-3879291865-2298129343-1096376209 стандартными средствами MsSQL.
версия 2000 SP4 и 2005 SP3.
Кто-нибудь может подсказать, возможно ли таковое в принципе?


у вас есть таблица в некой БД SQL в которой хранятся AD SID-ы неких пользователей и вы хотите узнать имя учетной записи в AD или проверить наличие этой учетной записи в MS SQL и если есть выдать имя ?
24 сен 09, 15:28    [7703870]     Ответить | Цитировать Сообщить модератору
 Re: Как получить имя доменной учетки по SID этой учетной записи?  [new]
Tepes
Member

Откуда:
Сообщений: 40
ТАРАКАН,

Задача - просто получить имя доменной учетки в формате DOMAIN\User или хотя бы просто User.
24 сен 09, 15:32    [7703905]     Ответить | Цитировать Сообщить модератору
 Re: Как получить имя доменной учетки по SID этой учетной записи?  [new]
ТАРАКАН
Member

Откуда:
Сообщений: 439
Tepes
ТАРАКАН,

Задача - просто получить имя доменной учетки в формате DOMAIN\User или хотя бы просто User.

вот я и выясняю откуда именно вы хотите получить. с AD или MS SQL ?
24 сен 09, 15:35    [7703941]     Ответить | Цитировать Сообщить модератору
 Re: Как получить имя доменной учетки по SID этой учетной записи?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Tepes
Gerros,

Спасибо; если честно, хотелось бы обойтись средствами СУБД.

Ну и что вам мешает работать со строкой средствами СУБД согласно приведенному алгоритму ?
24 сен 09, 15:36    [7703945]     Ответить | Цитировать Сообщить модератору
 Re: Как получить имя доменной учетки по SID этой учетной записи?  [new]
Tepes
Member

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

Да ничего не мешает, кроме лени - это придется наверное функцию писать для разбора SID,а я ж не программист вовсе =) Просто думалось, что есть готовое решение.
24 сен 09, 15:53    [7704080]     Ответить | Цитировать Сообщить модератору
 Re: Как получить имя доменной учетки по SID этой учетной записи?  [new]
Tepes
Member

Откуда:
Сообщений: 40
ТАРАКАН,

вообще мне все равно. Знаю, что можно использовать xp_cmdshell 'dsget user' или psgetsid, но хотелось бы стандартными средствами.
24 сен 09, 16:00    [7704132]     Ответить | Цитировать Сообщить модератору
 Re: Как получить имя доменной учетки по SID этой учетной записи?  [new]
ТАРАКАН
Member

Откуда:
Сообщений: 439
--Создаем Линк к AD серверу
--Не забыть добавить логин и пароль в свойство линксервера ЖЕСТКО.
EXEC master.dbo.sp_addlinkedserver @server = N'ADSI',
@srvproduct=N'Active Directory Services', @provider=N'ADsDSOObject',
@datasrc=N'имя.домен.ru'  --AKA the full computer name of the AD server пример MOS.ENERGO.RU
--Создаем Линк к AD серверу
--Не забыть добавить логин и пароль в свойство линксервера ЖЕСТКО.

SELECT *
FROM (SELECT * FROM OpenQuery
(
ADSI, 'SELECT 		objectSid , displayName, sAMAccountName
FROM ''LDAP://DC=имя,DC=домен,DC=ru'' 
WHERE objectCategory = ''Person'' AND objectClass = ''user''
')) tabl1
where objectSid=(select SUSER_SID())
24 сен 09, 17:09    [7704711]     Ответить | Цитировать Сообщить модератору
 Re: Как получить имя доменной учетки по SID этой учетной записи?  [new]
aleks2
Guest
Ёпрст!
CREATE FUNCTION f_StrToTable (@str varchar(7998), @delimiter char(1)=',') RETURNS TABLE AS
   RETURN(SELECT substring(@delimiter + @str + @delimiter, Number + 1,
                    charindex(@delimiter, @delimiter + @str + @delimiter, Number + 1) - Number - 1)
                 AS Value
          FROM   dbo.Numbers
          WHERE  Number <= len(@delimiter + @str + @delimiter) - 1
            AND  substring(@delimiter + @str + @delimiter, Number, 1) = @delimiter)
GO

ALTER  FUNCTION ConvertStringSidtoSid(@StrSID varchar(256)) 
RETURNS varbinary(82)
AS
begin

declare @t table(id int identity primary key clustered, n bigint)
declare @SID varbinary(82)

set @StrSID=REPLACE(@StrSID, 'S-','')

insert @t(n)
select Value from dbo.f_StrToTable (@StrSID, '-')

set @SID=
	 cast(cast((select n FROM @t WHERE id=1) as tinyint) as binary(1))
	+cast(cast((select max(id)-2 FROM @t) as tinyint) as binary(1))
	+SUBSTRING(cast((select n FROM @t WHERE id=2) as binary(8)),3, 6)


select 
  @SID=@SID+cast(REVERSE(cast(cast(cast(n as int) as binary(4)) as char(4))) as binary(4))
FROM @t WHERE id>2

RETURN @SID
/*
Of course, if you want to do this programmatically, you would use ConvertSidToStringSid and ConvertStringSidtoSid, but often you're studying a memory dump or otherwise need to do the conversion manually. 

If you have a SID like S-a-b-c-d-e-f-g-... 

Then the bytes are 

a (revision) 
N (number of dashes minus two) 
bbbbbb (six bytes of "b" treated as a 48-bit number in big-endian format) 
cccc (four bytes of "c" treated as a 32-bit number in little-endian format) 
dddd (four bytes of "d" treated as a 32-bit number in little-endian format) 
eeee (four bytes of "e" treated as a 32-bit number in little-endian format) 
ffff (four bytes of "f" treated as a 32-bit number in little-endian format) 
etc.  

So for example, if your SID is S-1-5-21-2127521184-1604012920-1887927527-72713, then your raw hex SID is 

010500000000000515000000A065CF7E784B9B5FE77C8770091C0100 

This breaks down as follows: 

01 S-1 
05 (seven dashes, seven minus two = 5) 
000000000005 (5 = 0x000000000005, big-endian) 
15000000 (21 = 0x00000015, little-endian) 
A065CF7E (2127521184 = 0x7ECF65A0, little-endian) 
784B9B5F (1604012920 = 0x5F9B4B78, little-endian) 
E77C8770 (1887927527 = 0X70877CE7, little-endian) 
091C0100 (72713 = 0x00011c09, little-endian) 

Yeah, that's great, Raymond, but what do all those numbers mean? 

S-1- version number (SID_REVISION) 
-5- SECURITY_NT_AUTHORITY 
-21- SECURITY_NT_NON_UNIQUE 
-...-...-...- these identify the machine that issued the SID 
72713 unique user id on the machine 

Each machine generates a unique ID that it uses to stamp all the SIDs it creates (-...-...-...-). The last number is a "relative id (RID)" that represents a user created by that machine. There are a bunch of predefined RIDs; you can see them in the header file ntseapi.h, which is also where I got these names from. The system reserves RIDs up to 999, so the first non-builtin account gets assigned ID number 1000. The number 72713 means that this particular SID is the 71714th SID created by the issuer. (The machine that issued this SID is clearly a domain controller, responsible for creating the accounts of tens of thousands of users.) 

(Actually, I lied above when I said that this is the 71714th SID created by the issuer. Large servers can delegate SID creation to helpers, in which case SID issuance is no longer strictly consecutive.) 

Security isn't my area of expertise, so it's entirely possibly (perhaps even likely) that I got something wrong up above. But it's mostly correct, I think. 

Published Monday, March 15, 2004 7:00 AM by oldnewthing 
Filed under: Other
*/
end
GO

select dbo.ConvertStringSidtoSid('S-1-5-21-2127521184-1604012920-1887927527-72713')

24 сен 09, 19:01    [7705443]     Ответить | Цитировать Сообщить модератору
 Re: Как получить имя доменной учетки по SID этой учетной записи?  [new]
Tepes
Member

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

Спасибо. Но есть непонятный момент - а где, собственно взять функцию ConvertStringSidtoSid?
как это
[url=]http://msdn.microsoft.com/en-us/library/aa376402(VS.85).aspx[/url] запихнуть в SQL?

Если вопрос сильно тупой, прошу извинить заранее =)
25 сен 09, 09:23    [7706610]     Ответить | Цитировать Сообщить модератору
 Re: Как получить имя доменной учетки по SID этой учетной записи?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Tepes
aleks2,

Спасибо. Но есть непонятный момент - а где, собственно взять функцию ConvertStringSidtoSid?

Она есть в приведенном скрипте. Начинается с фразы ALTER FUNCTION ConvertStringSidtoSid

Tepes

как это
[url=]http://msdn.microsoft.com/en-us/library/aa376402(VS.85).aspx[/url] запихнуть в SQL?

Это не надо запихивать в SQL. Это можно запихнуть в CLR функцию, если вы уже отошли от условия "хотелось бы обойтись средствами СУБД."
25 сен 09, 10:03    [7706742]     Ответить | Цитировать Сообщить модератору
 Re: Как получить имя доменной учетки по SID этой учетной записи?  [new]
Tepes
Member

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

Я так понимаю, что ALTER FUNCTION подразуменает наличие этой функции. А у меня ее нету.
25 сен 09, 10:13    [7706778]     Ответить | Цитировать Сообщить модератору
 Re: Как получить имя доменной учетки по SID этой учетной записи?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Tepes
Glory,

Я так понимаю, что ALTER FUNCTION подразуменает наличие этой функции. А у меня ее нету.

Да какая вам разница, если дальше приведено все тело процедуры ?
Вы не можете ALTER заменить на CREATE ?
25 сен 09, 10:14    [7706789]     Ответить | Цитировать Сообщить модератору
 Re: Как получить имя доменной учетки по SID этой учетной записи?  [new]
ТАРАКАН
Member

Откуда:
Сообщений: 439
создаем функцию:


CREATE FUNCTION fn_SIDToString
(
  @BinSID AS VARBINARY(100)
)
RETURNS VARCHAR(100)
AS BEGIN

  IF LEN(@BinSID) % 4 <> 0 RETURN(NULL)

  DECLARE @StringSID VARCHAR(100)
  DECLARE @i AS INT
  DECLARE @j AS INT

  SELECT @StringSID = 'S-'
     + CONVERT(VARCHAR, CONVERT(INT, CONVERT(VARBINARY, SUBSTRING(@BinSID, 1, 1)))) 
  SELECT @StringSID = @StringSID + '-'
     + CONVERT(VARCHAR, CONVERT(INT, CONVERT(VARBINARY, SUBSTRING(@BinSID, 3, 6))))

  SET @j = 9
  SET @i = LEN(@BinSID)

  WHILE @j < @i
  BEGIN
    DECLARE @val BINARY(4)
    SELECT @val = SUBSTRING(@BinSID, @j, 4)
    SELECT @StringSID = @StringSID + '-'
      + CONVERT(VARCHAR, CONVERT(BIGINT, CONVERT(VARBINARY, REVERSE(CONVERT(VARBINARY, @val))))) 
    SET @j = @j + 4
  END
  RETURN ( @StringSID ) 
END

после выполняем:
SELECT SUSER_NAME(), SUSER_SID(), dbo.fn_SIDToString(SUSER_SID())

И радуемся жизни!
25 сен 09, 10:52    [7706973]     Ответить | Цитировать Сообщить модератору
 Re: Как получить имя доменной учетки по SID этой учетной записи?  [new]
Tepes
Member

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

Спасибо. теперь есть проблема с таблицей
Server: Msg 208, Level 16, State 1, Procedure f_StrToTable, Line 2
Invalid object name 'dbo.Numbers'.
25 сен 09, 10:57    [7707002]     Ответить | Цитировать Сообщить модератору
 Re: Как получить имя доменной учетки по SID этой учетной записи?  [new]
Tepes
Member

Откуда:
Сообщений: 40
ТАРАКАН,

Вот за это огроменное спасибо!
25 сен 09, 11:00    [7707020]     Ответить | Цитировать Сообщить модератору
 Re: Как получить имя доменной учетки по SID этой учетной записи?  [new]
ТАРАКАН
Member

Откуда:
Сообщений: 439
после создания функции указанной выше fn_SIDToString можно сделать еще проверку через AD:

SELECT  displayName,SUSER_NAME(), SUSER_SID(), dbo.fn_SIDToString(objectSid)
FROM (SELECT * FROM OpenQuery
(
ADSI, 'SELECT 		objectSid , displayName, sAMAccountName
FROM ''LDAP://DC=имя,DC=домен,DC=ru'' 
WHERE objectCategory = ''Person'' AND objectClass = ''user''
')) tabl1
where objectSid=(select SUSER_SID())
25 сен 09, 11:01    [7707026]     Ответить | Цитировать Сообщить модератору
 Re: Как получить имя доменной учетки по SID этой учетной записи?  [new]
Glory
Member

Откуда:
Сообщений: 104760
ТАРАКАН
после создания функции указанной выше fn_SIDToString можно сделать еще проверку через AD:

SUSER_SNAME ( [ server_user_sid ] ) и так может сделать такую проверку
25 сен 09, 11:04    [7707041]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить