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

时间:2013-04-19 07:57:42

标签: c# windows

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

  

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

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

感谢。

4 个答案:

答案 0 :(得分:24)

根据Security Identifiers描述,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,则应尝试获取帐户。

答案 1 :(得分:6)

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

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

答案 2 :(得分:2)

依靠正则表达式来检查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

答案 3 :(得分:1)

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