【FileZillaServer用网络驱动器作为主目录时,客户端无法列出文件】【Spring Boot安装成Windows服务之后,无法访问网络驱动器】(Windows服务无法访问网络驱动器)

asashadow / 2024-04-28 / 原文

遇到的两个问题

  1. 安装FileZilla Server后,把映射的网络驱动器内容作为主目录时,客户端能正常登录,但是无法列出文件。把本机的某个目录组为主目录,客户端可以正常列出文件。
  2. 把Spring Boot 安装成 Windows 服务时,访问系统中映射的网络驱动器失败(开发过程中能够正常访问,通过命令的方式启动Spring Boot应用时,也能访问)

原因

总结主要原因就是应用程序对应的 Windows服务 无法访问 网络驱动器。
因为Windows Service是以system用户的身份运行的,而网络驱动器是当前登录用户身份去建立的。两个身份是在不同的contex下,不能互相访问彼此的环境,以及映射的网络驱动器。

解决方法概述

  • 解决方法一:以Windows Application的方式运行程序,而不是Windows Service的方式运行程序
  • 解决方法二:还是以Windows Service的方式运行程序,但是让Windows Service可以访问网络驱动器
解决方法一
  • 以Windows Application的方式运行程序
  1. 停掉 Filezilla Service
  2. 卸载 Filezilla Service
    cd C:\Program Files (x86)\FileZilla Server
    "FileZilla Server.exe" /uninstall
  3. 以Windows应用的方式来运行Filezilla
    cd C:\Program Files (x86)\FileZilla Server
    "FileZilla Server.exe" /compat /start
  4. 从任务管理器里看看有没有FileZilla Server在运行,有的话就是成功运行了
  5. 映射网络驱动器(已经映射过的话,忽略此步)
  6. 打开 Filezilla Interface,创建用户,添加网络驱动器为主目录
  7. 用FileZila 客户端登录测试一下,现在应该可以列出文件了
解决方法二
  • 让Windows Service可以访问网络驱动器。
    具体做法是,让SYSTEM用户去映射网络驱动器,这样Windows Service就可以访问网络驱动器了。同时,为了确保系统重启之后,Windows Service依然能访问网路驱动器,就做一个计划任务,让系统启动的时候,还是以SYSTEM帐户的身份去映射网络驱动器。

    步骤如下:
  1. 过程中需要用到PsExec,可以从下面的链接下载
    https://learn.microsoft.com/en-us/sysinternals/downloads/psexec

  2. 以SYSTEM用户的身份运行cmd
    Psexec.exe -s -i cmd.exe
    再次检查当前用户是system
    whoami
    > 结果应该是 nt authority\system

  3. 给SYSTEM Context添加凭据
    CMDKEY /add:StorageServer /user:"StorageServer\JohnSmith" /pass:MyHiddenPassword
    看看添加成功了没
    CMDKEY /list
    列出凭据

  4. 做一个用来映射网络驱动器的批处理脚本
点击查看代码 NetUseZ.bat
@echo OFF
net use Z: /del /y
net use Z: \\StorageServer "MyHiddenPassword" /user:"StorageServer\JohnSmith"

4. 添加一个开机启动时执行的计划任务,让系统以SYSTEM的身份去运行任务,映射网络驱动器
配置完成

过程中遇到的其他问题

  1. 重启之后,因为是计划任务用system映射的驱动器,当前登录的用户没法打开,提示用户名或者密码错误。所以如果要当前用户也能打开的话,就在凭据管理器(登录用户contex的)中添加网络驱动器的地址及用户名密码,就能打开了。
    如果登录用户已经映射过网络驱动器,之后才添加的(用system用户去映射网络驱动器的)计划任务,不会遇到这个问题。

  2. 其中一台服务器,在执行Psexec.exe -s -i cmd.exe的时候,提示 Error creating key file on WIN-XXXX 找不到网络名。查了一下,是因为 ADMIN$ 没有共享。确实,在命令行执行 net share 命令,结果中只有 IPC$ 和 print$ 。开启 ADMIN$ 的时候,直接执行 net share admin$,没有成功。后来用了下面的方法,成功。

    运行regedit,进入下面键值: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters,
    新建AutoShareWks,以及AutoShareServer两个键值,选择REG_DWORD格式,赋值为1
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
    新建restrictanonymous,dword,赋值1。
    然后重启,通过运行CMD命令进入命令行模式,再运行net share,在共享列表中会看到IPC$等默认共享。

  3. 试验过把Windows Service的运行用户改成administrator,重启服务之后,服务还是不能访问网络驱动器。



参考资料原文

  • FileZilla Server as a Windows Service with a Mapped Network Drive
    https://www.itninja.com/blog/view/filezilla-server-as-a-windows-service-with-a-mapped-network-drive

  • FILEZILLA with MAPPED NETWORK DRIVE (IT'S WORK)
    https://forum.filezilla-project.org/viewtopic.php?t=51055

  • 开启admin$共享
    https://blog.51cto.com/zailushang2016/2519330