繁体   English   中英

如何确定字符串是否为用户 SID?

[英]How to determine if a string is a User SID?

在 Windows 操作系统中,用户 SID 用字符串表示,例如:

S-5-1-76-1812374880-3438888550-261701130-6117

有什么方法可以确定这样的字符串是有效的用户 SID?

谢谢。

根据安全标识符描述,SID具有以下形式(它具有一到十四个子授权值):

S-1-<identifier authority>-<sub1>-<sub2>-…-<subn>-<rid>

您可以使用正则表达式来检查字符串是否与此模式匹配:

string input = "S-5-1-76-1812374880-3438888550-261701130-6117";
string sidPattern = @"^S-\d-\d+-(\d+-){1,14}\d+$";
bool isValidFormat = Regex.IsMatch(input, sidPattern);

这将确保输入字符串具有有效格式 ,但这不能证明SID有效。 正如评论中所建议的那样,如果您需要检查是否有有效的SID,则应尝试获取帐户。

我发现这种轻微变化很有帮助,它允许一些众所周知的安全标识符。 例如,众所周知的sid Everyone S-1-1-0

^S-\d-(\d+-){1,14}\d+$

依靠正则表达式来检查SID是否有效并不是一个好主意。 首先,唯一有效的SID版本是1,因此当9不是有效版本时,此正则表达式将认为S-9-(\\d+-){1,14}\\d+有效。 但是,如果有新的SID版本甚至是全新的SID格式,则将正则表达式修复为仅允许版本1将失败。 更好的方法是让系统决定SID是否有效。 这样做:

string notSureIfSID = "S-9-5-76-1812374880-3438888550-261701130-6117";
bool sidIsValid = false;
bool sidIsAccount = false;
try {
    SecurityIdentifier sid = new SecurityIdentifier(notSureIfSID);
    sidIsValid = true;
    sidIsAccount = sid.IsAccountSid();
}
catch (ArgumentException) {
    // Handle invalid SID
}

如果SID格式无效(例如,如果版本不是1或子权限的数量超过15或小于1),构造函数将抛出ArgumentException。 如果要检查SID是否是实际的现有帐户,只需在SecurityIdentifier上调用IsAccountSid

正则表达式应为“S- \\ d- \\ d- \\ d + - \\ d + - - \\ d + - \\ d + - \\ w +”

如果您需要检查 SID 是否为 SID,请在try\\catch使用SecurityIdentifier构造函数。

不会验证这个 sid 属于任何人\\全世界的任何东西。


SID 是

  • 总是以S开头
  • 对于当前,始终以-1-继续(这是 SID 版本,并且只有一个)
  • 以不超过 6 个字节的单个SID_IDENTIFIER_AUTHORITY继续,表示该值不超过281474976710656 (15 个字符)
  • 继续 [1..14] -分隔的SID_IDENTIFIER_SUBAUTHORITY不超过 4 个字节宽(最多 10 个字符)
  • 可选择以 RID 结尾-分隔不超过 4 个字节宽(最多 10 个字符)

更详细的参考MS-AZOD,第 1.1.1.2 章

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM