PHP exec(),shell_exec(),system(),passthru()在Windows 7 / IIS

时间:2017-11-03 18:57:55

标签: php windows iis exec shell-exec

我在开发环境中使用Windows 7 x64 Enterprise,IIS和PHP 5.6.32。我的应用程序的网站有以下设置:

  • 匿名身份验证:已禁用
  • Windows身份验证:已启用(协商,协商:Kerboeros,NTLM)
  • 应用程序池:域帐户。
  • 除了默认的PHP扩展之外,我还使用了Microsoft身份验证模式中使用的Microsoft SQL Server驱动程序(3.2版本)。

我的生产服务器与Server 2008 R2上运行的设置相同。

我需要使用exec()shell_exec()等来执行可执行文件(pdftk,如果重要的话)。但是,每当我使用这些函数中的任何一个时,我总是在PHP错误日志中得到"Unable to fork XXX"。我尝试过运行whoamiping 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函数不工作?谢谢!

2 个答案:

答案 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。由于我创建了一个新的应用程序池用户,因此它未包含在此策略设置中。添加我创建的应用程序池用户解决了我的问题。