PHP exec()、shell_exec()、system()和passthru()在Windows 7/IIS上不工作
我正在开发环境中使用Windows7x64Enterprise、IIS和PHP5.6.32。我的应用程序的网站具有以下设置:PHP exec()、shell_exec()、system()和passthru()在Windows 7/IIS上不工作,php,windows,iis,exec,shell-exec,Php,Windows,Iis,Exec,Shell Exec,我正在开发环境中使用Windows7x64Enterprise、IIS和PHP5.6.32。我的应用程序的网站具有以下设置: 匿名身份验证:已禁用 Windows身份验证:已启用(协商、协商:Kerboeros、NTLM) 应用程序池:域帐户 除了默认的PHP扩展,我在Windows身份验证模式中使用了Microsoft的PHP SQL Server驱动程序(3.2版本) 我的生产服务器与服务器2008 R2上运行的设置相同 我需要使用exec(),shell\u exec()等来执行一个可
- 匿名身份验证:已禁用
- Windows身份验证:已启用(协商、协商:Kerboeros、NTLM)
- 应用程序池:域帐户
- 除了默认的PHP扩展,我在Windows身份验证模式中使用了Microsoft的PHP SQL Server驱动程序(3.2版本)
exec()
,shell\u exec()
等来执行一个可执行文件(pdftk,如果有必要)。然而,每当我使用这些函数中的任何一个时,我总是在PHP错误日志中看到“Unable to fork XXX”
。我试过运行whoami
,pingxxx
,以及其他简单的命令,结果都是一样的。所有典型的shell函数都不能工作——它们总是导致相同的错误。我已经检查了我的php.ini
文件,并验证了这些函数没有被禁用
但是,在我的生产环境中,我没有这个问题,我也不知道为什么。这似乎只会影响我的开发环境。在我的研究过程中,我确实偶然发现了这个(),出于某种原因,它确实解决了我的问题;但是,它完全破坏了我的SQL Server Windows身份验证(我需要)
我还禁用了我的防病毒软件,希望它可能是罪魁祸首。事实并非如此
在进行更多故障排除时,我确实发现proc\u open()
确实有效。我们正在使用Prince生成PDF,我注意到它在工作,而我的exec()
没有。当我查看Prince类时,我发现它使用的是proc\u open()
,这就解释了它为什么会工作
有人知道为什么
exec()
和相关函数在我的生产环境中而不是在我的开发环境中正常工作吗?为什么proc\u open()
可以工作,而其他shell函数却不能?谢谢 检查文件“C:\WINDOWS\system32\cmd.exe”的权限。
您需要对此文件具有读取/执行权限
我建议使用sysinternals进程监视器“procmon.exe”来确认试图运行“cmd.exe”的用户。
“进程名”上的筛选器是“php cgi.exe”,而“Path”以“cmd.exe”结尾。查看具有“拒绝访问”错误的任务的事件属性,它将显示“模拟”用户名。这通常是“Internet来宾帐户”,通常是“NT AUTHORITY\IUSR”。我想发布一个更新,因为我发现了这个问题。答案可以在zonnet dot nl1的最后一篇文章中找到,作者是
1heer2351
:
找到了问题,并且已经能够解决它
我正在为我的应用程序池使用一个特殊用户(比如AppPoolUser),
所以PHP作为这个用户运行。新的exec函数使用
带有模拟的CreateProcessAsUser()。这意味着
AppPoolUser必须具有更改进程级令牌的权限
您可以在“本地安全设置”中将此权限分配给用户
->用户权限分配
我已授予AppPoolUser“替换进程级令牌”
设置->分叉错误已消失
我认为这可能是有用的信息,所以需要访问
cmd.exe,但另外还有“替换进程级令牌”设置
这正是我所做的。我已使用我的域帐户创建了一个新的应用程序池用户。默认情况下,
Replace a process level token
设置包括DefaultAppPool
。因为我创建了一个新的应用程序池用户,所以它不包括在此策略设置中。添加我创建的应用程序池用户解决了我的问题。是否尝试从http
目录(在网站的根目录中)运行脚本?我正在执行的PHP脚本位于我的wwwroot
目录中。我试图执行的可执行文件位于该目录之外。但是,正如我所说,我不能执行任何类似于ping
,whoami
,等等的操作。只是为了确保我们在同一页上:exec('cmd/c whoami 2>&1',$out,$exitcode)
和$out
都是空的,还是显示错误?关于日志呢?这是我在运行exec
时得到的,例如:var\u dump($out)=数组(0){};变量转储($exitcode)=int(-1)
。在PHP错误日志中,我得到了以下错误:PHP警告:exec():无法在第29行的c:\inetpub\aggframework\app\apinvoices\view\view\u payment\u summary.PHP中分叉[cmd/c whoami 2&;1],您的PHP.INI
文件中是否设置了fastcgi.impersonate=1
?