使用WinSCP DLL+VB.NET上传至嵌套文件夹时遇权限拒绝问题
权限拒绝问题排查:WinSCP VB.NET 上传至FileZilla FTP子文件夹失败
我使用WinSCP DLL结合VB.NET连接Windows 2022服务器上的FileZilla FTP服务器,远程FileZilla客户端可正常执行上传、移动、删除文件及文件夹操作。但使用相同用户凭据通过代码连接时,仅能在根目录(/)完成列目录、创建文件夹、上传文件操作,尝试上传至根目录下任意子文件夹时,均出现权限拒绝错误。
会话配置
.Protocol = Protocol.Ftp .PortNumber = 21 .FtpSecure = FtpSecure.Explicit .GiveUpSecurityAndAcceptAnyTlsHostCertificate = True
说明:添加最后一行后才成功建立连接,当前FileZilla服务器版本不支持SFTP。
会话相关代码
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls session.Open(sessionOptions) ' Upload files Dim transferOptions As New TransferOptions transferOptions.TransferMode = TransferMode.Automatic transferOptions.OverwriteMode = OverwriteMode.Overwrite transferOptions.FilePermissions = New FilePermissions With {.Octal = "775"}
说明:添加权限设置行后无效果。
上传操作代码
session.CreateDirectory(remote) ' 此代码始终有效,例如 remote = "/Root", "/Root/New", "/Root/New/New2" 等 Dim transferResult As TransferOperationResult transferResult = session.PutFiles(local, remote, False, transferOptions) ' 上传到 remote = "/" 成功,但上传到 "/New", "/New/New2" 等路径失败 ' 即使手动在根目录创建文件夹并赋予全部权限,仍报相同错误 transferResult.Check()
已配置的权限
- FileZilla服务器中已为该用户设置根目录的读写权限
- Windows Server 2022中已为根目录开放全部权限
错误信息
Copying files to remote side failed. Permission denied
排查方向与解决办法
修正PutFiles的路径格式
WinSCP的PutFiles方法中,若目标是文件夹,路径必须以斜杠(/)结尾。如果写成/New,WinSCP会将其视为文件名而非文件夹,导致尝试覆盖文件夹触发权限错误。修改代码:' 确保目标文件夹路径以/结尾 If Not remote.EndsWith("/") Then remote &= "/" End If transferResult = session.PutFiles(local, remote, False, transferOptions)确认FileZilla权限继承设置
打开FileZilla服务器管理界面,找到对应用户的「共享文件夹」设置:- 检查根目录的读写权限是否勾选「应用到子文件夹」
- 若未勾选,勾选后保存配置
验证Windows文件系统权限继承
登录Windows Server 2022,找到子文件夹:- 右键→属性→安全→高级
- 确认权限是否继承自父文件夹,若未继承,点击「启用继承」并应用
查看FileZilla详细日志
在FileZilla服务器管理界面→设置→日志,开启详细日志记录。执行上传操作后查看日志,日志会明确指出权限拒绝的具体原因(FTP权限或Windows文件系统权限问题)。对比WinSCP图形化客户端测试
- 用WinSCP图形化客户端连接,尝试上传文件到子文件夹。如果也失败,说明问题在服务器配置;如果成功,对比代码与图形化客户端的会话设置(比如被动模式)。
- 可显式设置被动模式确认:
sessionOptions.FtpPassive = True
内容的提问来源于stack exchange,提问作者Hannington Mambo
相关产品推荐
相关产品推荐

