20

Active Directory 認証をアプリケーションに組み込み、アプリケーションの内部アカウントをユーザーのドメイン SID にリンクすることを計画しています。バイト配列よりもsidの文字列形式で作業する方が簡単なので、データベースに文字列として保存することを計画していました。SID が切り捨てられないようにするには、フィールドをどのくらいの長さにする必要がありますか?

4

4 に答える 4

34

私も同じ質問をしましたが、正しい答えは次のとおりです。

  • 文字列としてのID:184文字、またはSQL Serverではvarchar(184)
  • 16進数の文字列としてのSID:136文字、またはSQL Serverではvarchar(136)
  • バイナリとしてのSID:68バイト、またはSQL Serverではvarbinary(68)

私は自分で数学をチェックしていませんが、ここで使用されている手法は有効に見えます: https ://groups.google.com/d/msg/microsoft.public.dotnet.security/NpIi7c2Toi8/31SVhcepY58J

2006年8月19日にRussellMangelによって作成されたプログラムを参照してください。これも、参照用にここにコピーされています。

だから私の質問への答えは:

varbinary(68)-純粋なバイナリ
varchar(136)-(68 * 2)= hexString
varchar(184)-SID文字列

テストする小さなプログラムを作成しました。.NET2.0にはSecurityIdentifier.MaxBinaryLengthがあることに注意してください。これについては、知りませんでした。

Console.WriteLine("SID Min. num Bytes: {0}",
SecurityIdentifier.MinBinaryLength);
Console.WriteLine("SID Max. num Bytes: {0}",
SecurityIdentifier.MaxBinaryLength);
Byte[] bytes = new byte[SecurityIdentifier.MaxBinaryLength];
for (Int32 i = 0; i < bytes.Length; i++)
{
    bytes[i] = 0xFF;
}
bytes[0] = 0x01; // Must be 1
bytes[1] = 0x0F; // Max 15 (base10)
SecurityIdentifier sid = new SecurityIdentifier(bytes, 0);
String sidString = sid.ToString();
Console.WriteLine("Max length of SID in String format: {0} ", sidString.Length);
Console.WriteLine(sidString);

結果

SID Min. num Bytes: 8
SID Max. num Bytes: 68
Max length of SID in String format: 184
S-1-281474976710655-4294967295-4294967295-4294967295-4294967295-4294967295-
  4294967295-4294967295-4294967295-4294967295-4294967295-4294967295-
  4294967295-4294967295-4294967295-4294967295 
于 2009-11-24T21:08:37.620 に答える
1

ntseapi_x.h によると:

typedef struct _SID_IDENTIFIER_AUTHORITY {
    UCHAR Value[6];
} SID_IDENTIFIER_AUTHORITY, *PSID_IDENTIFIER_AUTHORITY; 

typedef struct _SID {
   UCHAR Revision;
   UCHAR SubAuthorityCount;
   SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
   ULONG SubAuthority[ANYSIZE_ARRAY];
} SID, *PISID;
    
#define SID_MAX_SUB_AUTHORITIES          (15)

UCHARは、実際には 1 バイト のunsigned charです。ULONGは4 バイトのunsigned longです。

SID の最大データ サイズは 68 バイトです。 UCHAR + UCHAR + (UCHAR * 6) + (ULONG * 15) = 1 + 1 + 6 + 60 = 68

ConvertSidToStringSidを呼び出して得られるように、SID を文字列に変換すると、次のようになります。 L"S-1-5-21-66"

  • "S-1" <= はすべての SID の始まりです
    • 3文字
  • "5" <= は識別子権限です
    • 数値は通常、10 進数として出力されます。1 つの例外として、オーソリティが 4 バイトより大きい場合は、16 進数として出力されます。0x1234...
    • したがって、最大値は「4294967296」または「0xffffffffffff」または 14 文字になります。
  • "21" & "66" <= はサブオーソリティ
    • それぞれ最大「4294967296」または 10 文字で、サブ権限は最大 15 個です。
  • セクションは「-」で区切られています

SID の最大文字列長は 184です: 3 + 1 + 14 + 1 + (10 * 15) + 14 = 183、または null を数えると 184。

メモリにうまく収まる MAX_UNICODE_STACK_BUFFER_LENGTH または 256 を使用することを検討してください。

于 2020-11-18T22:16:51.157 に答える