使用PHP枚举AD域

时间:2012-12-07 08:32:03

标签: php active-directory trust

我们的域名包含超过80个其他“受信任”域名。这意味着我们的一些组是交叉链接的,来自一个域的用户,另一个域中的组等等。我编写了一个脚本,用于在其中一个域上创建来自某组特定组的用户列表,但是它们来自其他领域,因此我只获得外国标识符。我需要将其链接到其他域,但我需要每个域的SID。

是否存在与Win32的 DsEnumerateDomainTrusts 相当的PHP?我不想手动写出所有SID,然后在添加新域时手动更新它们,或者删除旧域。

2 个答案:

答案 0 :(得分:1)

您可以对域的系统容器中的trustedDomain个对象执行LDAP查询。对我来说,域名的sid位于securityIdentifier属性中。

答案 1 :(得分:0)

以下是我的解决方案:

function ldap_sidconvert($ldapbytes)
{
    $d_proc=unpack("H*",$ldapbytes);
    $d_proc['hex1']=str_split(substr($d_proc[1],-24),2);
    foreach ($d_proc['hex1'] as $key=>$value)
    {
        $d_proc['hex2'][floor($key/4)][]=$value;
    }
    foreach ($d_proc['hex2'] as $key=>$value)
    {
        $d_proc['hex3'][$key]=hexdec(implode(array_reverse($d_proc['hex2'][$key],FALSE)));
    }
    return implode("-",$d_proc['hex3']);
}

然后你可以通过将securityidentifier字段的值传递给它来调用它:

ldap_sidconvert($domains[0]['securityidentifier'][0])

在这个例子中,它只是查看列表中的第一个域,根据需要将第一个0替换为1,2,3 ...等。这只会转换最后24个十六进制数字,我不知道如何处理前24个,但我相信它们并不是唯一的,因此它们不应该是必需的。

这可能不是最好的方法,所以我很乐意接受对我的编码的批评,但希望将来可以帮助某人。

这可能是一个有用的参考:http://en.wikipedia.org/wiki/Security_Identifier#Machine_SIDs