SID в форме 0x01020000000000052000000021020000
не являются SID "SQL Server". Это просто базовое двоичное значение SID. Другой формой, которую он может принимать (и при этом иметь то же значение), является «строковая» форма ( синтаксис формата строки SID ), которая выглядит S-1-5-32-545
(называемая форматом «SDDL» в некоторой документации MSDN, хотя SDDL охватывает не только МОРС). Оба идентичных идентификатора Windows. Эта настройка аналогична тому, как GUID имеют строковое представление, которое отличается от базового двоичного значения.
Существует недокументированная встроенная функция, SID_BINARY
которая выполняет перевод из формы SDDL в двоичную форму:
SELECT SID_BINARY(N'S-1-5-21-408552231-458724953-3089381293-513');
-- 0x01050000000000051500000027035A185996571BAD3724B801020000
Эта функция должна работать для большинства типов SID. Следующие два запроса показывают, что он работает правильно для сертификатов и асимметричных ключей (вы можете проверить правильность перевода, так как эти два представления системного каталога имеют обе формы SID). И это будет работать для любых входов в систему, созданных из сертификатов и асимметричных ключей, поскольку идентификаторы безопасности для этих (как входов в систему, так и пользователей) являются идентификаторами сертификатов / ключей:
SELECT [name], [string_sid], [sid], SID_BINARY([string_sid])
FROM [master].sys.certificates;
SELECT [name], [string_sid], [sid], SID_BINARY([string_sid])
FROM [master].sys.asymmetric_keys;
Обратите внимание, что принципалы типов «S» (имя пользователя SQL Server / пользователь SQL Server) и «R» (роль сервера / роль базы данных) не имеют представления SDDL, поскольку они не являются SID Windows. Эти два типа участников имеют соответствующие SID SQL Server, поэтому я предполагаю, что это будут «SID SQL Server», хотя различие (между SID Windows и SID SQL Server) имеет значение, а не форму.
Если вы не хотите использовать недокументированную функцию, это также может быть выполнено с помощью SQLCLR с использованием класса .NET SecurityIdentifier .
Предварительно созданные функции SQLCLR для выполнения этих переводов можно найти в бесплатной версии библиотеки SQL # (которую я создал): Convert_SddlSidToBinary (выполняет тот же перевод, что и SID_BINARY
) и Convert_BinarySidToSddl .