¿Cómo traduzco un SID de Windows a un SQL Server server_user_sid?


8

Existe esta agradable función de SQL Server SUSER_SNAMEque traduce un server_user_sid a un nombre de usuario. Esto es útil para traducir los SID de Windows conocidos a nombres de usuario (potencialmente localizados).

Ejemplo:

SELECT SUSER_SNAME(0x01020000000000052000000021020000)

-- yields 'BUILTIN\USERS' (or, on a German system, 'VORDEFINIERT\Benutzer')

Con algunas búsquedas en Google y prueba y error (= crear el usuario manualmente y verificar sys.server_principalsdespués), he determinado las siguientes equivalencias:

Built-in User/Group    Windows SID      SQL Server server_user_sid

BUILTIN\USERS          S-1-5-32-545     0x01020000000000052000000021020000
NT AUTHORITY\SYSTEM    S-1-5-18         0x010100000000000512000000

¿Cuál es el algoritmo para convertir los SID de Windows a SQL Server server_user_sids?

Respuestas:


12

Los SID en forma de 0x01020000000000052000000021020000no 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_BINARYque 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 .


2

sys.server_principals es tu amigo ya que expone la versión de Windows del SID.

Consulte la solución de Aaron: Mapa entre los SID de SQL Server y los SID de Windows

Para completar, a continuación se muestra el código:

CREATE TABLE dbo.TinyNumbers(Number TINYINT PRIMARY KEY);

INSERT dbo.TinyNumbers(Number) 
  SELECT TOP (256) ROW_NUMBER() OVER (ORDER BY number)-1 
  FROM master.dbo.spt_values;

CREATE FUNCTION dbo.GetWindowsSID
(
  @sid VARBINARY(85)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
  RETURN 
  (
    SELECT ADsid = STUFF((SELECT '-' + part FROM 
    (
      SELECT Number = -1, part = 'S-' 
        + CONVERT(VARCHAR(30),CONVERT(TINYINT,CONVERT(VARBINARY(30),LEFT(@sid,1)))) 
        + '-' 
        + CONVERT(VARCHAR(30),CONVERT(INT,CONVERT(VARBINARY(30),SUBSTRING(@sid,3,6))))
      UNION ALL
      SELECT TOP ((LEN(@sid)-5)/4) Number, 
     part = CONVERT(VARCHAR(30),CONVERT(BIGINT,CONVERT(VARBINARY(30), 
  REVERSE(CONVERT(VARBINARY(30),SUBSTRING(@sid,9+Number*4,4)))))) 
      FROM dbo.TinyNumbers ORDER BY Number
    ) AS x ORDER BY Number
    FOR XML PATH(''), TYPE).value(N'.[1]','nvarchar(max)'),1,1,'')
  );
GO

CREATE VIEW dbo.server_principal_sids
AS
  SELECT sp.name, sp.[sid], ad.ADsid, sp.type_desc
    FROM sys.server_principals AS sp
    CROSS APPLY dbo.GetWindowsSID(sp.[sid]) AS ad
    WHERE [type] IN ('U','G') 
    AND LEN([sid]) % 4 = 0;

-- select the data
SELECT name,[sid],ADSid,type_desc FROM dbo.server_principal_sids;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.