【问题标题】:Access network share from service with another user [duplicate]与另一个用户从服务访问网络共享[重复]
【发布时间】:2015-10-02 16:46:44
【问题描述】:

我有一个服务存在于一个非常受限的服务器系统中。它必须在特定用户下运行,我们称它为用户 A。

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

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

Services and Redirected Drives

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

【问题讨论】:

    标签: c++ windows winapi service network-shares


    【解决方案1】:

    你链接到的文章说:

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

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

    一个警告:只有当您在域中时才有效,即您要登录网络服务器的帐户在本地计算机上也有效。如果没有,那么您将必须使用WNetAddConnection2 或类似名称显式建立网络连接。从技术上讲,这确实存在将连接暴露给其他服务的风险,但在大多数情况下风险很小。

    【讨论】:

      【解决方案2】:

      我认为这篇 SO 帖子实际上可能是我正在寻找的答案: Access to a protected network share using Win32 C++

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

      【讨论】:

      • 是的,应该可以。但实际上,如果您愿意,您可以映射驱动器号;它确实工作,前提是您将驱动器号映射到要在其中使用它的同一会话中,即从服务本身。由于您以特定用户身份运行,因此与其他服务的干扰也不应该成为问题。尽管如此,冒充(如 Microsoft 在您链接到的文章中所建议的那样)可能是更好的选择。
      • 那么 WNetAddConnection2 如另一个 SO 线程所建议的那样是模拟的好选择,还是有更合适的功能,例如 msdn.microsoft.com/en-us/library/windows/desktop/aa376391.aspx 中列出的功能之一?
      • WNetAddConnection2 不是模拟功能。要遵循 Microsoft 的建议,您可以使用 LogonUserImpersonateLoggedOnUser - 当然,这假设您在域中,因此您要用于网络连接的用户帐户对本地计算机也有效。
      • 好的,如果您从中创建一个实际答案,我会将其标记为已接受的答案,因为它似乎是处理问题的最正确方法。
      猜你喜欢
      • 1970-01-01
      • 2013-11-04
      • 2011-05-25
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      • 2012-06-27
      相关资源
      最近更新 更多