Làm cách nào để tôi dịch Windows SID sang SQL Server server_user_sid?


8

Có chức năng SQL Server tuyệt vời này SUSER_SNAMEgiúp dịch server_user_sid thành tên người dùng. Điều này rất hữu ích để dịch các Windows SID nổi tiếng sang tên người dùng (có khả năng được bản địa hóa).

Thí dụ:

SELECT SUSER_SNAME(0x01020000000000052000000021020000)

-- yields 'BUILTIN\USERS' (or, on a German system, 'VORDEFINIERT\Benutzer')

Với một số Googling và dùng thử và lỗi (= tạo người dùng theo cách thủ công và kiểm tra sys.server_principalssau đó) tôi đã xác định các tương đương sau:

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

Thuật toán để chuyển đổi Windows SID sang SQL Server server_user_sids là gì?

Câu trả lời:


12

SID ở dạng 0x01020000000000052000000021020000không phải là SID "SQL Server". Đó chỉ đơn giản là giá trị nhị phân cơ bản của SID. Một dạng khác mà nó có thể có (và vẫn là cùng một giá trị) là dạng "chuỗi" ( Cú pháp định dạng chuỗi SID ), trông giống như S-1-5-32-545(được gọi là định dạng "SDDL" trong một số tài liệu MSDN, mặc dù SDDL không chỉ bao gồm SID). Cả hai đều là Windows SID giống nhau. Thiết lập này tương tự như cách GUID có biểu diễn chuỗi khác với giá trị nhị phân cơ bản của chúng.

Có một hàm dựng sẵn không có giấy tờ SID_BINARY, dịch này chuyển từ dạng SDDL sang dạng nhị phân:

SELECT SID_BINARY(N'S-1-5-21-408552231-458724953-3089381293-513');
-- 0x01050000000000051500000027035A185996571BAD3724B801020000

Chức năng này sẽ hoạt động trên hầu hết các loại SID. Hai truy vấn sau đây cho thấy nó hoạt động chính xác cho Chứng chỉ và Khóa không đối xứng (bạn có thể xác minh bản dịch phù hợp vì hai chế độ xem danh mục hệ thống này có cả hai dạng SID trong đó). Và nó sẽ hoạt động đối với mọi Thông tin đăng nhập được tạo từ Chứng chỉ và Khóa không đối xứng vì SID cho những người đó (cả Đăng nhập và Người dùng) đều là Chứng chỉ / Khóa 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;

Xin lưu ý rằng các nguyên tắc loại "S" (Đăng nhập máy chủ SQL / Người dùng máy chủ SQL) và "R" (Vai trò máy chủ / Vai trò cơ sở dữ liệu) không có đại diện SDDL vì chúng không phải là SID Windows. Hai loại hiệu trưởng này có SIDs thích hợp của SQL Server, vì vậy tôi đoán chúng sẽ là "SIDs SQL Server", mặc dù sự khác biệt (giữa SID của Windows và SID của SQL Server) có giá trị và không phải là hình thức.

Nếu bạn không muốn sử dụng một chức năng không có giấy tờ, điều này cũng có thể được thực hiện thông qua SQLCLR bằng cách sử dụng lớp SecurityIdentifier của .NET .

Các hàm SQLCLR được tạo sẵn để thực hiện các bản dịch này có thể được tìm thấy trong phiên bản Miễn phí của thư viện SQL # (mà tôi đã tạo): Convert_SddlSidToBinary (thực hiện cùng một bản dịch như SID_BINARY) và Convert_BinarySidToSddl .


2

sys.server_principals là bạn của bạn vì nó hiển thị phiên bản Windows của SID.

Tham khảo giải pháp của Aaron: Bản đồ giữa SID của SQL Server và SID của Windows

Để hoàn thiện, bên dưới là mã:

CREATE TABLE dbo.TinyNumbers(Number TINYINT PRIMARY KEY);

INSERT dbo.TinyNumbers(Number) 
  SELECT TOP (256) ROW_NUMBER() OVER (ORDER BY number)-1 
  FROM master.dbo.spt_values;

CREATE FUNCTION dbo.GetWindowsSID
(
  @sid VARBINARY(85)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
  RETURN 
  (
    SELECT ADsid = STUFF((SELECT '-' + part FROM 
    (
      SELECT Number = -1, part = 'S-' 
        + CONVERT(VARCHAR(30),CONVERT(TINYINT,CONVERT(VARBINARY(30),LEFT(@sid,1)))) 
        + '-' 
        + CONVERT(VARCHAR(30),CONVERT(INT,CONVERT(VARBINARY(30),SUBSTRING(@sid,3,6))))
      UNION ALL
      SELECT TOP ((LEN(@sid)-5)/4) Number, 
     part = CONVERT(VARCHAR(30),CONVERT(BIGINT,CONVERT(VARBINARY(30), 
  REVERSE(CONVERT(VARBINARY(30),SUBSTRING(@sid,9+Number*4,4)))))) 
      FROM dbo.TinyNumbers ORDER BY Number
    ) AS x ORDER BY Number
    FOR XML PATH(''), TYPE).value(N'.[1]','nvarchar(max)'),1,1,'')
  );
GO

CREATE VIEW dbo.server_principal_sids
AS
  SELECT sp.name, sp.[sid], ad.ADsid, sp.type_desc
    FROM sys.server_principals AS sp
    CROSS APPLY dbo.GetWindowsSID(sp.[sid]) AS ad
    WHERE [type] IN ('U','G') 
    AND LEN([sid]) % 4 = 0;

-- select the data
SELECT name,[sid],ADSid,type_desc FROM dbo.server_principal_sids;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.