7

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

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

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

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

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

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

4

3 回答 3

6

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

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

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

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

于 2008-10-30T11:59:38.250 回答
5

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

于 2008-10-30T11:57:46.007 回答
0

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

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

If the write access to the folder with the exe is not disabled, a user can replace that exe with (for example) cmd.exe. The next time the service tries to start your exe, voilà: A command shell with system rights!

于 2008-10-30T12:05:38.063 回答