Les SID sous forme de 0x01020000000000052000000021020000
ne sont pas des SID "SQL Server". Il s'agit simplement de la valeur binaire sous-jacente du SID. Une autre forme qu'il peut prendre (et toujours avoir la même valeur) est la forme "chaîne" ( SID String Format Syntax ), qui ressemble à celle-ci S-1-5-32-545
(désignée comme étant le format "SDDL" dans certaines documentations MSDN, bien que SDDL couvre plus que juste SID). Les deux sont le même SID Windows. Cette configuration est similaire à la façon dont les GUID ont une représentation sous forme de chaîne différente de leur valeur binaire sous-jacente.
Il existe une fonction intégrée non documentée SID_BINARY
, qui effectue cette traduction du formulaire SDDL au format binaire:
SELECT SID_BINARY(N'S-1-5-21-408552231-458724953-3089381293-513');
-- 0x01050000000000051500000027035A185996571BAD3724B801020000
Cette fonction devrait fonctionner sur la plupart des types de SID. Les deux requêtes suivantes montrent qu'il fonctionne correctement pour les certificats et les clés asymétriques (vous pouvez vérifier la traduction appropriée car ces deux vues de catalogue système contiennent les deux formes du SID). Et cela fonctionnerait pour toutes les connexions créées à partir de certificats et de clés asymétriques, car les SID pour ceux (à la fois les connexions et les utilisateurs) sont les certificats / clés 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;
Veuillez noter que les principaux des types "S" (connexion SQL Server / utilisateur SQL Server) et "R" (rôle serveur / rôle de base de données) n'ont pas de représentation SDDL car ils ne sont pas des SID Windows. Ces deux types de principaux ont des SID propres à SQL Server, donc je suppose que ce seraient des "SID SQL Server", bien que la distinction (entre les SID Windows et SID SQL Server) soit de valeur et non de forme.
Si vous ne souhaitez pas utiliser une fonction non documentée, cela peut également être accompli via SQLCLR en utilisant la classe SecurityIdentifier de .NET .
Les fonctions SQLCLR pré-faites pour effectuer ces traductions peuvent être trouvées dans la version gratuite de la bibliothèque SQL # (que j'ai créée): Convert_SddlSidToBinary (fait la même traduction que SID_BINARY
) et Convert_BinarySidToSddl .