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

时间:2015-03-11 11:21:28

标签: php asp.net .net dll com

好的,我已经完成了几乎所有问题,PHP手册并在互联网上发布了这个问题。似乎没有任何帮助。

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

以下是我到目前为止尝试过的不同内容以及每个内容的错误。

  1. 使用dl()加载DLL。
  2. 我尝试使用

    dl('filename.dll');
    

    并收到错误

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

    环顾四周后,我遇到了thisthis,我意识到它不再支持了。

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

    1. 使用COM()
    2. 尝试

      然后我尝试使用

      $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)部分是否正确,我真的无法理解围绕这个主题的大部分文档。

      1. 使用DOTNET()
      2. 尝试

        然后我尝试了以下代码

        $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扩展/注册

        很少需要注意

        1. 该设置目前正在XXAMP上进行开发和测试。
        2. 我没有管理员权限,但可以在必要时安排。
        3. 生产环境将在运行IIS的Windows服务器上。
        4. 我对.net和Active Directory知之甚少,这就是我觉得处理起来更难的原因。考虑到问题的长度,希望我没有错过任何重要的事情。如果您需要更多信息,请告诉我。

          修改

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

          此外,我尝试使用“make visible to com”选项构建它,但仍然遇到与regsvr 32和regasm相同的错误。

3 个答案:

答案 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。

按照以下步骤操作:

  1. 以管理员身份运行CMD
  2. 运行命令:cd C:\ xampp \ htdocs \ OOP_curater \(选择您的DLL路径)
  3. 运行命令:regsvr32 filename.dll
  4. 我希望它可以解决你的问题。

答案 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将是指定属性的数组。