运行 PHP 中的 DLL(.net) 函数 - 似乎没有任何作用

Running a function in DLL(.net) in PHP - Nothing seems to work

好的,我已经遍历了整个互联网上关于这个问题的几乎所有问题,PHP 手册和 post。似乎没有任何帮助。

我正在开展一个项目,该项目需要我在 Active Directory 上对组织中的不同用户进行身份验证(或至少能够查找 UID)。对于连接和身份验证,他们为我提供了一个具有身份验证所需功能的 dll 文件。我需要使用这个 dll 文件和其中的函数来让我的应用程序正常工作。

以下是我迄今为止尝试过的不同方法以及每种方法的错误。

  1. 使用dl()加载DLL。

我试过使用

dl('filename.dll');

出现错误

Call to undefined function dl() in C:\xampp\htdocs\OOP_curater\index.php on line 16

环顾四周后我发现了 this and this 我意识到它不再受支持了。

然后我尝试将 dll 放在 C:\xampp\php\ext 中并向 php.ini 添加一个扩展行。 (只是为了它)重新启动 php 给了我一条错误消息,说它不是有效的 PHP 扩展。

  1. 尝试使用 COM()

然后我尝试使用

$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 Install was not found" 错误。

我必须承认,我仍然不确定我是否理解了 (Projectname.FunctionName) 部分,我真的无法理解围绕该主题的大部分文档。

  1. 尝试使用 DOTNET()

然后我尝试了下面的代码

$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 函数

b。来源不可用

c。无法注册(假设由于上述错误)

d。它不能被重新编译为 PHP 扩展/注册

注意事项

  1. 该设置目前正在 XXAMP 上进行开发和测试。
  2. 我没有管理员权限,但如果需要可以安排。
  3. 生产环境将在 windows 服务器 运行 IIS 上。

我对 .net 和 Active Directory 知之甚少,这就是为什么我觉得这更难处理。另外考虑到问题的长度,希望我没有错过任何重要的事情。如果您需要更多信息,请告诉我。

编辑

我能够使用 Reflector 反编译 DLL,现在拥有源代码并可以访问 Microsoft Visual Studio for Applications 2.0。如果您需要我对 DLL 本身进行更改。

我也尝试在选中 "make visible to com" 选项的情况下构建它,但仍然遇到与 regsvr 32 和 regasm 相同的错误。

运行 您的命令提示符作为管理员,然后尝试在 windows.

中注册您的 DLL

按照以下步骤操作:

  1. 运行 以管理员身份运行 CMD
  2. 运行 命令:cd C:\xampp\htdocs\OOP_curater\(选择你的DLL路径)
  3. 运行 命令:regsvr32 filename.dll

希望能解决你的问题

根据您对要求的描述,我不相信您的做法是正确的。我怀疑您被 'they' 误导了,为您提供了一个 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 将是指定属性的数组。

这并没有直接回答所问的问题,而是解决了您的问题。

在 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
    }
}