如何使用COM从PHP / IIS读取Active Directory组成员身份?

时间:2020-03-05 18:59:12  来源:igfitidea点击:

我有以下代码:

$bind = new COM("LDAP://CN=GroupName,OU=Groups,OU=Division,DC=company,DC=local");

当我从命令提示符执行它时,它运行良好。当它在IIS / PHP / ISAPI下运行时,它会倒转。

Fatal error: Uncaught exception 'com_exception' with message 'Failed to create COM object `LDAP://CN=...[cut]...,DC=local':
An operations error occurred. ' in index.php
Stack trace:
  #0 index.php: com->com('LDAP://CN=...')
  #1 {main} thrown

IIS配置为进行Windows身份验证(无匿名,无基础,无摘要),并且我以与命令提示符相同的用户身份进行连接。我在IIS日志文件或者事件日志中找不到任何特定的错误。

此练习的主要目的是避免将用户凭据保留在我的脚本中,并依靠IIS身份验证将它们传递到活动目录。我了解我们可以使用LDAP完成相同的操作,但是据我所知,凭据无法传递。

可能与尝试将其移植到ASP时遇到的错误有关。我收到错误80072020(目前正在查找)。

事件日志没有显示任何异常。没有警告,没有错误。启用了完全安全审核(安全策略中每个项目的成功和失败),并且它显示了我对网页进行身份验证的每个用户的Windows登录成功(这是预期的)。

解决方案

回答

由于我们在IIS中使用Windows身份验证,因此Windows事件日志中可能会有一些安全事件。我将检查事件日志中的安全事件以及应用程序事件,看看是否遇到任何类型的权限问题。

另外,由于我们基本上只是通过LDAP与AD通讯...我们可能会考虑将本地LDAP库用于PHP而不是COM。

我们可能必须在php.ini中启用扩展。值得一看。

回答

好吧,如果我们想使用LDAP,请让我指向我们用于Maia Mailguard的LDAP身份验证代码:查找名为lauth_ldap的函数

我认为它需要ldap版本3,因此我们必须为ldap设置该参数。为了验证密码,我们使用ldap绑定功能让ldap服务器进行身份验证。

回答

我不是AD / COM / IIS专家,但这可能是权限问题。例如IUSR_computername用户在目录中没有适当的访问权限,或者我们不是作为特定用户绑定的?

对我来说,令人震惊的是,它可以从命令行正常运行(例如,以权限运行),但在IIS上无法运行(例如,不是权限)。

回答

它现在似乎正在工作。

我为Active Directory中的计算机对象启用了"信任此计算机进行委派"。通常,在未启用委托信任的情况下,IIS既不能对我们进行身份验证,又不能通过网络(在本例中为域控制器来查询Active Directory)模拟我们。

我们只需要确保它使用Kerberos而不是NTLM或者其他摘要身份验证进行身份验证,因为不信任将摘要用作模拟令牌。

它修复了我的PHP和ASP脚本。