ECHO ON
if not exist X:\ (
net use X: \\10.161.83.23\freeswitch /persistent:yes /user:Administrator q1w2Q!W@
ECHO %Date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2% >> C:\NetDiskMount.log
net use >> C:\NetDiskMount.log
) else (
ECHO %Date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2% >> C:\NetDiskMount.log
ECHO "exist X:\" >> C:\NetDiskMount.log
net use >> C:\NetDiskMount.log
)
whoami >> C:\NetDiskMount.log
EXIT
ECHO schtasks /create /tn "NetDiskMount" /tr "C:\NetDiskMount.bat" /sc onstart /RU SYSTEM /RL HIGHEST
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 X:\ (
net use X: \\10.161.83.23\freeswitch /persistent:yes /user:Administrator q1w2Q!W@
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 X:\" >> D:\MapNetworkDrive.log
net use >> D:\MapNetworkDrive.log
)
ECHO net use X: /delete
ECHO See what user this batch job ran under
whoami >> D:\MapNetworkDrive.log
ECHO need to exit to allow the job to finish
EXIT
ECHO schtasks /create /tn "MapNetworkDrive" /tr "C:\Users\Administrator\Desktop\MapNetworkDrive.bat" /sc onstart /RU SYSTEM /RL HIGHEST
https://winfsp.dev/rel/
应用程序做成服务启动后不能访问网络共享磁盘,如是在网上找了些资料,下面是网上的资料:
我映射一个网络驱动器到本机的时候,发现本机的程序直接能访问读取网络驱动器,但是把本机的程序作为本机的windows服务运行的时候就不能访问了。
Qt中的QDir::exist(folder)访问失败。
这样导致的原因是映射网络驱动器,需要服务程序运行的权限账户和远程共享文件的机器要运行在同一个域(Domain)
下面,用PStool这个工具就可以了,它直接使用SYSTEM账户权限,来映射网络驱动器。这样,远程驱动器和本机的service就处于同一个域下了。
注意:这个是比较hack的做法,并不推荐这么做。微软是不支持的。
1.用psexec创建网络驱动器:
admin 权限运行CMD,然后运行psexec -i -s cmd.exe
然后在新打开的CMD窗口中运行以下命令映射网络驱动器Z盘, net use z: \\server_ip\share_folder /persistent:yes
以上的net命令可能会让你输入远程的系统用户名和密码,我的远程是XP,所以用户名密码是:Administrator/无密码
注: 所有微软的Windows 系统默认管理员用户都是Administator 而密码是你自己设定的,系统没有默认密码
2.运行本机windows服务,成功访问网络驱动器Z
references:
http://stackoverflow.com/questions/18632193/directory-exists-returns-false-for-mapped-drive-in-c-sharp-coding
http://stackoverflow.com/questions/3622089/windows-service-cant-access-network-share
http://serverfault.com/questions/177139/windows-service-cant-access-network-share
http://stackoverflow.com/questions/182750/map-a-network-drive-to-be-used-by-a-service
https://technet.microsoft.com/en-us/sysinternals/psexec (PStool工具下载)
下面是我个人的笔记:
1.首先把psexec.exe文件拷贝到c:/windows/system32路径下面;
2.用psexec创建网络驱动器:
admin 权限运行CMD,然后运行psexec -i -s cmd.exe
3.在新打开的cmd命令窗口运行网络驱动器Z盘,命令:net use z: \\server_ip\share_folder /persistent:yes
net use z: \\172.17.134.124\test /persistent:yes
执行完上面命令,需要输入登录账户和密码,账户是administrator,注意上面命令有两个空格,盘符z:后面
有一个空格,共享文件夹后面后一个空格。
4.执行完后,在cmd命令窗口已经可以访问共享磁盘了,可以输入z: 回车看看能不能访问。到这里已经完成。
5.可是在我的电脑在并不能看到z的盘符,或者看到了z的盘符,但并不能连接进去,操作起来不方便,可以按
之前映射网络磁盘的方式再映射一次,右击我的电脑->映射网络磁盘驱动器->输入用户名密码,连接后,既可以
应用程序或者windows server访问共享文件夹,也可以在我的电脑里面直接双击查看共享文件夹。
作者:Alex_ct
链接:https://www.jianshu.com/p/8417cea3a122
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Windows Service 服务中,不能访问挂载目录(网络映射盘)
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 net use G: /delete
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
确保命令可以正确运行(有时候服务器会限制连接数,导致挂载失败)
net use G: /delete
删除共享盘
创建 任务计划
关键 — 使用命令创建 任务计划
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
net use 拒绝访问
解决方案:更改目标计算机的设置。
组策略>计算机配置>Windows设置>安全设置>本地策略>安全选项
将 网络访问:本地帐户的共享和安全模式 改为 经典
本文来自博客园,作者:VipSoft 转载请注明原文链接:https://www.cnblogs.com/vipsoft/p/17239713.html