【问题标题】:Executable started by a windows service using the local system account cannot access network shares由 Windows 服务使用本地系统帐户启动的可执行文件无法访问网络共享
【发布时间】:2010-09-19 23:30:41
【问题描述】:

我有一个由 Windows 服务启动的可执行文件,该程序将在客户计算机上运行,​​并且需要连接到远程共享以执行特定任务。此共享由客户通过 UI 指定,因此我们事先不知道这一点,这意味着它不能“硬编码”或预先映射的共享。

以前我们要求客户登录到他们的机器并在登录时运行可执行文件,但我们一直希望让我们的程序在服务中运行而不需要登录,主要是为了让它更容易为客户服务,并防止任何意外注销关闭我们的软件。所以这也意味着我们不知道客户机器上存在哪些本地用户帐户,因此我们必须使用本地系统帐户启动服务。

如上所述,我们现在有一个包装服务来启动可执行文件并执行各种任务。这似乎在大多数情况下都可以正常工作并且可以正常访问底层网络 - 我们的软件的目的主要涉及捕获数据包等。

但是,当软件尝试连接到 Windows 共享(UNC 名称)时,它无法连接。而如果可执行文件是手动启动的,它连接良好。

我通常看到的解决此类问题的建议似乎都说使用用户帐户,因为系统帐户无法访问网络共享,但在我们的情况下这是不可能的。我们还有其他方法可以让它工作吗?

编辑:我忘了提到这个应用程序可以(并且最常见的是)在 Win2K 而不是 XP 上运行,我认为我说本地网络帐户在 XP 之前不可用是对的?

【问题讨论】:

    标签: windows-services credentials network-share


    【解决方案1】:

    当您的服务在 NT AUTHORITY\LOCALSYSTEM(这是服务帐户的名称)下运行时,对于网络的其余部分,它会显示为 DOMAINNAME\COMPUTERNAME$(注意 $ 符号)帐户。也就是说,它在 Active Directory 中显示为 COMPUTER 的帐户。只需将您的文件和共享权限授予 DOMAINNAME\COMPUTERNAME$ 就可以了。

    【讨论】:

      【解决方案2】:

      如果您可以更改 Windows 服务以使其在网络服务帐户下运行,那么您的可执行文件将能够访问网络共享(这是创建网络服务帐户的原因之一)。

      本地系统和本地服务帐户没有任何网络凭据,因此无法在网络上进行身份验证。这是设计使然。

      编辑: IIRC,网络服务帐户是在 Server 2003 中引入的,并添加到 XP 服务包之一。

      如果您不能依赖可用的网络服务帐户,那么您可以考虑创建一个专用域帐户,将帐户的凭据存储在某处,从您的服务内部读取它们,然后在访问网络之前登录并模拟该用户分享。或者,Windows 服务可以直接作为专用帐户运行,在这种情况下,它需要“作为服务登录”权限。

      【讨论】:

      • 谢谢。在我的情况下,您的最后一个建议看起来像这样做的方法,我创建了一个专用帐户,我可以使用该帐户和 CreateProcessAsUser() 启动我的可执行文件,然后它似乎能够访问网络共享(如果它在管理员组中)...
      • 显然,您必须授予您的专用帐户对共享的适当访问权限。
      【解决方案3】:

      为什么不能使用其他帐户? Windows 中内置了一个网络服务帐户,专门用于需要网络访问的服务。

      无论如何,让服务启动 exe 时要非常小心。

      如果未禁用对包含 exe 的文件夹的写访问权限,则用户可以将该 exe 替换为(例如)cmd.exe。下次该服务尝试启动您的 exe 时,瞧:具有系统权限的命令 shell!

      【讨论】:

      • 或者更好的是,将 cmd.exe 重命名为服务未运行时启动的 exe,然后重新启动计算机 :)
      猜你喜欢
      • 2011-05-25
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多