You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP 8中exec命令完全无法执行,需调整哪些权限?

问题描述

当通过浏览器访问http://example.com/exec.php时,PHP的exec命令始终无法返回有效结果。测试代码如下:

<?php
set_error_handler(function(int $errno, string $errstr, ?string $errfile = null, ?int $errline = null, ?array $errcontext = null) {
    throw new \ErrorException($errstr, $errno, E_ERROR, $errfile, $errline);
}, E_ALL);
ini_set('display_errors', 'On');
error_reporting(E_ALL);

$command = 'echo "Hello"';
$command = 'dir';
$command = '"C:\\path\\to\\specific.exe"';
$command = 'whoami';

$result = exec($command . ' 2>&1', $output, $return_var);
var_dump($command);
var_dump($output);
var_dump($return_var);
var_dump($result);

浏览器中运行后返回结果:

string(6) "whoami"
array(0) {
}
int(1)
string(0) ""

直接在命令行执行PHP脚本可正常返回预期结果,且已确认:

  • php.ini中disabled_functions为空
  • open_basedir已禁用
  • get_current_user()返回IUSR
  • 已为目标程序分配IUSR和IIS_IUSRS的读取与执行权限
权限调整方案

1. 配置应用程序池身份权限

浏览器访问时,PHP通过IIS应用程序池运行,默认身份为ApplicationPoolIdentity(而非IUSR),需给该身份分配权限:

  • 打开IIS管理器,找到对应网站的应用程序池,右键选择「高级设置」,查看「标识」字段(格式为IIS AppPool\[应用程序池名称])
  • 给该身份添加以下权限:
    • 目标程序所在目录的读取、列出文件夹内容、执行权限
    • 系统命令(如whoami)所在的C:\Windows\System32目录的读取、执行权限

2. 确保命令路径完整或加载用户配置文件

浏览器环境的系统环境变量可能缺失,导致无法找到系统命令:

  • 直接使用命令的完整路径,比如将whoami改为C:\\Windows\\System32\\whoami.exe
  • 或在应用程序池高级设置中勾选「加载用户配置文件」,确保环境变量正常加载

3. 调整临时目录权限

PHP执行exec时依赖临时目录,需给IUSR或应用程序池身份分配临时目录的读写权限:

  • 临时目录通常为C:\Windows\Temp或PHP配置的sys_temp_dir
  • 右键目录→属性→安全→编辑→添加对应身份,分配读取、写入、修改权限

4. 排查UAC限制

若服务器开启UAC,可能限制IIS进程执行命令:

  • 可临时将应用程序池身份改为LocalSystem测试,若能正常执行,说明是UAC或权限限制问题
  • 生产环境建议保留ApplicationPoolIdentity,通过本地安全策略调整UAC对IIS进程的限制

内容的提问来源于stack exchange,提问作者radar33

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 18:53:14