Windows 11 在 GitLab Runner 服务内找不到 SMB 挂载的 NAS 文件夹
我尝试在 GitLab Runner 服务调度启动的进程里面,使用 Directory.Exists(@"Y:\")
这句代码时,发现返回的是文件夹不存在。但我明明就存在 Y 盘这个 SMB 挂载的网络映射驱动器。我尝试自己在机器上直接 dotnet run 运行这句代码时,却很符合预期地返回了文件夹存在。感觉就是 Windows 的服务正在投毒
我在昨天跑得时候还是好好的,但是昨天晚上有一次系统更新,系统更新之后重启机器,我就发现在 GitLab Runner 服务里面调度起来的进程都找不到 SMB 挂载的 NAS 文件夹
在 lsj 伙伴的帮助下,尝试推进了 net use
命令到 GitLab Runner 服务调度的新进程里面跑,看到输出信息如下
net use
会记录新的网络连接。
状态 本地 远程 网络
-------------------------------------------------------------------------------
不可用 Y: \\nas.lindexi.com\Data Microsoft Windows Network
命令成功完成。
再推进 PowerShell 的 powershell Get-SmbMapping 命令,也是输出状态不可用,输出信息如下
powershell Get-SmbMapping
Status Local Path Remote Path
------ ---------- -----------
Unavailable Y: \\nas.lindexi.com\Data
ExitCode: 0
相同的命令,我在服务之外,自己用 win+r 打开 PowerShell 运行却是输出好好的,挂载 SMB 文件夹在资源管理器里面也能看到
PS C:\Users\lindexi> Get-SmbMapping
Status Local Path Remote Path
------ ---------- -----------
OK Y: \\nas.lindexi.com\Data
根据 映射的网络驱动器可能无法在 Windows 10 版本 1809 中重新连接 - Windows Client - Microsoft Learn 文档可知,这可能是一个已知问题,但这篇文档没有提及服务运行进程的差异
我再次推进挂载命令 powershell New-SmbMapping -LocalPath Y: -RemotePath \\nas.lindexi.com\Data -Persistent $True
给到 GitLab Runner 调度的进程,此时输出挂载成功
powershell New-SmbMapping -LocalPath Y: -RemotePath \\nas.lindexi.com\Data -Persistent $True
Status Local Path Remote Path
------ ---------- -----------
OK Y: \\nas.lindexi.com\Data
ExitCode: 0
powershell Get-SmbMapping
Status Local Path Remote Path
------ ---------- -----------
OK Y: \\nas.lindexi.com\Data
ExitCode: 0
这句 New-SmbMapping 命令传入的时候不需要带密码了,也不能重复调用,重复调用会遇到以下错误信息
New-SmbMapping : 本地设备名已在使用中。
所在位置 行:1 字符: 1
+ New-SmbMapping -LocalPath Y: -RemotePath \\nas.lindexi.com\Data -Per ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (MSFT_SmbMapping:ROOT/Microsoft/...MSFT_SmbMapping) [New-SmbMapping], CimE
xception
+ FullyQualifiedErrorId : Windows System Error 85,New-SmbMapping
执行完成 New-SmbMapping 命令之后,重新在 GitLab Runner 服务调度启动的进程里面,使用 Directory.Exists(@"Y:\")
这句代码时,可以正常返回文件夹存在,问题解决
有伙伴和我反馈说调用 powershell New-SmbMapping -LocalPath Y: -RemotePath \\nas.lindexi.com\Data -Persistent $True
时,出现了以下错误信息
New-SmbMapping : Cannot process argument transformation on parameter 'Persistent'. Cannot convert value "System.String"
to type "System.Boolean". Boolean parameters accept only Boolean values and numbers, such as $True, $False, 1 or 0.
At line:1 char:78
也不知道是哪里挂了,核心说的是将 $True
识别为 System.String 字符串了
解决方法就是将 $True
改成 1 就好了,修改之后的命令如下
powershell New-SmbMapping -LocalPath Y: -RemotePath \\nas.lindexi.com\Data -Persistent 1
修改之后的 .gitlab-ci.yml
文件内容大概如下
stages:
- build
Build:
stage: build
script:
- 'powershell New-SmbMapping -LocalPath Y: -RemotePath \\nas.lindexi.com\Data -Persistent 1'
博客园博客只做备份,博客发布就不再更新,如果想看最新博客,请访问 https://blog.lindexi.com/
如图片看不见,请在浏览器开启不安全http内容兼容

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名[林德熙](https://www.cnblogs.com/lindexi)(包含链接:https://www.cnblogs.com/lindexi ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我[联系](mailto:[email protected])。