在 Windows 操作系统中,用户 SID 用字符串表示,例如:
S-5-1-76-1812374880-3438888550-261701130-6117
有什么方法可以确定这样的字符串是有效的用户 SID?
谢谢。
根据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,您应该尝试获取帐户。
我发现这种细微的变化很有帮助,它允许使用一些众所周知的安全标识符。例如,众所周知的 sid 所有人 S-1-1-0
^S-\d-(\d+-){1,14}\d+$
依靠正则表达式来检查 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
正则表达式应该是 "S-\d-\d-\d+-\d+-\d+-\d+-\w+"
如果需要检查 SID 是否为 SID,请使用SecurityIdentifier内的构造函数try\catch
。
这不会验证这个 sid 属于全世界的任何人\任何东西。
SID 是
S
-1-
(这是 SID 版本,只有一个)281474976710656
(15 个字符)-
分隔的SID_IDENTIFIER_SUBAUTHORITY不超过 4 个字节宽(最多 10 个字符)-
其宽度不超过 4 个字节(最多 10 个字符)更详细的参考MS-AZOD,第 1.1.1.2 章