jar包做成Windows Service 服务,不能访问网络映射磁盘

在Windows操作系统中,系统服务(Services)、计划任务(Scheduled Tasks)以及很多系统调用都是以SYSTEM系统账号进行操作的。用 net use 挂载,或者在文件管理器上直接挂载,挂载卷是以 Administrator 身份进行挂载的,而 SYSTEM 账号无法使用 Administrator 挂载的文件卷。

一、方法一:使用winSW工具,注册为windows系统服务

1、新建 MapNetworkDrive.bat文件

@echo off
:: 远程地址   
set "target=192.168.0.87"
:: 重试次数  
set "retry_count=0"
:: 最大重试次数  
set "max_retries=5"
:: 日志地址  
set "logfile=D:\mapNetworkDrive\MapNetworkDrive.log" 
set "username=用户名"  
set "password=密码"  
:: 远程地址共享目录
set "share=\\%target%\sfpt"
:: 映射盘符  
set "drive=Y:"  
  
:: 获取当前日期和时间  
for /f "delims=" %%a in ('powershell -Command "(Get-Date).ToString('yyyy-MM-dd HH:mm:ss')"') do set "current_datetime=%%a"  
  
:while  
ping -n 1 %target% > nul  
if %errorlevel% == 0 (  
    if not exist %drive% (  
        net use %drive% %share% %password% /user:%username%  
        if %errorlevel% == 0 (  
            echo %current_datetime% - %target% is reachable and %drive% is mapped. >> %logfile%  
            goto :end  
        ) else (  
            echo %current_datetime% - Failed to map %drive%. >> %logfile%  
        )  
    ) else (  
        echo %current_datetime% - %drive% already exists. >> %logfile%  
    )  
    goto :end  
) else (  
    echo %current_datetime% - %target% is not reachable. >> %logfile%  
    set /a "retry_count+=1"  
    if %retry_count% LSS %max_retries% (  
        echo Retrying...  
        timeout 5  
        goto :while  
    ) else (  
        echo %current_datetime% - Maximum retries exceeded. >> %logfile%  
    )  
)  
  
:end  
echo See what user this batch job ran under  
whoami >> %logfile%  
echo Task completed. Exiting...  
EXIT

2、配置map-network-driver.xml.xml,winSW.exe改名为map-network-driver.exe

<service>
  <!-- ID of the service. It should be unique accross the Windows system-->
    <!--服务ID:启动、关闭、删除服务时,都是通过ID来操作的-->
  <id>map-network-drive-service</id>
  <!-- Display name of the service -->
  <name>map-network-drive-service</name>
  <!-- Service description -->
  <description>mount a network drive</description>
  <!-- 该元素指定要启动的可执行文件 -->
  <executable>MapNetworkDrive.bat</executable>
  <!--
    OPTION: startmode
    Defines start mode of the service.
    Supported modes: Automatic, Manual, Boot, System (latter ones are supported for driver services only)
    Default mode: Automatic
  -->
  <startmode>Automatic</startmode>
  <waithint>15 sec</waithint>
  <sleeptime>1 sec</sleeptime>
  <log mode="roll-by-size">
    <sizeThreshold>10240</sizeThreshold>
    <keepFiles>8</keepFiles>
  </log>
</service>

 3、cmd中执行命令

map-network-driver.exe install

 4、检查是否注册成功

5、检查是否映射成功

 

二、方法二:做成任务计划,开机自动挂载

1、新建 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 Y:\ (    
  net use Y: \\10.x.x.x\文件夹 密码 /user:用户名
  ECHO %Date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2% >> D:\mapNetworkDrive\MapNetworkDrive.log
  net use >> D:\mapNetworkDrive\MapNetworkDrive.log
) else (
  ECHO %Date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2% >>  D:\mapNetworkDrive\MapNetworkDrive.log
  ECHO "exist Y:\" >>  D:\mapNetworkDrive\MapNetworkDrive.log
  net use >>  D:\mapNetworkDrive\MapNetworkDrive.log
)

ECHO See what user this batch job ran under

whoami >>  D:\mapNetworkDrive\MapNetworkDrive.log

ECHO need to exit to allow the job to finish
EXIT

2、执行命令,创建任务计划

schtasks /create /tn "MapNetworkDrive" /tr "D:\mapNetworkDrive\MapNetworkDrive.bat" /sc onstart /RU SYSTEM /RL HIGHEST

3、重启电脑,查看日志

(3.1) 执行成功日志

 (3.2) 没成功日志,检查bat文件。

(3.3)任务计划程序运行,运行记录显示“上次运行结果(0x1),

选中该任务,右键,选择操作,编辑添加属性“起始于”(将bat文件的上层目录填入)。如果是windows server2012及以后的操作系统,需要配置起始位置,之前版本的操作系统则不需要 。

  • 代码 0 或 0x0:操作成功完成。
  • 代码 1 或 0x1:调用的函数不正确或调用了未知函数。
  • 代码 10 或 0xa:环境不正确。
  • 代码 0x8009000f:常规访问被拒绝

二、方法二:临时修改,重启后失效,需要重新配置

1、下载psexec工具

https://learn.microsoft.com/zh-cn/sysinternals/downloads/psexec

2、在解压后的PSTool文件夹下,运行CMD,执行 psexec -i -s cmd.exe

psexec 是一个命令行工具,用于在 Windows 系统上执行远程命令。-i 和 -s 是两个选项,它们的意思分别是:

  • -i:以交互方式运行命令。这将启动一个会话,允许用户与远程系统进行交互。这意味着在执行命令之前,会提示用户输入密码。
  • -s:以静默方式运行命令。这将禁用命令行界面,使命令在后台运行,不会显示任何输出。

因此,psexec -i -s cmd.exe 的意思是启动一个交互式的会话,以静默方式运行 cmd.exe 命令。这将允许用户通过命令行界面与远程系统进行交互,同时不会显示任何输出。

2、在新开的CMD窗口中运行命令 net use z: \\10.x.x.xxx\test /persistent:yes

会让输入用户名和密码,密码不显示,执行成功后映射成功

net use 是一个命令行工具,用于在 Windows 系统上管理网络驱动器。z: 是要挂载的网络驱动器的盘符,\\10.x.x.xxx\test 是要挂载的网络路径。 /persistent:yes 表示该驱动器将一直保持挂载状态,直到手动卸载。

因此,net use z: \\10.x.x.xxx\test /persistent:yes 的意思是将网络驱动器挂载到 z: 盘符,指向服务器的共享路径 \\10.x.x.xxx\test,并且设置为持久挂载。这意味着在系统重启后,该驱动器仍然会挂载。

 3、重启服务,服务即可访问映射网络磁盘。

重启后可能需要重新执行。

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值