PHP fsockopen ldap域名搜索

时间:2017-01-30 19:55:19

标签: php ldap fsockopen

背景:
我正在使用域名地址来尝试检查与域控制器的连接,但并非所有域控制器都可以从运行PHP的服务器访问。所以我使用循环来查看是否有域控制器使用fsockopen进行响应。

Domain.ad指向15个可能的域控制器。 server.domain.ad,server2.domain.ad等

...
$i = 0;
do
{
    $fp = fsockopen("domain.ad", 389, $errno, $errstr, 1);
    $i++;
}
while(!$fp && $i < 15);
...
//$ip = $fp->getAddress(); or something like that.

问题:
有没有办法从fsockopen连接中找出它成功连接的IP地址/域控制器,以便稍后在代码中用来完成LDAP绑定?或者,如果不使用1个域控制器,有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

我不确定你想要在那里实现什么。 ldap_connect('ldap://domain.ad:389);尝试在给定端口上打开与给定服务器的连接。您还设置了超时。但是你在循环中这样做。因此,您尝试连续打开15次连接,并在每次运行时将服务器的超时时间增加一秒。但从我读到的内容中可以看到多个域控制器。根据网络设置,第一个可用的应该响应并充当“您的”端点。您作为该系统的用户不应该检查您可以到达哪一个以及哪个不可以。当您执行gethostbyname('domain.ad')时,您应该回过头来处理。

或者,您可以通过ldap_connect为域控制器执行DNS查询,它将为您提供给定主机的IP地址。但正如我所说,当您的网络得到妥善维护时,不应该需要这样做。

如果您有多个服务器名称,则可以在空格分隔列表中将它们用作ldap_connect('ldap://domain.ad:389 ldap://domain2.ad:389 ldaps://domain.ad:123'); 的参数,如下所示:

ldap_connect

那应该连接到第一个可用的服务器。

虽然你必须要注意一个问题:ldap_bind 连接!通常首先在ldap_connect上打开连接!因此false上的连接问题将。如果你在那里得到fsockopen,那只是意味着所提供的参数不符合预期!这就是为什么我通常首先使用subprocess.Popen(['python', 'thisFile.py', str(inputs), str(outputs)]) ... if __name__ == '__main__': createNewWindow(sys.argv[1],sys.argv[2]) 检查服务器是否可用,如果这是一个问题,那么我可以快速失败。

答案 1 :(得分:0)

我的迭代域控制器的解决方案。

$ipDomain = dns_get_record("domain.ad", DNS_A);
$i = 0;
do
{
    $fp = fsockopen($ipDomain[$i]['ip'], 389, $errno, $errstr, 1);
    if(!$fp)
    {
        $i++;
        if($i >= sizeof($ipDomain))
        {
            break;
            //die();
        }
    }
}
while(!$fp);
...
ldap_connect($ipDomain[$i]['ip']);
...