使用 PHP 部署 MATLAB Compiler COM 组件时设置 IIS 权限
Setting IIS permissions when deploying MATLAB Compiler COM Component using PHP
我在使用 PHP 运行ning 在 IIS 上创建的网站中使用 COM 组件时遇到困难。这看起来像是一个权限问题,但在使用权限玩了几天之后,我离它的工作还差得很远,所以我在寻找想法。
设置是 Windows Server 2012 R2,ISS 8.0,PHP 7.0。
COM 组件是使用 MATLAB Compiler SDK R2017b 创建的。
一切都是 64 位的。
COM 组件可以从 Python 使用
正确执行
import win32com.client
obj = win32com.client.Dispatch("AddMatrixTestCOM.MATLABTest.1_0")
ans = obj.addmatrix(1,100,3,4)
print ans
因此,COM 组件和相应的 MATLAB 组件运行时 (MCR) 是 registered/installed 正确的。 (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 Studio2015年,服务器已安装相关部署库。)
但是,我无法使用以下命令,
$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 questions/answers,我首先授予权限 IIS_IUSRS,然后是 IUSR,然后是 NETWORK SERVICES,最后添加 Everyone。
None 有效。)
无法将 IIS 和我的 COM 组件粘合在一起,我错过了什么?
编辑
这里有更多信息:
- IIS 管理器的
Sites
节点表明我的站点使用应用程序池 mypool
。
- IIS管理器的
Application Pools
节点上的table表示mypool
的身份是IWPD_1(myname)
- 但是,如果我进入
mypool
的设置,身份将列为 ApplicationPoolIdentity
。 (为什么这些不同,IIS 是否映射到另一个?)
我已授予 DefaultAppPool
、myname
和 IWPD_1(myname)
对包含我的 COM dll 和 MCR 的目录的完全权限。
在我放弃 IIS 并回到 linux 主机之前,有人有什么我可以尝试的吗?
这并不能真正回答我的问题,但可以帮助其他人。
我最终将我的应用程序池的 Load User Profile
设置更改为 true
。这会在 C:\Users
下为 App Pool 使用的帐户创建一个配置文件,并为 App Pool 用户提供适当的访问权限。然后我安装了 MATLAB MCR 并将我的 dll 放在该用户配置文件的 Documents
目录中的目录中。
我还没有调查这对安全的影响,但它让我度过了没有任何代码工作的困境。
我在使用 PHP 运行ning 在 IIS 上创建的网站中使用 COM 组件时遇到困难。这看起来像是一个权限问题,但在使用权限玩了几天之后,我离它的工作还差得很远,所以我在寻找想法。
设置是 Windows Server 2012 R2,ISS 8.0,PHP 7.0。 COM 组件是使用 MATLAB Compiler SDK R2017b 创建的。 一切都是 64 位的。
COM 组件可以从 Python 使用
正确执行import win32com.client
obj = win32com.client.Dispatch("AddMatrixTestCOM.MATLABTest.1_0")
ans = obj.addmatrix(1,100,3,4)
print ans
因此,COM 组件和相应的 MATLAB 组件运行时 (MCR) 是 registered/installed 正确的。 (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 Studio2015年,服务器已安装相关部署库。)
但是,我无法使用以下命令,
$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 questions/answers,我首先授予权限 IIS_IUSRS,然后是 IUSR,然后是 NETWORK SERVICES,最后添加 Everyone。 None 有效。)
无法将 IIS 和我的 COM 组件粘合在一起,我错过了什么?
编辑 这里有更多信息:
- IIS 管理器的
Sites
节点表明我的站点使用应用程序池mypool
。 - IIS管理器的
Application Pools
节点上的table表示mypool
的身份是IWPD_1(myname)
- 但是,如果我进入
mypool
的设置,身份将列为ApplicationPoolIdentity
。 (为什么这些不同,IIS 是否映射到另一个?)
我已授予 DefaultAppPool
、myname
和 IWPD_1(myname)
对包含我的 COM dll 和 MCR 的目录的完全权限。
在我放弃 IIS 并回到 linux 主机之前,有人有什么我可以尝试的吗?
这并不能真正回答我的问题,但可以帮助其他人。
我最终将我的应用程序池的 Load User Profile
设置更改为 true
。这会在 C:\Users
下为 App Pool 使用的帐户创建一个配置文件,并为 App Pool 用户提供适当的访问权限。然后我安装了 MATLAB MCR 并将我的 dll 放在该用户配置文件的 Documents
目录中的目录中。
我还没有调查这对安全的影响,但它让我度过了没有任何代码工作的困境。