好的,我已经完成了几乎所有问题,PHP手册并在互联网上发布了这个问题。似乎没有任何帮助。
我正在开发一个项目,需要我在Active Directory上对组织中的不同用户进行身份验证(或者至少能够查找UID)。对于连接和身份验证,他们为我提供了一个dll文件,该文件具有进行身份验证所需的功能。我需要使用这个dll文件及其中的函数来使我的应用程序正常工作。
以下是我到目前为止尝试过的不同内容以及每个内容的错误。
我尝试使用
dl('filename.dll');
并收到错误
Call to undefined function dl() in C:\xampp\htdocs\OOP_curater\index.php on line 16
环顾四周后,我遇到了this和this,我意识到它不再支持了。
然后我尝试将dll放在C:\ xampp \ php \ ext中,并在php.ini中添加一个扩展行。 (只是为了它)重启php给了我一条错误消息,说它不是一个有效的PHP扩展。
然后我尝试使用
$action = new COM("ProjectName.FunctionName") or die ("Could not initialise MS Word object.");
并收到以下错误
Fatal error: Uncaught exception 'com_exception' with message 'Failed to create COM object `ProjectName.FunctionName': Invalid syntax ' in C:\xampp\htdocs\OOP_curater\index.php:3 Stack trace: #0 C:\xampp\htdocs\OOP_curater\index.php(3): com->com('FBA_Provider1.a...') #1 {main} thrown in C:\xampp\htdocs\OOP_curater\index.php on line 3
环顾四周让我看到类似于this的链接。我意识到我需要注册DLL,所以尝试了
regsvr32 C:\xampp\htdocs\OOP_curater\filename.dll
并收到错误
DllRegisterServer entry point was not found
然后我尝试了
regsvr32 /i /n C:\xampp\htdocs\OOP_curater\filename.dll
并收到“未找到DLL安装”错误。
我必须承认,我仍然不确定我的(Projectname.FunctionName)部分是否正确,我真的无法理解围绕这个主题的大部分文档。
然后我尝试了以下代码
$comobj = new DOTNET("projectname", "projectname.function");
并收到此错误
Fatal error: Uncaught exception 'com_exception' with message 'Failed to instantiate .Net object [CreateInstance] [0x80070002] The system cannot find the file specified. ' in C:\xampp\htdocs\OOP_curater\index.php:21 Stack trace: #0 C:\xampp\htdocs\OOP_curater\index.php(21): dotnet->dotnet('ProjectName', 'Function') #1 {main} thrown in C:\xampp\htdocs\OOP_curater\index.php on line 21
我现在有关于加载PHP的DLL的以下问题
加载DLL的最佳方法是:
一个。它不是真正的PHP函数
湾来源不可用
℃。它无法注册(假设由于上述错误)
d。它无法重新编译为PHP扩展/注册
很少需要注意
我对.net和Active Directory知之甚少,这就是我觉得处理起来更难的原因。考虑到问题的长度,希望我没有错过任何重要的事情。如果您需要更多信息,请告诉我。
修改
我能够使用Reflector反编译DLL,现在拥有源代码并可以访问Microsoft Visual Studio for Applications 2.0。如果你需要我改变DLL本身。
此外,我尝试使用“make visible to com”选项构建它,但仍然遇到与regsvr 32和regasm相同的错误。
答案 0 :(得分:1)
这并没有直接回答问题,但解决了您的问题。
在php中使用adLDAP(http://adldap.sourceforge.net/)它可以为您完成所有操作。您不需要外部DLL或自己滚动。
样品:
$adldap = new adLDAP();
$aUserInfo = getLDAPUserInfo($adldap, $username);
if ($aUserInfo) {
if (strlen($aUserInfo['mail']) > 0) {
$email = $aUserInfo['mail'];
if ($email) {
$userRow['email'] = $email;
}
}
}
或
$adldap = new adLDAP();
$authUser = $adldap->user()->authenticate($username, $password);
if ($authUser == true) {
if ($adldap->user()->inGroup($username,'ServerAdmins')) {
// This user is in server admins
}
}
答案 1 :(得分:0)
以管理员身份运行命令提示符,然后尝试在Windows中注册DLL。
按照以下步骤操作:
我希望它可以解决你的问题。
答案 2 :(得分:0)
根据您对要求的描述,我不相信您会以正确的方式解决这个问题。我怀疑你被“他们”提供给你一个DLL文件误入歧途,好像你正在构建一个桌面(或ASP.NET?)应用程序。
据我了解,您只需要通过Active Directory验证PHP应用程序的用户(可能是为了允许在您的应用程序中进行授权检查)。使用IIS,这是一个标准功能,并且易于激活。有关如何执行此操作,请参阅my answer to another question此处。
如果您需要对AD进行任何查询(例如检索用户UID,电子邮件等),您可以使用内置的LDAP functions。
一个快速而又肮脏的例子:
$server ='ldaps://server_hostname'; // could also use 'ldap://' for non-encrypted connection.
$username = 'username'; // should be a restricted 'service account' to be used only by this app.
$password = '';
$base_dn = '';
$search_filter = 'cn=' . $_SERVER['AUTH_USER']; // search based on username provided by IIS single-sign on.
$attributes = ['mail', 'sn', 'cn']; // array of fields you want AD to provide.
$ldap = ldap_connect($server);
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3); // generally needed with AD.
ldap_bind($ldap, $username, $password);
$search = ldap_search($ldap, $base_dn, $search_filter, $attributes);
$data = ldap_get_entries($ldap, $search);
如果找到匹配项,则$data
将是指定属性的数组。