Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP exec()、shell_exec()、system()和passthru()在Windows 7/IIS上不工作_Php_Windows_Iis_Exec_Shell Exec - Fatal编程技术网

PHP exec()、shell_exec()、system()和passthru()在Windows 7/IIS上不工作

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()等来执行一个可

我正在开发环境中使用Windows7x64Enterprise、IIS和PHP5.6.32。我的应用程序的网站具有以下设置:

  • 匿名身份验证:已禁用
  • Windows身份验证:已启用(协商、协商:Kerboeros、NTLM)
  • 应用程序池:域帐户
  • 除了默认的PHP扩展,我在Windows身份验证模式中使用了Microsoft的PHP SQL Server驱动程序(3.2版本)
我的生产服务器与服务器2008 R2上运行的设置相同

我需要使用
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