Windows SIDをSQL Server server_user_sidに変換するにはどうすればよいですか?


8

server_user_sidをユーザー名にSUSER_SNAME変換するこの素晴らしいSQL Server関数があります。これは、よく知られたWindows SIDを(潜在的にローカライズされた)ユーザー名に変換するのに役立ちます。

例:

SELECT SUSER_SNAME(0x01020000000000052000000021020000)

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

いくつかのグーグルと試行錯誤(=ユーザーを手動で作成し、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に変換するアルゴリズムは何ですか?

回答:


12

の形式のSID 0x01020000000000052000000021020000は「SQL Server」SID ではありません。これは単にSIDの基礎となるバイナリ値です。それが取ることができる(そして同じ値である)別の形式は、「文字列」形式(SID文字列形式構文S-1-5-32-545です。 SID)。どちらも同じWindows SIDです。このセットアップは、GUIDの基礎となるバイナリ値とは異なる文字列表現がどのようにあるかに似ています。

文書化されていない組み込み関数があります。これは、SID_BINARYSDDL形式からバイナリ形式へのこの変換を実行します。

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

この関数は、ほとんどのSIDタイプで機能します。次の2つのクエリは、証明書と非対称キーに対して正しく機能することを示しています(これらの2つのシステムカタログビューには両方の形式の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"(サーバーロール/データベースロール)のプリンシパルは、Windows SIDではないため、SDDL表現を持たないことに注意してください。これらの2種類のプリンシパルにはSQL Server固有のSIDがあるため、これらは「SQL Server SID」であると思いますが、Windows SIDとSQL Server SIDの違いは価値があり、形式ではありません。

ドキュメントに記載されていない関数を使用したくない場合は、.NETのSecurityIdentifierクラスを使用してSQLCLRでこれを実行することもできます。

これらの変換を行うための既成のSQLCLR関数は、SQL#ライブラリの無料バージョン(私が作成したもの)にあります:Convert_SddlSidToBinary(と同じ変換SID_BINARY行います)およびConvert_BinarySidToSddl


2

sys.server_principals WindowsバージョンのSIDを公開するので、あなたの友達です。

アーロンのソリューションを参照してください:SQL Server SIDとWindows SID間のマッピング

完全を期すために、以下にコードを示します。

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;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.