C++ 将文件上载到SMB共享而不允许用户访问

C++ 将文件上载到SMB共享而不允许用户访问,c++,winapi,smb,C++,Winapi,Smb,我正在写一个程序,需要能够上传一个文件到SMB共享文件夹。虽然程序将使用用户指定的凭据运行,但程序可能需要使用程序内置的不同凭据访问SMB文件夹。我可以使用wnetadconnection2,但这允许用户在上载文件夹时访问共享。我不能仅使用标准I/O访问共享,因为我需要使用指定的凭据来访问它,而不是通过登录用户的权限 是否有一种简单的方法可以使用指定的凭据将单个文件上载到SMB共享,而无需通过WNetAddConnection2或net创建半永久性连接使用WNetAddConnection2()

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

是否有一种简单的方法可以使用指定的凭据将单个文件上载到SMB共享,而无需通过
WNetAddConnection2
net创建半永久性连接使用
WNetAddConnection2()
旨在将本地名称映射到远程位置,类似于将UNC路径映射到本地驱动器号。您可以简单地忘记映射并直接访问UNC路径,然后让上载线程通过
LogonUser()
ImpersonateLoggedOnUser()
使用模拟来处理凭据


否则,您可以将上载逻辑移动到后台服务中,该后台服务在独立于登录用户的帐户中运行。

使用
LogonUser
要求备用凭据是运行此软件的主机的有效登录名。也许是这样,但决不能保证。@AndrewMedico是对的。在这种情况下,登录不一定在主机上有效。您可以省略本地名称,这是否足够?省略本地名称将阻止连接显示在资源管理器中,但它仍将显示在
netuse
的输出中,并且在同一会话中以同一用户身份运行的任何其他进程都将能够使用该连接。这可能还不够,也可能还不够。@AndrewMedico是的,还不够。我可以允许用户绝对无法访问共享上的文件。如果保证共享是只写的,这不会是一个问题,但由于此程序将部署在各种环境中,我不能做出这样的假设。您可以通过提供一个服务来完成上传,从而实现您所需的功能。它将在与程序不同的会话中运行,因此用户将根本无法使用该连接。@AndrewMedico因此,换句话说,在
NT AUTHORITY
令牌下创建
wnetadConnection2()