使用本地系统帐户的Windows服务启动的可执行文件无法访问网络共享

时间:2008-10-30 11:54:47

标签: windows-services credentials network-share

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:6)

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

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

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

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

答案 1 :(得分:5)

当您拥有在NT AUTHORITY \ LOCALSYSTEM(服务帐户的名称)下运行的服务时,它将显示为网络其余部分的DOMAINNAME \ COMPUTERNAME $(请注意$ sign)帐户。也就是说,它在Active Directory中显示为COMPUTER的帐户。只需授予您的文件并与DOMAINNAME \ COMPUTERNAME $共享权限,您就应该做得很好。

答案 2 :(得分:0)

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

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

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