Los SID en forma de 0x01020000000000052000000021020000
no son SID "SQL Server". Ese es simplemente el valor binario subyacente del SID. Otra forma que puede tomar (y seguir siendo el mismo valor) es la forma de "cadena" ( sintaxis de formato de cadena SID ), que se parece a S-1-5-32-545
(se conoce como el formato "SDDL" en alguna documentación de MSDN, aunque SDDL cubre más que solo SID). Ambos son el mismo SID de Windows. Esta configuración es similar a cómo los GUID tienen una representación de cadena que es diferente de su valor binario subyacente.
Hay una función incorporada no documentada SID_BINARY
que hace esta traducción del formulario SDDL al formato binario:
SELECT SID_BINARY(N'S-1-5-21-408552231-458724953-3089381293-513');
-- 0x01050000000000051500000027035A185996571BAD3724B801020000
Esta función debería funcionar en la mayoría de los tipos de SID. Las siguientes dos consultas muestran que funciona correctamente para Certificados y Claves asimétricas (puede verificar la traducción correcta ya que estas dos vistas de catálogo del sistema tienen ambas formas del SID). Y funcionaría para todos los inicios de sesión creados a partir de certificados y claves asimétricas, ya que los SID para aquellos (tanto inicios de sesión como usuarios) son los SID de Cert / Key:
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;
Tenga en cuenta que los principios de los tipos "S" (inicio de sesión de SQL Server / usuario de SQL Server) y "R" (rol de servidor / rol de base de datos) no tienen una representación SDDL ya que no son SID de Windows. Estos dos tipos de directores tienen SQL Server SID properietary, así que supongo que éstas serían "Servidor SQL" SID, aunque la distinción (entre Windows SID SID y SQL Server) es de valor y no forma.
Si no desea utilizar una función no documentada, esto también se puede lograr a través de SQLCLR utilizando la clase SecurityIdentifier de .NET .
Las funciones SQLCLR prefabricadas para hacer estas traducciones se pueden encontrar en la versión gratuita de la biblioteca SQL # (que creé): Convert_SddlSidToBinary (hace la misma traducción que SID_BINARY
) y Convert_BinarySidToSddl .