如何将 Windows SID 转换为 SQL Server server_user_sid?

Hei*_*nzi 8 sql-server windows users

有这个很好的 SQL Server 函数SUSER_SNAME可以将server_user_sid转换为用户名。这对于将众所周知的 Windows SID 转换为(可能已本地化的)用户名非常有用。

例子:

SELECT SUSER_SNAME(0x01020000000000052000000021020000)

-- yields 'BUILTIN\USERS' (or, on a German system, 'VORDEFINIERT\Benutzer')
Run Code Online (Sandbox Code Playgroud)

通过一些谷歌搜索和反复试验(=手动创建用户并sys.server_principals随后检查),我确定了以下等效项:

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
Run Code Online (Sandbox Code Playgroud)

将 Windows SID 转换为 SQL Server server_user_sids 的算法是什么?

Sol*_*zky 13

形式的 SID0x01020000000000052000000021020000不是“SQL Server”SID。这只是 SID 的基础二进制值。它可以采用的另一种形式(并且仍然是相同的值)是“字符串”形式(SID 字符串格式语法),它看起来像S-1-5-32-545(在某些 MSDN 文档中称为“SDDL”格式,尽管 SDDL 涵盖的不仅仅是SID)。两者都是相同的 Windows SID。此设置类似于 GUID 具有与其基础二进制值不同的字符串表示形式的方式。

有一个未公开的内置函数 ,SID_BINARY可以将 SDDL 形式转换为二进制形式:

SELECT SID_BINARY(N'S-1-5-21-408552231-458724953-3089381293-513');
-- 0x01050000000000051500000027035A185996571BAD3724B801020000
Run Code Online (Sandbox Code Playgroud)

此功能应适用于大多数 SID 类型。以下两个查询显示它对证书和非对称密钥正常工作(您可以验证正确的转换,因为这两个系统目录视图中包含两种形式的 SID)。它适用于从证书和非对称密钥创建的任何登录名,因为这些(登录名和用户)的 SID 是证书/密钥 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;
Run Code Online (Sandbox Code Playgroud)

请注意,“S”(SQL Server 登录名/SQL Server 用户)和“R”(服务器角色/数据库角色)类型的主体没有 SDDL 表示,因为它们不是 Windows SID。这两种类型的主体具有 SQL Server 专有 SID,所以我猜这些将是“SQL Server SID”,尽管区别(Windows SID 和 SQL Server SID 之间)是有价值的,而不是形式上的。

如果您不想使用未记录的函数,也可以使用 .NET 的SecurityIdentifier 类通过 SQLCLR 来完成。

可以在SQL#库(我创建的)的免费版本中找到用于执行这些转换的预制 SQLCLR 函数:Convert_SddlSidToBinary(与 执行相同的转换SID_BINARY)和Convert_BinarySidToSddl