我在 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:\")
这句代码时,可以正常返回文件夹存在,问题解决
本文会经常更新,请阅读原文: 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 社区
以上广告全是友情推广,无盈利