在PHP中的DLL(.net)中运行函数-似乎什么都不起作用
好的,我已经浏览了几乎所有的问题,PHP手册,以及在互联网上发布的关于这个问题的帖子。似乎没有什么帮助 我正在从事一个项目,该项目需要我在Active Directory上对组织中的不同用户进行身份验证(或至少能够查找UID)。为了连接和验证,他们为我提供了一个dll文件,该文件具有验证所需的功能。我需要使用这个dll文件和其中的函数来让我的应用程序工作 下面是我迄今为止尝试过的不同方法,以及每种方法的错误在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
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扩展
需要注意的事情不多
此外,我还尝试使用选中的“使com可见”选项构建它,但在使用regsvr 32和regasm时仍然出现相同的错误。以管理员身份运行命令提示符,然后尝试在windows中注册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
}
}