使用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的目录的DefaultAppPool
和myname
以及IWPD_1(myname)
完全权限。
在我放弃IIS并回到linux主机之前,任何人都可以尝试其他任何东西吗?
这并没有真正回答我的问题,但是可以帮助其他人。
我最终将我的应用程序池的Load User Profile
设置更改为true
。这将在C:Users
下为App Pool使用的帐户创建一个配置文件,并为App Pool用户提供适当的访问权限。然后我安装了MATLAB MCR并将我的dll放在该用户配置文件的Documents
目录中的目录中。
我还没有调查过这个安全问题,但是它让我不知道没有任何代码工作。
以上是关于使用PHP部署MATLAB编译器COM组件时设置IIS权限的主要内容,如果未能解决你的问题,请参考以下文章