Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 И снова SID  [new]
MedBrat
Member

Откуда: Санкт-Петербург
Сообщений: 348
Товарищи, выручайте. у меня есть алгоритм, который умеет развертывать SID в обычные логин, но не могу допереть, как из него собрать обратно SID.
5 авг 14, 15:22    [16401880]     Ответить | Цитировать Сообщить модератору
 Re: И снова SID  [new]
Glory
Member

Откуда:
Сообщений: 104751
А MSSQL тут причем ?
5 авг 14, 15:24    [16401887]     Ответить | Цитировать Сообщить модератору
 Re: И снова SID  [new]
MedBrat
Member

Откуда: Санкт-Петербург
Сообщений: 348
Glory
А MSSQL тут причем ?


Ну, ибо логины хранятся в базе именно в таком виде. Ниже привожу запрос, который из SID взращает логин пользователя
в читабельном виде. Мне бы напротив хотелось для определенных целей конвертировать его в SID, но не могу сообразить,
как написать обратную функцию.

автор
IF OBJECT_ID (N'dbo.StringSIDToLogin', N'FN') IS NOT NULL
DROP FUNCTION dbo.StringSIDToLogin
GO
CREATE FUNCTION dbo.StringSIDToLogin (@MYSID AS VARCHAR(255))
RETURNS VARCHAR(300)
AS
BEGIN

--получаем бинарное значение

DECLARE @A AS BIGINT ,@B AS BIGINT ,@C AS BIGINT ,@D AS BIGINT
SET @MYSID = REVERSE(@MYSID)
SET @D = REVERSE(SUBSTRING(@MYSID,1,CHARINDEX('-',@MYSID)-1))
SET @MYSID = SUBSTRING(@MYSID,CHARINDEX('-',@MYSID)+1,255)
SET @C = REVERSE(SUBSTRING(@MYSID,1,CHARINDEX('-',@MYSID)-1))
SET @MYSID = SUBSTRING(@MYSID,CHARINDEX('-',@MYSID)+1,255)
SET @B = REVERSE(SUBSTRING(@MYSID,1,CHARINDEX('-',@MYSID)-1))
SET @MYSID = SUBSTRING(@MYSID,CHARINDEX('-',@MYSID)+1,255)
SET @A = REVERSE(SUBSTRING(@MYSID,1,CHARINDEX('-',@MYSID)-1))
declare @sid_sql VARBINARY(100)
DECLARE @StrLogin VARCHAR(100)
set @sid_sql= 0x010500000000000515000000
+ CONVERT(VARBINARY,REVERSE(CONVERT(BINARY(4),@A)))
+ CONVERT(VARBINARY,REVERSE(CONVERT(BINARY(4),@B)))
+ CONVERT(VARBINARY,REVERSE(CONVERT(BINARY(4),@C)))
+ CONVERT(VARBINARY,REVERSE(CONVERT(BINARY(4),@D)))

--теперь с помощью стандартной функции MS SQL находим логин и убираем префикс домена

set @StrLogin=SUSER_SNAME(@sid_sql)
set @StrLogin=REPLACE (@StrLogin,'dom\','')
RETURN (@StrLogin)
END
GO
5 авг 14, 15:34    [16401940]     Ответить | Цитировать Сообщить модератору
 Re: И снова SID  [new]
Glory
Member

Откуда:
Сообщений: 104751
MedBrat
но не могу сообразить,
как написать обратную функцию.

Написать к каждому CONVERT-у противоположный CONVERT
5 авг 14, 15:38    [16401960]     Ответить | Цитировать Сообщить модератору
 Re: И снова SID  [new]
MedBrat
Member

Откуда: Санкт-Петербург
Сообщений: 348
Glory
MedBrat
но не могу сообразить,
как написать обратную функцию.

Написать к каждому CONVERT-у противоположный CONVERT


Подскажи как на примере одно блока, пожалуйста.
5 авг 14, 15:47    [16401989]     Ответить | Цитировать Сообщить модератору
 Re: И снова SID  [new]
Glory
Member

Откуда:
Сообщений: 104751
MedBrat
Подскажи как на примере одно блока, пожалуйста.

Вы что не в состоянии понять, что делает CONVERT(VARBINARY,REVERSE(CONVERT(BINARY(4),@D))) ?
Он 4 байта переставляет в обратном порядке.
Как вы думаете, какой будет обратный алгоритм ?
5 авг 14, 15:50    [16402004]     Ответить | Цитировать Сообщить модератору
 Re: И снова SID  [new]
MedBrat
Member

Откуда: Санкт-Петербург
Сообщений: 348
Glory
MedBrat
Подскажи как на примере одно блока, пожалуйста.

Вы что не в состоянии понять, что делает CONVERT(VARBINARY,REVERSE(CONVERT(BINARY(4),@D))) ?
Он 4 байта переставляет в обратном порядке.
Как вы думаете, какой будет обратный алгоритм ?


Глори, вы как всегда неподражаемы.

Если спрашиваю, то есть определенные сложности. Тут не только перевернуть, а что такое вот это 0x010500000000000515000000 ? Я что-то не очень для себя могу понять, как из символьных переменных он делает цифровые. Из цифр штатной функцией он успешно преобразует нормальный логин, вернее из SID.

Если это действительно так легко, то помогите вашему тупому коллеге. Я вот не понимаю.

S-1-5-21-2477542640-2347204690-64716585-10127 вот пример SID.
5 авг 14, 16:16    [16402189]     Ответить | Цитировать Сообщить модератору
 Re: И снова SID  [new]
Glory
Member

Откуда:
Сообщений: 104751
MedBrat
Если спрашиваю, то есть определенные сложности.

Я вижу.
Если REVERSE поменял в строку ABCD на DCBA, то какую же функцию использовать для предобразования DCBA обратно в ABCD ???
Дайте подумать, неужели опять REVERSE ??
Боже, как трудно жить !
5 авг 14, 16:19    [16402212]     Ответить | Цитировать Сообщить модератору
 Re: И снова SID  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Читайте первоисточник: https://www.sql.ru/forum/698225/kak-poluchit-imya-domennoy-uchetki-po-sid-etoy-uchetnoy-zapisi
5 авг 14, 16:51    [16402456]     Ответить | Цитировать Сообщить модератору
 Re: И снова SID  [new]
aleks2
Guest
Glory
MedBrat
Если спрашиваю, то есть определенные сложности.

Я вижу.
Если REVERSE поменял в строку ABCD на DCBA, то какую же функцию использовать для предобразования DCBA обратно в ABCD ???
Дайте подумать, неужели опять REVERSE ??
Боже, как трудно жить !


Это ненужное усложнение проблемы.
Тредстартера надо прост ткнуть мордой в SUSER_SID()

select ORIGINAL_LOGIN(), SUSER_SID(ORIGINAL_LOGIN())
5 авг 14, 17:50    [16402779]     Ответить | Цитировать Сообщить модератору
 Re: И снова SID  [new]
MedBrat
Member

Откуда: Санкт-Петербург
Сообщений: 348
aleks2
Glory
пропущено...

Я вижу.
Если REVERSE поменял в строку ABCD на DCBA, то какую же функцию использовать для предобразования DCBA обратно в ABCD ???
Дайте подумать, неужели опять REVERSE ??
Боже, как трудно жить !


Это ненужное усложнение проблемы.
Тредстартера надо прост ткнуть мордой в SUSER_SID()

select ORIGINAL_LOGIN(), SUSER_SID(ORIGINAL_LOGIN())


за Тредстартера спасибо, конечно, но совет действительно более полезный, чем был выше.
6 авг 14, 12:04    [16405697]     Ответить | Цитировать Сообщить модератору
 Re: И снова SID  [new]
Glory
Member

Откуда:
Сообщений: 104751
MedBrat
но совет действительно более полезный, чем был выше.

Если бы кто-то потрудился открыть в хелпе статью про SUSER_SNAME, то он бы с удивлением обнаружил существование обратной функции.
6 авг 14, 12:16    [16405778]     Ответить | Цитировать Сообщить модератору
 Re: И снова SID  [new]
MedBrat
Member

Откуда: Санкт-Петербург
Сообщений: 348
Glory
MedBrat
но совет действительно более полезный, чем был выше.

Если бы кто-то потрудился открыть в хелпе статью про SUSER_SNAME, то он бы с удивлением обнаружил существование обратной функции.


К сожалению не было времени заниматься этой проблемой, но теперь оно немножко высвободилось. Функция SUSER_SID возвращает в формате 0x010500000000000515000000F04CAC935280E78B297FDB038F270000. Все заметчально, но в базе у меня хранися в формате S-1-5-21-2477542640-2347204690-64716585-10127. В чем загвоздка. Переставлять реверсом порядок не сложно, но следует еще вернуть из двоичного значения в некое другое.

CONVERT(VARBINARY,REVERSE(CONVERT(BINARY(4),@A))) в общем, меня интересует, как сделать обратное преобразование из
CONVERT(BINARY(4),@A)). Это видимо очень просто для Вас, Glory, а потому прошу помочь вашему малоопытному коллеге.
27 авг 14, 11:07    [16498796]     Ответить | Цитировать Сообщить модератору
 Re: И снова SID  [new]
Glory
Member

Откуда:
Сообщений: 104751
MedBrat
Функция SUSER_SID возвращает в формате 0x010500000000000515000000F04CAC935280E78B297FDB038F270000. Все заметчально, но в базе у меня хранися в формате S-1-5-21-2477542640-2347204690-64716585-10127. В чем загвоздка.

А текст функции, который вы опубликовали, разве не делает из второго первое ?
Вот это вот самое -
set @sid_sql= 0x010500000000000515000000
+ CONVERT(VARBINARY,REVERSE(CONVERT(BINARY(4),@A)))
+ CONVERT(VARBINARY,REVERSE(CONVERT(BINARY(4),@B)))
+ CONVERT(VARBINARY,REVERSE(CONVERT(BINARY(4),@C)))
+ CONVERT(VARBINARY,REVERSE(CONVERT(BINARY(4),@D)))
27 авг 14, 11:15    [16498867]     Ответить | Цитировать Сообщить модератору
 Re: И снова SID  [new]
MedBrat
Member

Откуда: Санкт-Петербург
Сообщений: 348
Glory
MedBrat
Функция SUSER_SID возвращает в формате 0x010500000000000515000000F04CAC935280E78B297FDB038F270000. Все заметчально, но в базе у меня хранися в формате S-1-5-21-2477542640-2347204690-64716585-10127. В чем загвоздка.

А текст функции, который вы опубликовали, разве не делает из второго первое ?
Вот это вот самое -
set @sid_sql= 0x010500000000000515000000
+ CONVERT(VARBINARY,REVERSE(CONVERT(BINARY(4),@A)))
+ CONVERT(VARBINARY,REVERSE(CONVERT(BINARY(4),@B)))
+ CONVERT(VARBINARY,REVERSE(CONVERT(BINARY(4),@C)))
+ CONVERT(VARBINARY,REVERSE(CONVERT(BINARY(4),@D)))


Не совсем. Он делает
S-1-5-21-2477542640-2347204690-64716585-10127 - > 0x010500000000000515000000F04CAC935280E78B297FDB038F270000
Функция SUSER_SID -> 0x010500000000000515000000F04CAC935280E78B297FDB038F270000

А теперь мне надо из 0x010500000000000515000000F04CAC935280E78B297FDB038F270000 -> S-1-5-21-2477542640-2347204690-64716585-10127
27 авг 14, 11:18    [16498906]     Ответить | Цитировать Сообщить модератору
 Re: И снова SID  [new]
Glory
Member

Откуда:
Сообщений: 104751
MedBrat
Не совсем. Он делает
S-1-5-21-2477542640-2347204690-64716585-10127 - > 0x010500000000000515000000F04CAC935280E78B297FDB038F270000
Функция SUSER_SID -> 0x010500000000000515000000F04CAC935280E78B297FDB038F270000


И что мешает сравнить " S-1-5-21-2477542640-2347204690-64716585-10127 - > 0x010500000000000515000000F04CAC935280E78B297FDB038F270000" с SUSER_SID ?

MedBrat
А теперь мне надо из 0x010500000000000515000000F04CAC935280E78B297FDB038F270000 -> S-1-5-21-2477542640-2347204690-64716585-10127

Ну так возьмите текст функции и напишите к каждой команде обратное преобразование
27 авг 14, 11:22    [16498940]     Ответить | Цитировать Сообщить модератору
 Re: И снова SID  [new]
MedBrat
Member

Откуда: Санкт-Петербург
Сообщений: 348
Glory
MedBrat
Не совсем. Он делает
S-1-5-21-2477542640-2347204690-64716585-10127 - > 0x010500000000000515000000F04CAC935280E78B297FDB038F270000
Функция SUSER_SID -> 0x010500000000000515000000F04CAC935280E78B297FDB038F270000


И что мешает сравнить " S-1-5-21-2477542640-2347204690-64716585-10127 - > 0x010500000000000515000000F04CAC935280E78B297FDB038F270000" с SUSER_SID ?

MedBrat
А теперь мне надо из 0x010500000000000515000000F04CAC935280E78B297FDB038F270000 -> S-1-5-21-2477542640-2347204690-64716585-10127

Ну так возьмите текст функции и напишите к каждой команде обратное преобразование


Еще раз - я не знаю как это сделать. Меня инетерсует как из [b]двоички вернуть в это состояние?[/b]
27 авг 14, 11:49    [16499174]     Ответить | Цитировать Сообщить модератору
 Re: И снова SID  [new]
Glory
Member

Откуда:
Сообщений: 104751
MedBrat
Еще раз - я не знаю как это сделать.

Хорошее объяснение

MedBrat
Меня инетерсует как из [b]двоички вернуть в это состояние?[/b]

тогда изучайте функционал языка
27 авг 14, 11:51    [16499194]     Ответить | Цитировать Сообщить модератору
 Re: И снова SID  [new]
MedBrat
Member

Откуда: Санкт-Петербург
Сообщений: 348
Glory
MedBrat
Еще раз - я не знаю как это сделать.

Хорошее объяснение

MedBrat
Меня инетерсует как из [b]двоички вернуть в это состояние?[/b]

тогда изучайте функционал языка


Ну так я на форум пришел для получения подсказки, а не кучи сарказма и хейта в отношении себя))). Если не знаешь тоже, так и скажи. Буду изучать сам.
27 авг 14, 11:54    [16499215]     Ответить | Цитировать Сообщить модератору
 Re: И снова SID  [new]
Glory
Member

Откуда:
Сообщений: 104751
MedBrat
Буду изучать сам.

Давай, иди, уже изучать
27 авг 14, 11:58    [16499244]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить