I SID sotto forma di 0x01020000000000052000000021020000
non 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 .