微信搜索superit|邀请体验:大数据, 数据管理、OLAP分析与可视化平台 | 赞助作者:赞助作者

正常程序转成windows服务程序后 不能访问网络共享盘的解决方案

架构 aide_941 6℃ 0评论

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\
image

做成服务

SpringBoot 做成 Windows Service 服务:https://www.cnblogs.com/vipsoft/p/17236063.html
做成 Windows Service 服务后,挂载盘不可访问,如下图所示:
image

解决方案1(可以跳至方案2)

此方案,服务器重启后失效,需要重新配置 (可以跳过,看解决方案2)

下载PsExec

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

执行命令

  1. 运行CMD,执行 psexec -i -s cmd.exe
    image
  2. 在新开的CMD窗口中运行网络映射 net use z: \\10.10.x.xxx\test /persistent:yes
    image
  3. 输入用户名和密码映射成功
  4. 重启服务,成功访问网络映射盘
    image

 

解决方案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
image

重启系统

image

日志文件 MapNetworkDrive.log

重点:nt authority\system

会记录新的网络连接。

状态       本地        远程                      网络

-------------------------------------------------------------------------------
OK           G:        \\172.16.0.88\Tools      Microsoft Windows Network

命令成功完成。

nt authority\system

net use 拒绝访问
image

解决方案:更改目标计算机的设置。
组策略>计算机配置>Windows设置>安全设置>本地策略>安全选项

将 网络访问:本地帐户的共享和安全模式 改为 经典

转载请注明:SuperIT » 正常程序转成windows服务程序后 不能访问网络共享盘的解决方案

喜欢 (0)or分享 (0)

您必须 登录 才能发表评论!