代码之家  ›  专栏  ›  技术社区  ›  Brian Cauthon

sddl格式的sid的最大长度是多少

  •  18
  • Brian Cauthon  · 技术社区  · 16 年前

    我正在将Active Directory身份验证构建到应用程序中,并计划将应用程序的内部帐户链接到用户的域SID。对于我来说,使用sid的字符串格式比使用字节数组更容易,因此我计划将其作为字符串存储在数据库中。我应该使字段保持多长时间以确保SID不会被截断?

    2 回复  |  直到 6 年前
        1
  •  31
  •   Anton Shchyrov    6 年前

    我也有同样的问题,我相信正确的答案是:

    • ID为字符串:184个字符,或SQL Server中的varchar(184)
    • SID作为十六进制数字的字符串:136个字符,或SQL Server中的varchar(136)
    • SID为二进制:68字节,或SQL Server中的varbinary(68)

    我自己还没有检查过数学,但是这里使用的技术看起来是有效的: https://groups.google.com/d/msg/microsoft.public.dotnet.security/NpIi7c2Toi8/31SVhcepY58J

    参考Russell Mangel于2006年8月19日编写的程序,也可在此复制以供参考:

    所以我的问题的答案是:

    varbinary(68)--纯二进制
    varchar(136)--(68*2)=hexstring
    varchar(184)--sid字符串

    我写了一个小程序来测试, 注意.NET 2.0 SecurityIdentifier.MaxBinaryLength,i 不知道。

    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 
    
        2
  •  0
  •   Chalky    6 年前
    1. 对于字符串格式,184的常见答案是不正确的。如果权限介于32位和最大48位之间,则必须将其表示为十六进制字符串,而不是十进制,并以“0x”开头。这意味着,您实际上需要一个(48位/4位+2)14个字符串,而不是用15个字符串来表示十进制中的最大48位,这意味着整个SID字符串需要(184-15+14)183个字符。对于小于32位,使用十进制格式(最多10个十进制字符)。