用于验证Active Directory对象SID的Regex


Regex for Validating an Active Directory Object SID

我正在寻找一种方法来验证从Active Directory插入的对象SID是否有效,这可能使用preg_match()preg_match_all()吗?我在网上查找了用于此验证的正则表达式,但找不到任何内容。

示例:

$sid = 'S-1-5-21-1220945662-1202665555-839525555-5555';
if ($validator->validateSid($sid)) {
    // SID is valid!
}

我不擅长写正则表达式,所以如果有人有任何意见,请告诉我,谢谢!

编辑:对于任何寻找以下正则表达式代码的人:

preg_match("/^S-1-[0-5]-'d{2}-'d{10}-'d{10}-'d{9}-[1-9]'d{3}/", $search, $matches);
// Returns
array(
    0 => S-1-5-21-1220945662-1202665555-839525555-5555
)

或者更宽松的模式:

preg_match("/S-1-5-21-'d+-'d+'-'d+'-'d+/", $sid, $matches);
// Returns
array(
    0 => S-1-5-21-1220945662-1202665555-839525555-5555
)

hjpotter92的答案将适用于某些SID,但不是所有SID。每个子机构都由一个32位整数组成,根据具体情况可以是10位或8位。您应该将正则表达式编辑为:

/^S-1-[0-59]-'d{2}-'d{8,10}-'d{8,10}-'d{8,10}-[1-9]'d{3}/

每当在Windows下创建新的颁发机构时(对于例如,部署的新机器或创建的域),则为其分配SID,其中5(任意值)作为标识符权限;固定的值21被用作唯一值,以将这组子授权,并且创建并分配96位随机数三个子机构,每个子机构收到32位区块

https://msdn.microsoft.com/en-us/library/cc246018.aspx

如何创建SID

https://en.wikipedia.org/wiki/Security_Identifier

查看wiki中的SID,以下内容应该有效:

/^S-1-[0-59]-'d{2}-'d{10}-'d{10}-'d{8}-[1-9]'d{3}/

SID的最后一部分是RID,它是一个32位标识符!这意味着RID可以有10位数字。因此,理论上最后一节的长度甚至可以是1+9位数!)

S-1-[0-59]-'d{2}-'d{10}-'d{10}-'d{8}-[1-9]'d{9}