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']);
...
上下文:
我正在使用域名地址来尝试检查与域控制器的连接,但并非所有域控制器都可以从服务器 运行 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']);
...