You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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


排查方向与解决办法

  1. 修正PutFiles的路径格式
    WinSCP的PutFiles方法中,若目标是文件夹,路径必须以斜杠(/)结尾。如果写成/New,WinSCP会将其视为文件名而非文件夹,导致尝试覆盖文件夹触发权限错误。修改代码:

    ' 确保目标文件夹路径以/结尾
    If Not remote.EndsWith("/") Then
        remote &= "/"
    End If
    transferResult = session.PutFiles(local, remote, False, transferOptions)
    
  2. 确认FileZilla权限继承设置
    打开FileZilla服务器管理界面,找到对应用户的「共享文件夹」设置:

    • 检查根目录的读写权限是否勾选「应用到子文件夹」
    • 若未勾选,勾选后保存配置
  3. 验证Windows文件系统权限继承
    登录Windows Server 2022,找到子文件夹:

    • 右键→属性→安全→高级
    • 确认权限是否继承自父文件夹,若未继承,点击「启用继承」并应用
  4. 查看FileZilla详细日志
    在FileZilla服务器管理界面→设置→日志,开启详细日志记录。执行上传操作后查看日志,日志会明确指出权限拒绝的具体原因(FTP权限或Windows文件系统权限问题)。

  5. 对比WinSCP图形化客户端测试

    • 用WinSCP图形化客户端连接,尝试上传文件到子文件夹。如果也失败,说明问题在服务器配置;如果成功,对比代码与图形化客户端的会话设置(比如被动模式)。
    • 可显式设置被动模式确认:
      sessionOptions.FtpPassive = True
      

内容的提问来源于stack exchange,提问作者Hannington Mambo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 20:33:23