C++ 与其他用户从服务访问网络共享

C++ 与其他用户从服务访问网络共享,c++,windows,winapi,service,network-shares,C++,Windows,Winapi,Service,Network Shares,我有一个服务,生活在一个非常有限的服务器系统。它必须在特定的用户下运行,我们称之为用户a 该服务还必须能够访问用户a无权访问但用户B有权访问的网络共享。因此,服务必须以用户B的身份访问此网络共享,同时以用户A的身份运行 如果在计算机上本地运行,我会这样做,即将网络驱动器映射到其他用户下。但服务无法访问映射的网络驱动器,即使它映射在同一用户下: 有人对我能做什么有建议吗?我是服务的创建者,所以我可以随意修改它。是否有某种方法可以让它通过winapi调用(非托管C++)以另一个用户的身份访问网络共

我有一个服务,生活在一个非常有限的服务器系统。它必须在特定的用户下运行,我们称之为用户a

该服务还必须能够访问用户a无权访问但用户B有权访问的网络共享。因此,服务必须以用户B的身份访问此网络共享,同时以用户A的身份运行

如果在计算机上本地运行,我会这样做,即将网络驱动器映射到其他用户下。但服务无法访问映射的网络驱动器,即使它映射在同一用户下:


有人对我能做什么有建议吗?我是服务的创建者,所以我可以随意修改它。是否有某种方法可以让它通过winapi调用(非托管C++)以另一个用户的身份访问网络共享?

我认为这篇文章可能是我想要的答案:


除非有人有更好的想法或其他反对意见?

你链接到的文章说:

相反,服务应该使用客户端模拟来模拟用户

在这种情况下,这意味着使用和


一个警告:这只在您位于域中时有效,即,您要登录到网络服务器的帐户在本地计算机上也是有效的。如果没有,则必须使用
wnetadconnection2
或类似工具明确建立网络连接。从技术上讲,这确实存在将连接暴露到其他服务的风险,但在大多数情况下,风险是最小的。

是的,这应该是可行的。但事实上,如果您愿意,您可以映射驱动器号;如果您在要使用它的同一会话中映射驱动器号,即从服务本身映射驱动器号,则它确实可以工作。由于您是作为特定用户运行的,因此对其他服务的干扰也不应该是问题。尽管如此,模拟(正如Microsoft在您链接到的文章中建议的那样)可能是一个更好的选择。因此,另一个So线程建议的
wnetadConnection2
是模拟的好选择,还是有更合适的函数,类似于?
wnetadconnection2
中列出的一个函数,它不是模拟函数。要遵循Microsoft的建议,您可以使用
LogonUser
ImpersonateLoggedOnUser
——当然,这假设您在一个域中,因此,您要用于网络连接的用户帐户对本地计算机也是有效的。好的,如果您根据此创建实际答案,我将其标记为接受答案,因为这似乎是处理问题的最正确方法。