PHP fsockopen ldap 域搜索

PHP fsockopen ldap domain search

上下文:
我正在使用域名地址来尝试检查与域控制器的连接,但并非所有域控制器都可以从服务器 运行 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 个域控制器的情况下执行此操作?

我不确定你想在那里实现什么。 fsockopen 尝试在给定端口上打开到给定服务器的连接。您还设置了超时。但是你在循环中这样做。因此,您尝试连续 15 次打开连接,并在每次 运行 上将服务器超时增加一秒。但根据我的阅读,有多个 domain-controllers 可用。根据 network-setup 第一个可用的应该做出反应并充当 "your" 端点。作为该系统的用户,您不需要检查您可以联系到哪些人,哪些人不能联系到。当您执行 ldap_connect('ldap://domain.ad:389);.

时,您应该只取回句柄

或者,您可以通过 gethostbyname('domain.ad') 为 domain-controller 执行 DNS-Query,这将为您提供给定主机的 IP-address。但正如我所说,当您的网络维护得当时,应该不需要这样做。

当您有 多个服务器名称 时,您可以在 space-delimited 列表中将它们用作 ldap_connect 的参数,如下所示:

ldap_connect('ldap://domain.ad:389 ldap://domain2.ad:389 ldaps://domain.ad:123');

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

尽管您必须注意一个问题:ldap_connect 连接!通常首先在 ldap_bind 上打开连接!因此,连接问题 不会 出现在 ldap_connect 上。如果你在那里得到一个 false 就意味着提供的参数不符合预期!这就是为什么我通常首先使用 fsockopen 检查服务器是否可用,如果这是一个问题,这样我就可以快速失败。

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

$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']);
...