我在开发环境中使用Windows 7 x64 Enterprise,IIS和PHP 5.6.32。我的应用程序的网站有以下设置:
我的生产服务器与Server 2008 R2上运行的设置相同。
我需要使用exec()
,shell_exec()
等来执行可执行文件(pdftk,如果重要的话)。但是,每当我使用这些函数中的任何一个时,我总是在PHP错误日志中得到"Unable to fork XXX"
。我尝试过运行whoami
,ping xxx
和其他具有相同结果的简单命令。没有典型的shell函数可以工作 - 它们总是会导致相同的错误。我检查了我的php.ini
文件,并确认这些功能尚未被停用。
但是,在我的生产环境中,我没有这个问题,我也不知道为什么。它似乎只影响我的开发环境。在我的研究过程中,我偶然发现了这个(http://tech.trailmax.info/2012/12/php-warning-shell_exec-unable-to-execute-on-iis-7/),由于某种原因,它确实解决了我的问题;但是,它完全破坏了我的SQL Server Windows身份验证(我需要)。
我也禁用了我的防病毒软件,希望它可能是罪魁祸首。事实并非如此。
在进行更多故障排除时,我确实发现proc_open()
确实有效。我们正在使用Prince来生成PDF,我注意到它正在工作,而我的exec()
却没有。当我看到Prince课程时,我发现它正在使用proc_open()
,这解释了为什么它似乎有效。
有谁知道为什么exec()
和相关功能似乎在我的生产环境而不是我的开发环境中没有问题?为什么proc_open()
可以工作但其他shell函数不工作?谢谢!
答案 0 :(得分:1)
检查文件' C:\ WINDOWS \ system32 \ cmd.exe'的权限。 您需要对此文件具有读/执行权限。
我建议使用sysinternals Process Monitor' procmon.exe'确认尝试运行cmd.exe'的用户。 过滤'流程名称'是' php-cgi.exe'和' Path'以#cmd.exe'结尾。查看具有访问被拒绝错误的任务的事件属性,它将显示'模拟'用户名。这通常是“互联网访客帐户”,通常是“NT AUTHORITY \ IUSR'
”。答案 1 :(得分:0)
我想发布一个更新,因为我发现了这个问题。答案可以在1heer2351 at zonnet dot nl1
的最后一篇文章中找到here:
找到问题并且已经能够修复它。
我正在为我的应用程序池(比如AppPoolUser)使用特殊用户, 所以PHP以此用户身份运行。新的exec函数使用 带模拟的CreateProcessAsUser()。这意味着 AppPoolUser必须有权更改进程级令牌。
您可以在“本地安全设置”中为用户分配此权限 - >用户权利分配。
我已经为我的AppPoolUser授予了“替换进程级令牌” 设置 - > fork错误消失了。
认为这可能是有用的信息,因此需要访问 cmd.exe但另外还有“替换进程级别令牌”设置。
这正是我所做的。我使用我的域帐户创建了一个新的App Pool用户。默认情况下,Replace a process level token
设置包含DefaultAppPool
。由于我创建了一个新的应用程序池用户,因此它未包含在此策略设置中。添加我创建的应用程序池用户解决了我的问题。