PHP中shell_exec()在IIS环境下失效需排查哪些内容?
检查IIS应用程序池运行身份权限
默认的ApplicationPoolIdentity权限极低,无法执行系统命令。可临时切换为LocalSystem测试(生产环境不推荐),或配置具备足够权限的本地/域账户,确保该账户能访问cmd.exe及whoami.exe所在的C:\Windows\System32目录。验证PHP FastCGI配置
若PHP通过FastCGI部署,检查FastCGI的requestTimeout参数是否过短导致命令超时;同时确认FastCGI进程的运行身份权限与应用程序池匹配,避免权限不一致问题。使用命令绝对路径并检查环境变量
尝试用绝对路径执行命令:shell_exec('C:\Windows\System32\whoami.exe 2>&1'),因为PHP的环境变量可能未包含系统命令目录。同时确认PHP的PATH环境变量包含C:\Windows\System32。排查Windows安全限制
查看本地安全策略中的“软件限制策略”“应用程序控制策略”,确认未禁止PHP进程(如php-cgi.exe)调用cmd.exe或whoami.exe;检查杀毒软件/Windows Defender日志,是否拦截了PHP发起的命令执行请求。查看PHP与IIS日志
开启PHP错误日志(在php.ini中设置error_log路径、error_reporting = E_ALL),排查是否有未在页面输出的隐藏错误;同时检查IIS站点日志和应用程序池日志,寻找权限或执行相关的错误记录。调整FastCGI输出配置
检查IIS的FastCGI设置,确保stderrMode参数配置正确,允许stderr输出传递到PHP,避免命令的错误信息(已通过2>&1重定向)无法返回。
内容的提问来源于stack exchange,提问作者Leventogenna

