Windows环境下PHP访问网络共享文件夹提示mkdir()权限被拒绝如何解决?
解决方案
该问题的根本原因是Windows环境下PHP运行时使用的服务账户默认无SMB网络共享的访问权限,且映射盘符为用户会话级资源,服务账户默认无法读取用户登录时创建的映射盘,可按以下步骤逐一排查解决:
- 第一步:确认PHP运行身份
新建测试文件运行如下代码,获取PHP实际运行的Windows账户名:<?php echo exec('whoami'); ?> - 第二步:配置共享文件夹权限
前往SMB共享文件夹所在的主机,依次配置两处权限:- 右键目标文件夹→【属性】→【共享】→【高级共享】→【权限】,添加第一步查到的PHP运行账户,授予修改、读取、写入权限
- 切换到【安全】选项卡,同样添加该PHP运行账户,授予修改、读取、写入、列出文件夹内容的NTFS权限
- 第三步:优先使用UNC路径替代映射盘符
Windows系统中映射的盘符属于登录用户的会话专属资源,PHP服务运行在独立会话中无法识别用户手动映射的Z盘等盘符,建议直接使用\\192.168.1.1\File\格式的UNC路径操作共享资源,示例修改后的代码:<?php // 若共享需要身份验证,先执行net use命令完成挂载验证 exec('net use \\\\192.168.1.1\\File /user:共享端用户名 共享端密码 /persistent:no'); $old = 'index.php'; $new = '\\\\192.168.1.1\\File\\index.php'; // 创建目录示例 // if(!file_exists(dirname($new))){ // mkdir(dirname($new),0777,true); // } if (!copy($old, $new)) { echo "$old 复制失败\n"; } // 操作完成后可主动清理连接 exec('net use \\\\192.168.1.1\\File /delete'); ?> - 第四步:解除函数限制
若使用exec类命令验证共享,需先打开php.ini配置文件,从disable_functions配置项中移除exec、shell_exec等需要使用的函数,重启PHP服务后生效。 - 额外排查项:
- 确认共享主机与PHP运行主机的445端口连通正常,无防火墙拦截SMB请求
- 若使用域环境,需确保PHP运行账户属于域内且已被授予共享访问权限
- 操作共享目录前可先使用
is_writable()函数判断路径是否可写,提前定位权限问题
内容的提问来源于stack exchange,提问作者Berkay KARADENİZ
相关产品推荐
相关产品推荐

