SpringBoot Windows 自启动 - 通过 Windows Service 服务实现
Windows Service 服务中,不能访问挂载目录(网络映射盘)
在Windows操作系统中,系统服务(Services)、计划任务(Scheduled Tasks)以及很多系统调用都是以SYSTEM系统账号进行操作的。用 net use 挂载,或者在文件管理器上直接挂载,挂载卷是以 Administrator 身份进行挂载的,而 SYSTEM 账号无法使用 Administrator 挂载的文件卷。
net use X: \\172.16.0.88\Tools /persistent:yes /user:share share
网盘挂载(映射网络驱动器)
详见:https://www.cnblogs.com/vipsoft/p/17059153.html
注意:资源管理器里的映射网络磁盘,Windows Service 无法访问,需使用命令创建
测试代码
@GetMapping("/network") public String testPath(HttpServletRequest request) { String path=request.getParameter("path"); String result = ""; if (FileUtil.exist(path)) { result = ("挂载目录,存在 => " + path); } else { result = ("挂载目录,不存在 => " + path); } return result; }
正常运行
http://localhost:8080/demo/network?path=D%3A\
做成服务
SpringBoot 做成 Windows Service 服务:https://www.cnblogs.com/vipsoft/p/17236063.html
做成 Windows Service 服务后,挂载盘不可访问,如下图所示:
解决方案1(可以跳至方案2)
此方案,服务器重启后失效,需要重新配置 (可以跳过,看解决方案2)
下载PsExec
https://learn.microsoft.com/zh-cn/sysinternals/downloads/psexec
执行命令
- 运行CMD,执行
psexec -i -s cmd.exe
- 在新开的CMD窗口中运行网络映射
net use z: \\10.10.x.xxx\test /persistent:yes
- 输入用户名和密码映射成功
- 重启服务,成功访问网络映射盘
解决方案2
不可以在登录后的系统中创建,通过 whoami 输出会发出执行用户不同
同样是使用命令,只是利用 任务计划程序 ,使得系统重启后,能够再次执行挂载。
使用命令映射 Y 盘,注意此命令运行映射的盘符不可以在资源管理器中的同名,否则会报已存在
创建 批处理文件
MapNetworkDrive.bat
ECHO ON ECHO This will map the drive, but is being run by task scheduler AS the user SYSTEM ECHO which should make it accessible to the user SYSTEM ECHO List the existing drives first. if not exist G:\ ( net use G: \\172.16.0.88\Tools /persistent:yes /user:share share ECHO %Date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2% >> D:\MapNetworkDrive.log net use >> D:\MapNetworkDrive.log ) else ( ECHO %Date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2% >> D:\MapNetworkDrive.log ECHO "exist G:\" >> D:\MapNetworkDrive.log net use >> D:\MapNetworkDrive.log ) ECHO See what user this batch job ran under whoami >> D:\MapNetworkDrive.log ECHO need to exit to allow the job to finish EXIT
执行: net use X: \\172.16.0.88\Tools /persistent:yes /user:share share
确保命令可以正确运行(有时候服务器会限制连接数,导致挂载失败)
创建 任务计划
关键 -- 使用命令创建 任务计划
schtasks /create /tn "MapNetworkDrive" /tr "D:\MapNetworkDrive.bat" /sc onstart /RU SYSTEM /RL HIGHEST
重启系统
日志文件 MapNetworkDrive.log
重点:nt authority\system
会记录新的网络连接。 状态 本地 远程 网络 ------------------------------------------------------------------------------- OK G: \\172.16.0.88\Tools Microsoft Windows Network 命令成功完成。 nt authority\system