在PHP中的DLL(.net)中运行函数-似乎什么都不起作用

在PHP中的DLL(.net)中运行函数-似乎什么都不起作用,php,asp.net,.net,dll,com,Php,Asp.net,.net,Dll,Com,好的,我已经浏览了几乎所有的问题,PHP手册,以及在互联网上发布的关于这个问题的帖子。似乎没有什么帮助 我正在从事一个项目,该项目需要我在Active Directory上对组织中的不同用户进行身份验证(或至少能够查找UID)。为了连接和验证,他们为我提供了一个dll文件,该文件具有验证所需的功能。我需要使用这个dll文件和其中的函数来让我的应用程序工作 下面是我迄今为止尝试过的不同方法,以及每种方法的错误 用于加载DLL。 我试着用 dl('filename.dll'); 并且得到了错误 C

好的,我已经浏览了几乎所有的问题,PHP手册,以及在互联网上发布的关于这个问题的帖子。似乎没有什么帮助

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

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

  • 用于加载DLL。
  • 我试着用

    dl('filename.dll');
    
    并且得到了错误

    Call to undefined function dl() in C:\xampp\htdocs\OOP_curater\index.php on line 16
    
    环顾四周后,我发现它不再受支持了

    然后,我尝试将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
    
    环顾四周,我找到了类似的链接。我意识到我需要注册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的最佳方式是什么:

    a。它不是一个真正的PHP函数

    b。来源不可用

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

    d。无法将其重新编译为可注册的PHP扩展

    需要注意的事情不多

  • 该设置目前正在XXAMP上进行开发和测试
  • 我没有管理员的权利,但可以安排它,如果必要的话
  • 生产环境将位于运行IIS的windows服务器上
  • 我对.net和Active Directory知之甚少,这就是为什么我觉得这更难处理的原因。同样考虑到问题的长度,希望我没有错过任何重要的事情。如果你需要更多信息,一定要告诉我

    编辑

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


    此外,我还尝试使用选中的“使com可见”选项构建它,但在使用regsvr 32和regasm时仍然出现相同的错误。

    以管理员身份运行命令提示符,然后尝试在windows中注册DLL

    请遵循以下步骤:

  • 以管理员身份运行CMD
  • 运行命令:cd C:\xampp\htdocs\OOP\u curator\(选择DLL路径)
  • 运行命令:regsvr32 filename.dll

  • 我希望它能解决您的问题。

    根据您对需求的描述,我不相信您的做法是正确的。我怀疑“他们”为您提供了一个DLL文件,就好像您正在构建一个桌面(或ASP.NET?)应用程序一样,这让您误入歧途

    据我所知,您只需要通过Active Directory对PHP应用程序的用户进行身份验证(大概是为了允许在应用程序中进行授权检查)。在IIS中,这是一项标准功能,而且很容易激活。关于如何做到这一点,请参见此处

    如果您需要对广告进行任何查询(如检索用户UID、电子邮件等),您可以使用内置的

    一个快速而肮脏的例子:

    $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(),它可以为您完成所有工作。您不需要外部DLL,也不需要自己的DLL

    样本:

        $adldap = new adLDAP();
        $aUserInfo = getLDAPUserInfo($adldap, $username);
        if ($aUserInfo) {
            if (strlen($aUserInfo['mail']) > 0) {
                $email = $aUserInfo['mail'];
                if ($email) {
                    $userRow['email'] = $email;
                }
            }
        }
    


    我尝试了regasm和regsvr32,regasm返回“未注册任何类型”,拖放到windows/assembly给我一个“需要强命名的dll”错误,regsvr32返回一个未找到的入口点错误尝试将该dll放在“程序文件/[文件夹名称]”中,然后注册我认为这不是问题,这与DLL中的代码有关,它可能不是COM对象或其他东西,根据我的研究,这也是可能的。顺便说一下,您可以告诉他们使用该DLL创建身份验证web服务,您可以在PHP代码中调用这些web服务来验证门户中的用户。他们可能不支持我到那种程度,可能不可能您是否绝对确定需要一个自定义的.DLL文件来“连接并验证”到Active Directory?我听上去非常奇怪。AD只是一个LDAP实例,PHP通过LDAP扩展对此提供了内置支持。而且IIS有内置的单点登录,通过协商进行身份验证…如果你有机会使用该DLL构建asp.net网站或webapi,那么你可以将REST API公开给php函数,这将减少更改(如果你准备好做asp.net网站或webapi),你关于“我被他们引入歧途”的说法绝对正确,另外,您的解决方案听起来相当合理,只是一个查询是否意味着IIS将负责身份验证的所有方面,如会话管理等?有什么我必须在应用程序级别处理的吗?我对IIS和.net还不太熟悉,所以我不太清楚。同样用于测试的还有
    LDAP\u BIND
    我唯一的选择是完全处理身份验证。只有在IIS成功对用户进行身份验证时,应用程序才会运行。如果您只需要IIS在
    $\u服务器
    变量中提供的用户名,而不需要AD提供更多的详细信息,则不需要
    $adldap = new adLDAP();
    $authUser = $adldap->user()->authenticate($username, $password);
    if ($authUser == true) {
        if ($adldap->user()->inGroup($username,'ServerAdmins')) {
            // This user is in server admins
        }
    }