如何將 Windows SID 轉換為 SQL Server server_user_sid?
有一個很好的 SQL Server 函式
SUSER_SNAME
,可以將server_user_sid轉換為使用者名。這對於將眾所周知的 Windows SID 轉換為(可能本地化的)使用者名很有用。例子:
SELECT SUSER_SNAME(0x01020000000000052000000021020000) -- yields 'BUILTIN\USERS' (or, on a German system, 'VORDEFINIERT\Benutzer')
通過一些Google搜尋和反複試驗(=手動創建使用者並
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
將 Windows SID 轉換為 SQL Server server_user_sids 的算法是什麼?
形式的 SID
0x01020000000000052000000021020000
不是“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
此功能應該適用於大多數 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;
請注意,類型“S”(SQL Server 登錄/SQL Server 使用者)和“R”(伺服器角色/數據庫角色)的主體沒有 SDDL 表示,因為它們不是 Windows SID。這兩種類型的主體具有 SQL Server 專有 SID,所以我猜這些將是“SQL Server SID”,儘管區別(在 Windows SID 和 SQL Server SID 之間)是有價值的,而不是形式上的。
如果您不想使用未記錄的函式,也可以通過 SQLCLR 使用 .NET 的SecurityIdentifier 類來完成。
可以在免費版本的SQL#庫(我創建的)中找到用於執行這些轉換的預製 SQLCLR 函式: Convert_SddlSidToBinary(與 進行相同的轉換
SID_BINARY
)和Convert_BinarySidToSddl。