Come posso tradurre un SID di Windows in un SQL Server server_utente_sid?


8

C'è questa bella funzione di SQL Server SUSER_SNAMEche traduce server_user_sid in un nome utente. Ciò è utile per tradurre noti SID di Windows in nomi utente (potenzialmente localizzati).

Esempio:

SELECT SUSER_SNAME(0x01020000000000052000000021020000)

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

Con alcuni googling e tentativi ed errori (= crea l'utente manualmente e controlla sys.server_principalssuccessivamente) ho determinato le seguenti equivalenze:

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

Qual è l'algoritmo per convertire i SID di Windows in SQL Server server_user_sids?

Risposte:


12

I SID sotto forma di 0x01020000000000052000000021020000non sono SID "SQL Server". Questo è semplicemente il valore binario sottostante del SID. Un'altra forma che può assumere (ed essere sempre lo stesso valore) è la forma "stringa" ( sintassi del formato stringa SID ), che sembra S-1-5-32-545(indicato come il formato "SDDL" in alcuni documenti MSDN, sebbene SDDL copra più di un semplice SID). Entrambi sono lo stesso SID di Windows. Questa configurazione è simile al modo in cui i GUID hanno una rappresentazione di stringa diversa dal loro valore binario sottostante.

Esiste una funzione incorporata non documentata SID_BINARY, che esegue questa traduzione dal modulo SDDL al modulo binario:

SELECT SID_BINARY(N'S-1-5-21-408552231-458724953-3089381293-513');
-- 0x01050000000000051500000027035A185996571BAD3724B801020000

Questa funzione dovrebbe funzionare nella maggior parte dei tipi SID. Le seguenti due query mostrano che funziona correttamente per i certificati e le chiavi asimmetriche (è possibile verificare la traduzione corretta poiché queste due viste del catalogo di sistema contengono entrambe le forme del SID). E funzionerebbe per tutti gli accessi creati da certificati e chiavi asimmetriche poiché i SID per quegli (sia gli accessi che gli utenti) sono i SID 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;

Si noti che le entità di tipo "S" (Accesso al server SQL / Utente SQL Server) e "R" (Ruolo del server / Ruolo del database) non hanno una rappresentazione SDDL in quanto non sono SID di Windows. Questi due tipi di entità hanno SID properietary di SQL Server, quindi suppongo che questi sarebbero "SID di SQL Server", sebbene la distinzione (tra SID di Windows e SID di SQL Server) sia di valore e non di forma.

Se non si desidera utilizzare una funzione non documentata, è possibile farlo anche tramite SQLCLR utilizzando la classe SecurityIdentifier di .NET .

Le funzioni SQLCLR predefinite per eseguire queste traduzioni sono disponibili nella versione gratuita della libreria SQL # (che ho creato): Convert_SddlSidToBinary (esegue la stessa traduzione di SID_BINARY) e Convert_BinarySidToSddl .


2

sys.server_principals è tuo amico poiché espone la versione Windows del SID.

Fare riferimento alla soluzione di Aaron: mappa tra SID di SQL Server e SID di Windows

Per completezza, di seguito è riportato il codice:

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;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.