如何在Windows Server 2019上配置PHP使其可执行XCOPY等外部命令
解决方案步骤
1. 确认PHP运行身份
首先通过以下代码获取PHP当前运行的系统账户,后续所有权限配置都针对该账户操作:
<?php echo shell_exec('whoami'); ?>
运行该页面后记下输出的账户名,IIS环境下一般为IIS APPPOOL\你的应用池名称,Apache环境下为Apache服务绑定的登录账户。
2. 配置系统可执行文件权限
Windows Server 2019对System32目录下的内置工具默认权限限制远高于2012,需要单独给PHP运行账户开放xcopy的执行权限:
- 找到
C:\Windows\System32\xcopy.exe,右键选择「属性」-「安全」,点击「编辑」添加刚才查到的PHP运行账户,勾选「读取和执行」权限后保存。 - 如果你使用的是32位版本的PHP,还需要同时给
C:\Windows\SysWOW64\xcopy.exe配置相同的权限。 - 如果你后续还要调用PDF转换工具、自定义中间件,也按照同样逻辑给对应程序的exe文件添加PHP运行账户的读取和执行权限。
3. 修复COM组件调用权限
针对之前碰到的COM连接报错问题,按以下步骤配置:
- 按下
Win+R输入dcomcnfg打开组件服务管理器,依次展开「组件服务」-「计算机」-「我的电脑」-「DCOM配置」。 - 找到对应Word的COM组件(名称一般为「Microsoft Word 97 - 2003 文档」,随Office版本略有差异),右键选择「属性」。
- 切换到「安全」标签页,「启动和激活权限」「访问权限」「配置权限」三项都选择「自定义」,点击「编辑」添加PHP运行账户,分别授予本地启动、本地激活、本地访问权限。
- 切换到「标识」标签页,选择「交互式用户」或者指定一个具备管理员权限的固定本地用户,不要使用默认的「启动用户」选项,Windows Server 2019默认限制服务上下文的COM跨进程调用。
4. 调整PHP配置与代码转义
- 打开php.ini配置文件,查找
disable_functions配置项,确认shell_exec、exec等执行函数没有被列入禁用列表,修改后重启PHP对应的服务(IIS应用池/Apache)。 - 你的测试代码需要修正路径转义问题,Windows路径的反斜杠在PHP字符串中需要转义,正确写法如下:
$answer = shell_exec('xcopy /S /I /Q /Y /F "C:\\IN\\Word.docx" "C:\\OUT\\"'); echo $answer;
5. 额外安全策略调整
你已经禁用了UAC,还需要确认本地安全策略的对应配置:
- 按下
Win+R输入secpol.msc打开本地安全策略编辑器,依次展开「本地策略」-「安全选项」。 - 找到策略项「用户账户控制:以管理员批准模式运行所有管理员」,设置为「已禁用」,重启服务器后生效。
内容的提问来源于stack exchange,提问作者user16674741
相关产品推荐
相关产品推荐

