.NET C#服务调用System.Diagnostics.Process无法访问共享盘符问题求助
问题根因
该问题和C# Process逻辑、Python代码无关,是Windows服务的固有特性导致:
- 网络盘符映射是用户会话级别的,你当前登录用户挂载的Z盘仅在当前用户会话生效,Windows服务默认运行在独立的Session 0会话,无法识别普通用户挂载的盘符
- 服务默认使用的LocalSystem、NetworkService等内置账户,默认没有网络共享资源的访问权限,就算传入路径也无法正常访问
可行解决方法
方法一:修改服务运行账户(最简单快捷)
- 打开服务管理器(按
Win+R输入services.msc回车),找到你部署的服务,右键选择「属性」→「登录」选项卡 - 勾选「此账户」,输入你日常登录系统、可正常访问Z盘的用户名和密码,点击确认后重启服务即可
方法二:替换盘符为UNC路径
- 首先查询Z盘对应的UNC路径:打开CMD执行命令
net use Z:,即可获取Z盘映射的完整共享路径,格式类似\\192.168.x.x\共享文件夹名 - 将代码中传入的
Iblur_dir参数的盘符前缀替换为UNC路径,例如将Z:\2021-08-18\14替换为\\192.168.x.x\共享文件夹名\2021-08-18\14 - 该方法需配合方法一使用,保证服务运行账户有权限访问对应共享路径
方法三:服务内主动挂载网络盘符
如果业务必须使用Z盘盘符,可在调用Python exe之前,先通过代码执行网络映射命令挂载Z盘,示例逻辑如下:
// 先挂载Z盘 Process mapProcess = new Process(); mapProcess.StartInfo.FileName = "net.exe"; // 替换为实际的共享路径、访问用户名和密码 mapProcess.StartInfo.Arguments = @"use Z: \\192.168.x.x\共享文件夹 密码 /user:用户名 /persistent:no"; mapProcess.StartInfo.UseShellExecute = false; mapProcess.StartInfo.CreateNoWindow = true; mapProcess.Start(); mapProcess.WaitForExit(); // 挂载完成后再执行原有的调用Python exe的逻辑
额外排查点
如果使用域环境共享,确认服务运行账户属于有权限访问共享资源的域用户组;测试阶段可临时关闭共享端的密码保护共享,排除权限验证问题。
内容的提问来源于stack exchange,提问作者LSG
相关产品推荐
相关产品推荐

