遇到的两个问题
- 安装FileZilla Server后,把映射的网络驱动器内容作为主目录时,客户端能正常登录,但是无法列出文件。把本机的某个目录组为主目录,客户端可以正常列出文件。
- 把Spring Boot 安装成 Windows 服务时,访问系统中映射的网络驱动器失败(开发过程中能够正常访问,通过命令的方式启动Spring Boot应用时,也能访问)
原因
总结主要原因就是应用程序对应的 Windows服务 无法访问 网络驱动器。
因为Windows Service是以system用户的身份运行的,而网络驱动器是当前登录用户身份去建立的。两个身份是在不同的contex下,不能互相访问彼此的环境,以及映射的网络驱动器。
解决方法概述
- 解决方法一:以Windows Application的方式运行程序,而不是Windows Service的方式运行程序
- 解决方法二:还是以Windows Service的方式运行程序,但是让Windows Service可以访问网络驱动器
解决方法一
- 以Windows Application的方式运行程序
- 停掉 Filezilla Service
- 卸载 Filezilla Service
cd C:\Program Files (x86)\FileZilla Server
"FileZilla Server.exe" /uninstall
- 以Windows应用的方式来运行Filezilla
cd C:\Program Files (x86)\FileZilla Server
"FileZilla Server.exe" /compat /start
- 从任务管理器里看看有没有FileZilla Server在运行,有的话就是成功运行了
- 映射网络驱动器(已经映射过的话,忽略此步)
- 打开 Filezilla Interface,创建用户,添加网络驱动器为主目录
- 用FileZila 客户端登录测试一下,现在应该可以列出文件了
解决方法二
- 让Windows Service可以访问网络驱动器。
具体做法是,让SYSTEM用户去映射网络驱动器,这样Windows Service就可以访问网络驱动器了。同时,为了确保系统重启之后,Windows Service依然能访问网路驱动器,就做一个计划任务,让系统启动的时候,还是以SYSTEM帐户的身份去映射网络驱动器。
步骤如下:
- 过程中需要用到PsExec,可以从下面的链接下载
https://learn.microsoft.com/en-us/sysinternals/downloads/psexec
- 以SYSTEM用户的身份运行cmd
Psexec.exe -s -i cmd.exe
再次检查当前用户是system
whoami
> 结果应该是 nt authority\system
- 给SYSTEM Context添加凭据
CMDKEY /add:StorageServer /user:"StorageServer\JohnSmith" /pass:MyHiddenPassword
看看添加成功了没
CMDKEY /list
列出凭据
- 做一个用来映射网络驱动器的批处理脚本
点击查看代码 NetUseZ.bat
@echo OFF
net use Z: /del /y
net use Z: \\StorageServer "MyHiddenPassword" /user:"StorageServer\JohnSmith"
4. 添加一个开机启动时执行的计划任务,让系统以SYSTEM的身份去运行任务,映射网络驱动器
配置完成
过程中遇到的其他问题
-
重启之后,因为是计划任务用system映射的驱动器,当前登录的用户没法打开,提示用户名或者密码错误。所以如果要当前用户也能打开的话,就在凭据管理器(登录用户contex的)中添加网络驱动器的地址及用户名密码,就能打开了。
如果登录用户已经映射过网络驱动器,之后才添加的(用system用户去映射网络驱动器的)计划任务,不会遇到这个问题。 -
其中一台服务器,在执行
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$等默认共享。 -
试验过把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