【问题标题】:Upload a file to an SMB share without allowing user access在不允许用户访问的情况下将文件上传到 SMB 共享
【发布时间】:2014-08-28 23:01:47
【问题描述】:

我正在编写一个程序,它需要能够将单个文件上传到 SMB 共享文件夹。虽然程序将使用用户指定的凭据运行,但程序可能需要使用内置在程序中的不同凭据访问 SMB 文件夹。我可以使用WNetAddConnection2,但这允许用户在上传文件夹时访问共享。我不能只使用标准 I/O 访问共享,因为我需要使用指定的凭据访问它,而不是通过登录用户的权限。

有没有一种简单的方法可以让我使用指定的凭据将单个文件上传到 SMB 共享,而无需通过 WNetAddConnection2net use 创建半永久连接。

【问题讨论】:

  • 本地名称可以省略,这还不够吗?
  • 省略本地名称将阻止连接显示在资源管理器中,但仍会显示在 net use 的输出中,并且在同一会话中以同一用户身份运行的任何其他进程将能够使用连接。这对于 OP 来说可能不够,也可能不够。
  • @AndrewMedico 是的,不是。我可以允许用户绝对不能访问共享上的文件。如果保证共享是只写的,这不会是一个问题,但是由于这个程序将部署在各种环境中,我不能做出这样的假设。
  • 您可以通过提供上传服务来完成您需要的工作。它将在与程序不同的会话中运行,因此用户根本无法使用连接。
  • @AndrewMedico 所以换句话说,在NT AUTHORITY 令牌下创建WnetAddConnection2()

标签: c++ winapi smb


【解决方案1】:

WNetAddConnection2() 旨在将本地名称映射到远程位置,就像将 UNC 路径映射到本地驱动器号一样。您可以简单地忘记映射并直接访问 UNC 路径,然后让上传线程通过 LogonUser()ImpersonateLoggedOnUser() 使用模拟来处理凭据。

否则,您可以将上传逻辑移动到后台服务中,该服务在其自己的帐户中运行,与登录用户分开。

【讨论】:

  • 使用LogonUser 要求备用凭据是运行此软件的主机的有效登录名。 可能是这种情况,但绝不能保证。
  • @AndrewMedico 是对的。在这种情况下,登录在主机上不一定有效。
猜你喜欢
  • 2012-02-12
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 2021-02-18
  • 1970-01-01
相关资源
最近更新 更多