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

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

How To Read Active Directory Group Membership From PHP/IIS using COM?

我有以下代码:

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

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

1
2
3
4
5
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

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

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

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

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


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

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

您可能必须在您的php.ini中启用该扩展。值得一看。


它似乎正在工作。

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

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

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


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

对我来说,警报是它可以从命令行正常运行(例如,以您的权限运行),但在IIS上失败(例如,不是您的权限)。


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

的函数。

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


推荐阅读