我在 Windows11 上,用服务的方式注册了 GitLab Runner 工具,让 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/post/Windows-11-%E5%9C%A8-GitLab-Runner-%E6%9C%8D%E5%8A%A1%E5%86%85%E6%89%BE%E4%B8%8D%E5%88%B0-SMB-%E6%8C%82%E8%BD%BD%E7%9A%84-NAS-%E6%96%87%E4%BB%B6%E5%A4%B9.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

如果你想持续阅读我的最新博客,请点击 RSS 订阅,推荐使用RSS Stalker订阅博客,或者收藏我的博客导航

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

微软最具价值专家


无盈利,不卖课,做纯粹的技术博客

以下是广告时间

推荐关注 Edi.Wang 的公众号

欢迎进入 Eleven 老师组建的 .NET 社区

以上广告全是友情推广,无盈利