Active Directory 認証をアプリケーションに組み込み、アプリケーションの内部アカウントをユーザーのドメイン SID にリンクすることを計画しています。バイト配列よりもsidの文字列形式で作業する方が簡単なので、データベースに文字列として保存することを計画していました。SID が切り捨てられないようにするには、フィールドをどのくらいの長さにする必要がありますか?
4 に答える
私も同じ質問をしましたが、正しい答えは次のとおりです。
- 文字列としての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
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 を使用することを検討してください。