Azure DevOps构建流水线报TimeZoneCalc.dll访问被拒问题咨询
报错信息:One or more errors occurred. (Access to the path 'c:\Agents\Agent-02_work\1\s\out\Release\bin\TimeZoneCalc.dll' is denied.
错误原因
该报错本质是构建进程访问目标dll文件时被Windows系统拦截,常见触发场景如下:
- 上一次流水线运行异常崩溃/被强制取消,关联进程(dotnet构建进程、测试宿主testhost、加载了该dll的IIS工作进程w3wp等)未正常退出,持续锁定
TimeZoneCalc.dll文件,新构建任务执行覆盖写入操作时触发访问拒绝 - 该代理为自托管部署模式,代理服务的运行账号对工作目录
c:\Agents\Agent-02\_work\及下属子目录、文件缺少读写、修改、删除的完整权限 - 目标路径下的对应dll被标记为只读属性,或被服务器上安装的杀毒软件、终端安全管控软件锁定做实时扫描,阻止了构建进程的写入操作
- 代理池并发配置不合理,同个代理同一时间被调度执行多个流水线任务,多进程并发读写同一份工作目录下的同名dll文件,触发文件锁冲突
排查&解决方案
按优先级依次操作,绝大多数场景下前2步即可解决问题:
- 登录部署Agent-02代理的Windows服务器,打开任务管理器结束所有残留的
dotnet.exe、testhost.exe、w3wp.exe(若该目录下文件被本机IIS站点加载)进程,手动删除c:\Agents\Agent-02\_work\1\s\out整个输出目录后重新触发流水线 - 校验代理服务权限:在服务器服务列表找到Azure Pipelines Agent对应服务,查看其配置的登录运行身份,给该账号授予
c:\Agents\Agent-02\根目录的完全控制权限,将权限继承规则应用到所有子文件、子文件夹 - 给流水线添加前置强制清理步骤,每次构建启动前自动清空旧的输出目录,避免历史残留文件干扰:
可新增一个PowerShell任务执行以下清理逻辑:
如果使用官方的dotnet build/dotnet publish任务,可直接在任务配置面板勾选「清理目标目录」选项,任务执行前会自动清空旧输出文件$outputPath = "$(Build.SourcesDirectory)/out" if (Test-Path $outputPath) { Remove-Item $outputPath -Recurse -Force -ErrorAction SilentlyContinue } - 调整服务器安全软件规则,将代理工作目录
c:\Agents\Agent-02\_work加入杀毒、EDR终端防护的扫描排除列表,避免构建过程中生成的dll文件被实时扫描锁定 - 检查代理池的并发作业配置,确保单个代理同一时间只会分配执行一个流水线任务,避免同目录下的文件并发读写冲突;可给代理服务器配置每周固定时间重启代理服务的计划任务,自动清理长期运行积累的残留进程锁
内容的提问来源于stack exchange,提问作者Naveen Kumar N
相关产品推荐
相关产品推荐

