Il peut arriver parfois de vouloir retrouver un login Windows via son SID (ou Security Identifier) au format Windows sur une instance SQL Server. Le problème est que le SID stocké sur SQL Server est au format varbinary(85). Il nous faut donc formater la valeur de cette colonne pour pouvoir la mettre au format Windows S-X-X-XX-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXX-XXXX.
En connaissant la forme d’un SID Windows on peut donc retrouver le retrouver à partir du SID stocké dans SQL Server. Pour cela on peut créer une fonction de la sorte (que l’on peut retrouver sur beaucoup de sites internet, je ne l’ai pas inventé ) :
CREATE FUNCTION fn_SIDToString
(
@BinSID AS VARBINARY(100)
)
RETURNS VARCHAR(100)
AS BEGINIF LEN(@BinSID) % 4 <> 0 RETURN(NULL)
DECLARE @StringSID VARCHAR(100)
DECLARE @i AS INT
DECLARE @j AS INTSELECT @StringSID = ‘S-‘
+ CONVERT(VARCHAR, CONVERT(INT, CONVERT(VARBINARY, SUBSTRING(@BinSID, 1, 1))))
SELECT @StringSID = @StringSID + ‘-‘
+ CONVERT(VARCHAR, CONVERT(INT, CONVERT(VARBINARY, SUBSTRING(@BinSID, 3, 6))))SET @j = 9
SET @i = LEN(@BinSID)WHILE @j < @i
BEGIN
DECLARE @val BINARY(4)
SELECT @val = SUBSTRING(@BinSID, @j, 4)
SELECT @StringSID = @StringSID + ‘-‘
+ CONVERT(VARCHAR, CONVERT(BIGINT, CONVERT(VARBINARY, REVERSE(CONVERT(VARBINARY, @val)))))
SET @j = @j + 4
END
RETURN ( @StringSID )
END
Il suffit ensuite d’utiliser la fonction précédemment créée pour retrouver notre utilisateur via son SID Windows :
SELECT
name,
sid,
type,
type_desc
FROM sys.server_principals
WHERE dbo.fn_SIDToString(sid) = ‘S-1-5-21-1560703034-4098287726-863964163-8814′
qui donne
David BARBARIN (Mikedavem)
MVP SQL Server