Trouver un login de type Windows par son SID Windows

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 BEGIN

  IF LEN(@BinSID) % 4 <> 0 RETURN(NULL)

  DECLARE @StringSID VARCHAR(100)
  DECLARE @i AS INT
  DECLARE @j AS INT

  SELECT @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

image

 

David BARBARIN (Mikedavem)
MVP SQL Server

Laisser un commentaire