运行 PHP 中的 DLL(.net) 函数 - 似乎没有任何作用
Running a function in DLL(.net) in PHP - Nothing seems to work
好的,我已经遍历了整个互联网上关于这个问题的几乎所有问题,PHP 手册和 post。似乎没有任何帮助。
我正在开展一个项目,该项目需要我在 Active Directory 上对组织中的不同用户进行身份验证(或至少能够查找 UID)。对于连接和身份验证,他们为我提供了一个具有身份验证所需功能的 dll 文件。我需要使用这个 dll 文件和其中的函数来让我的应用程序正常工作。
以下是我迄今为止尝试过的不同方法以及每种方法的错误。
- 使用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 扩展。
- 尝试使用 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) 部分,我真的无法理解围绕该主题的大部分文档。
- 尝试使用 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 扩展/注册
注意事项
- 该设置目前正在 XXAMP 上进行开发和测试。
- 我没有管理员权限,但如果需要可以安排。
- 生产环境将在 windows 服务器 运行 IIS 上。
我对 .net 和 Active Directory 知之甚少,这就是为什么我觉得这更难处理。另外考虑到问题的长度,希望我没有错过任何重要的事情。如果您需要更多信息,请告诉我。
编辑
我能够使用 Reflector 反编译 DLL,现在拥有源代码并可以访问 Microsoft Visual Studio for Applications 2.0。如果您需要我对 DLL 本身进行更改。
我也尝试在选中 "make visible to com" 选项的情况下构建它,但仍然遇到与 regsvr 32 和 regasm 相同的错误。
运行 您的命令提示符作为管理员,然后尝试在 windows.
中注册您的 DLL
按照以下步骤操作:
- 运行 以管理员身份运行 CMD
- 运行 命令:cd C:\xampp\htdocs\OOP_curater\(选择你的DLL路径)
- 运行 命令: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
}
}
好的,我已经遍历了整个互联网上关于这个问题的几乎所有问题,PHP 手册和 post。似乎没有任何帮助。
我正在开展一个项目,该项目需要我在 Active Directory 上对组织中的不同用户进行身份验证(或至少能够查找 UID)。对于连接和身份验证,他们为我提供了一个具有身份验证所需功能的 dll 文件。我需要使用这个 dll 文件和其中的函数来让我的应用程序正常工作。
以下是我迄今为止尝试过的不同方法以及每种方法的错误。
- 使用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 扩展。
- 尝试使用 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) 部分,我真的无法理解围绕该主题的大部分文档。
- 尝试使用 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 扩展/注册
注意事项
- 该设置目前正在 XXAMP 上进行开发和测试。
- 我没有管理员权限,但如果需要可以安排。
- 生产环境将在 windows 服务器 运行 IIS 上。
我对 .net 和 Active Directory 知之甚少,这就是为什么我觉得这更难处理。另外考虑到问题的长度,希望我没有错过任何重要的事情。如果您需要更多信息,请告诉我。
编辑
我能够使用 Reflector 反编译 DLL,现在拥有源代码并可以访问 Microsoft Visual Studio for Applications 2.0。如果您需要我对 DLL 本身进行更改。
我也尝试在选中 "make visible to com" 选项的情况下构建它,但仍然遇到与 regsvr 32 和 regasm 相同的错误。
运行 您的命令提示符作为管理员,然后尝试在 windows.
中注册您的 DLL按照以下步骤操作:
- 运行 以管理员身份运行 CMD
- 运行 命令:cd C:\xampp\htdocs\OOP_curater\(选择你的DLL路径)
- 运行 命令: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
}
}