背景:
我正在使用域名地址来尝试检查与域控制器的连接,但并非所有域控制器都可以从运行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个域控制器,有更好的方法吗?
答案 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']);
...