13

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

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

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

谢谢。

4

5 回答 5

29

根据Security Identifiers的描述,SID 有以下形式(它有 1 到 14 个 subauthority 值):

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,您应该尝试获取帐户。

于 2013-04-19T08:03:26.447 回答
10

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

^S-\d-(\d+-){1,14}\d+$
于 2013-09-16T13:06:13.347 回答
5

依靠正则表达式来检查 SID 是否有效并不是一个好主意。一方面,唯一有效的 SID 版本是 1,所以 S-9-(\d+-){1,14}\d+ 当 9 不是有效版本时,这个正则表达式会认为是有效的。但是,如果有新的 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 是否是实际存在的帐户,只需调用IsAccountSid.SecurityIdentifier

于 2017-01-11T15:33:07.140 回答
1

正则表达式应该是 "S-\d-\d-\d+-\d+-\d+-\d+-\w+"

于 2013-10-09T10:36:42.593 回答
1

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

不会验证这个 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 章

于 2021-10-17T22:07:48.733 回答