关于应用程序采用Windows Service或者IIS启动,无法访问资源管理器创建的网络驱动器(CIFS/SMB)的解决办法

   本文主要针对共享目录来解决这个问题,之前碰到NFS,解决办法类似,所以就不重复叙述了

  应用程序采用Windows Service或者IIS作为守护进程,当要访问Cifs/SMB一般有三个方式:

    1. 直接通过UNC格式访问,但是一般存在认证问题
    2. 代码直接访问,但是在大数据量中存在性能问题(前面有相关的文章介绍过)
    3. 通过资源管理器映射网络驱动器,但是直接运行的程序可以访问,通过Windows Service或者IIS作为守护进程程序访问不到 

  Windows Service或者IIS不能访问资源管理器映射的网络驱动器的原因:

    会话隔离(主要)‌:Windows服务和IIS通常以系统账户或特定服务账户运行,这些账户与当前用户会话隔离。资源管理器映射的网络驱动器仅对当前用户会话有效,因此服务或IIS无法访问。‌ 
    凭据管理(次要)‌:映射驱动器可能依赖用户会话的凭据,而服务账户缺乏这些凭据的持久访问权限,导致连接失败。‌ ‌
    配置限制‌(次要):系统默认设置可能阻止未加密的RPC连接或限制网络访问,进一步阻碍访问。‌ 

  说白了,其实主要原因就是Windows服务或者IIS和当前资源管理器运行在不同的用户会话,就好比两个房间,你再一个房间里面干的事情,另外一个房间的人自己看不到。

  一般解决办法有两个:

  方法一:通过自定义bat启动程序,先将Cifs/SMB映射成网络驱动器,再启动程序

  换句话说,就是我们我们把程序放到bat脚本中去启动执行,再启动前先使用命令去创建网络驱动器,例如创建一个start.bat

    net use z: \\192.168.139.128\demo /persistent:yes /user:feng 123456
    Demo.Web.exe --urls=http://0.0.0.0:5050 --environment=Production

  方法二:用psexec创建网络驱动器

    PsExec是一种轻量级的telnet替代品,可以在其他系统上执行进程,完成控制台应用程序的完全交互,而无需手动安装客户端软件。
    基本原理是:通过管道在远程目标机器上创建一个psexec服务,并在本地磁盘中生成一个名为"PSEXESVC"的二进制文件。然后,通过psexec服务运行命令,运行结束后删除服务。

  psexec下载地址:https://download.sysinternals.com/files/PSTools.zip

  创建步骤:

    1. 使用管理员权限运行CMD
    2. 在CMD窗口中运行psexec -i -s cmd.exe,可以理解为连接系统用户会话并以最高权限执行cmd进行会话交互
    3. 在新打开的CMD窗口中创建网络驱动器,如:net use z: \\192.168.139.128\demo /persistent:yes /user:feng 123456

  注意,这种方式创建的网络驱动器貌似系统重启可能会丢失,但是话说回来,我们的服务器应该很少会重启吧

 

  总结

   其实网上还有个办法,就是在代码里面通过DllImport来调用来创建网络驱动器,然后再来访问,当然这个办法也是可行的,但是问题在于它不方便跨平台,所以笔者就放弃这个了。

  上面两个做法各有千秋,笔者都使用过,而且程序都是正常运行,读者可按照自己的场景选择。

 

posted @ 2025-12-27 14:20  没有星星的夏季  阅读(1)  评论(0)    收藏  举报