使用PHP部署MATLAB编译器COM组件时设置IIS权限

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用PHP部署MATLAB编译器COM组件时设置IIS权限相关的知识,希望对你有一定的参考价值。

我在使用在IIS上运行的php创建的网站中使用COM组件时遇到了困难。它看起来像一个权限问题,但在玩了几天权限之后,我就没有接近它的工作,所以我正在寻找想法。

设置为Windows Server 2012 R2,IIS 8.0,PHP 7.0。 COM组件使用MATLAB Compiler SDK R2017b创建。一切都是64位。

可以使用Python正确执行COM组件,

import win32com.client
obj = win32com.client.Dispatch("AddMatrixTestCOM.MATLABTest.1_0")
ans = obj.addmatrix(1,100,3,4)
print ans

因此,正确注册/安装了COM组件和相应的MATLAB组件运行时(MCR)。 (MCR本质上是一个由COM组件调用的运行时引擎。它由各种DLL组成。)

为了测试从PHP调用COM组件,我编写了自己的COM组件(即不使用MATLAB)。这可以成功使用,

$my_dll = new COM('SimpleAddCOM');
$outvar = $my_dll->add_ints(1, 2);
echo $outvar;

因此,所有适当的php.ini设置都可以调用COM。 (COM组件在Visual Studio 2015中创建,服务器已安装相关的部署库。)

但是,我无法让以下工作,

$my_dll = new COM('AddMatrixTestCOM.MATLABTest.1_0');
$outvar = $my_dll->addmatrix(1, 100, 3, 4);
echo $outvar;

第一行引发错误:Failed to create COM object 'AddMatrixTestCOM.MATLABTest.1_0': ClassFactory cannot supply requested class

具体错误号是:2147746065

我相信正在找到COM组件,因为如果我尝试实例化一个不存在但不能克服(或真正理解)cannot supply requested class部分的组件,则错误是不同的。

我已经为包含MCR和COM组件的目录授予了各种用户完全权限。 (基于各种类似主题的Stack Overflow问题/答案,我首先授予IIS_IUSRS,然后是IUSR,然后是NETWORK SERVICES,最后添加Everyone。这些都没有用。)

由于无法将IIS和我的COM组件粘合在一起,我错过了什么?

编辑这里有更多信息:

  • IIS管理器的Sites节点表明我的站点使用应用程序池mypool
  • IIS管理器的Application Pools节点上的表表明mypool的身份是IWPD_1(myname)
  • 但是,如果我进入mypool的设置,则Identity将被列为ApplicationPoolIdentity。 (为什么这些不同,IIS会映射到另一个吗?)

我给了包含我的COM dll和MCR的目录的DefaultAppPoolmyname以及IWPD_1(myname)完全权限。

在我放弃IIS并回到linux主机之前,任何人都可以尝试其他任何东西吗?

答案

这并没有真正回答我的问题,但是可以帮助其他人。

我最终将我的应用程序池的Load User Profile设置更改为true。这将在C:Users下为App Pool使用的帐户创建一个配置文件,并为App Pool用户提供适当的访问权限。然后我安装了MATLAB MCR并将我的dll放在该用户配置文件的Documents目录中的目录中。

我还没有调查过这个安全问题,但是它让我不知道没有任何代码工作。

以上是关于使用PHP部署MATLAB编译器COM组件时设置IIS权限的主要内容,如果未能解决你的问题,请参考以下文章

如何使用用户预定义的数据设置 mwArray?是不是可以混合使用 Matlab 库编译器和 mex 运行时?

IPPL 与 Matlab 编译器运行时 (MCR)

LAMP架构部署——编译安装PHP

LNMP部署及应用理论及实操

在设置 matlab 以访问外部 c++ 编译器时需要帮助

Matlab 编译器 sdk 运行时