Sql-Server

如何將 Windows SID 轉換為 SQL Server server_user_sid?

  • February 20, 2020

有一個很好的 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 的算法是什麼?

形式的 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

此功能應該適用於大多數 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

引用自:https://dba.stackexchange.com/questions/175271