PHP fsockopen ldap域搜索
上下文:PHP fsockopen ldap域搜索,php,ldap,fsockopen,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 &
我正在使用域名地址尝试检查与域控制器的连接,但并非所有域控制器都可以从运行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.
。。。
$i=0;
做
{
$fp=fsockopen(“domain.ad”,389,$errno,$errstr,1);
$i++;
}
而(!$fp&&$i<15);
...
//$ip=$fp->getAddress();或者类似的。
问题:有没有办法从fsockopen连接中找到它成功连接的IP地址/域控制器,以便稍后在代码中使用以完成LDAP绑定?或者,有没有更好的方法不用使用1个域控制器就可以做到这一点?我不确定您在那里想要实现什么
fsockopen
尝试在给定端口上打开与给定服务器的连接。您还设置了一个超时。但这是一个循环。因此,您尝试连续15次打开连接,并在每次运行时将服务器超时时间增加1秒。但据我所知,有多个域控制器可用。根据网络设置的不同,第一个可用的端点应该会做出反应并充当“您的”端点。作为该系统的用户,您不需要检查哪些可以访问,哪些不能访问。当您执行ldap\u连接时,您应该得到一个句柄ldap://domain.ad:389);代码>
或者,您可以通过gethostbyname('domain.ad')
对域控制器执行DNS查询,该查询将为您提供给定主机的IP地址。但正如我所说,当你的网络得到适当维护时,就不需要这样做了
当您有多个服务器名时,您可以在空格分隔的列表中使用它们作为ldap\u connect
的参数,如下所示:
ldap_connect('ldap://domain.ad:389 ldap://domain2.ad:389 ldaps://domain.ad:123');
应该连接到第一个可用的服务器
不过,您必须注意一个问题:ldap\u connect
doesnotconnect!连接通常首先在ldap\u bind
上打开!因此连接问题将不会出现在ldap\u 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']);
...
“domain.ad”是否有15条CNAME或15条A记录?DNS应该只返回那些可以从您的计算机访问的服务器。或者做一个DNS查询来找到所有的a记录,并在上面循环找到一个可访问的记录。这实际上是我昨天下午做的。