Windows10特定设备上Strawberry Perl无法打开文件写入问题排查
我遇到了一个非常奇怪的问题,测试用Perl脚本如下:
system('echo > echo.txt'); open(FILE, '>', "out.txt") or die "Can't open file ($^E)"; print FILE "Hello"; close(FILE);
忽略这段脚本写法不规范、未添加use strict和use warnings的问题,所有Perl脚本都存在相同异常。在一台安装了新版Windows10 Pro系统的设备上运行新版Strawberry Perl,执行结果符合预期,会生成echo.txt和out.txt两个文件;但在另一台同样运行Windows10、安装了最新版Strawberry Perl的设备上,脚本仅能生成echo.txt,后续open调用失败,$^E返回“访问被拒绝”(意大利语原文为“Accesso negato”),该问题在所有测试过的目录下都稳定复现。
我已经核查了目录权限:当前登录用户从父目录继承了完整权限,给Everyone组添加完全控制权限后问题依旧,以管理员身份打开命令提示符运行脚本也无效,我还测试了多块物理磁盘上的多个目录,均存在相同问题。
我尝试卸载重装Strawberry Perl,也没有解决问题。补充说明:这台故障设备是两周前刚全新安装的系统,此前未出现任何其他异常。
我到底哪里操作有误?应该是很简单的问题但我没发现,请问该怎么调试这个问题?
更新1
经过测试发现,脚本在c:\Users\...\Downloads目录下运行正常,但在c:\Users\...\Desktop及其子目录、其他用户创建的目录下均运行失败。dir /q命令对两个目录的查询结果如下:
c:\Users\Flavia>dir /q Il volume nell'unità C non ha etichetta. Numero di serie del volume: 28CE-96F1 Directory di c:\Users\Flavia 28.09.2021 14:33 <DIR> BUILTIN\Administrators . 28.09.2021 14:33 <DIR> NT AUTHORITY\SYSTEM .. [...] 29.09.2021 09:14 <DIR> DESKTOP-TBFQ31Q\Flavia Desktop [...] 29.09.2021 09:13 <DIR> DESKTOP-TBFQ31Q\Flavia Downloads [...] 2 File 1’627’775 byte 24 Directory 401’441’447’936 byte disponibili
两个目录的所有者相同,都是运行Perl脚本的用户。icacls的查询结果如下:
c:\Users\Flavia>icacls Desktop Desktop NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F) BUILTIN\Administrators:(I)(OI)(CI)(F) DESKTOP-TBFQ31Q\Flavia:(I)(OI)(CI)(F) Elaborazione completata per 1 file. Elaborazione non riuscita per 0 file c:\Users\Flavia>icacls Downloads Downloads NT AUTHORITY\SYSTEM:(OI)(CI)(F) BUILTIN\Administrators:(OI)(CI)(F) DESKTOP-TBFQ31Q\Flavia:(OI)(CI)(F) Elaborazione completata per 1 file. Elaborazione non riuscita per 0 file
所有账号都拥有(F)完全控制权限,唯一差异是Desktop的权限带有(I)标记,该标记代表权限继承自父目录。我核对了正常运行的设备,其Desktop目录的icacls输出同样带有(I)标记,但脚本运行正常,因此该标记和故障无关。
我使用Process Monitor确认perl.exe尝试写入的路径正确,没有出现路径写错的情况,Desktop子目录下的故障现象和Desktop根目录完全一致。核查失败的perl.exe进程和执行成功的、由perl调用的cmd.exe进程,二者的所有者都符合预期;Downloads目录下perl.exe运行成功,进程信息和故障场景无差异,目前完全没有排查头绪。
更新2
经过和其他技术人员讨论,我怀疑是Windows10的安全功能阻止了特定perl.exe二进制文件的写入操作。我卸载了当前5.32.1.1版本的Strawberry Perl,重装了旧版本5.32.0.1,问题彻底解决。但另一台正常运行的设备安装的就是5.32.1.1版本,且两台设备使用的MSI安装包完全一致,原因不明。目前我的即时问题已经解决,但仍然不清楚故障根因和正确的调试方法。
内容的提问来源于stack exchange,提问作者Paolo

