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

8
我有一个可执行程序,由Windows服务启动,在客户机上运行并需要连接到远程共享来执行特定任务。这个共享是由客户通过UI指定的,因此我们事先不知道它,这意味着它不能被“硬编码”,或者预先映射共享。
以前,我们要求客户登录到他们的机器上并在登录时运行可执行文件,但我们一直希望允许我们的程序在服务中运行,而不需要登录,主要是为了方便客户并防止任何意外的注销关闭我们的软件。因此,这也意味着我们不知道客户机上存在哪些本地用户帐户,因此我们必须使用本地系统帐户启动服务。
如上所述,我们现在有一个包装服务来启动可执行文件并执行各种任务。这在大多数情况下似乎都很好,并且可以正常访问底层网络-我们的软件的主要目的是捕获数据包等。
然而,当软件尝试连接到Windows共享(UNC名称)时,它无法连接。而如果手动启动可执行文件,则可以正常连接。
我通常看到的解决这些问题的建议似乎都说将用户帐户用作系统帐户无法访问网络共享,但在我们的情况下这是不可能的。有没有其他方法可以使其正常工作?
编辑:我忘记提到,这个应用程序可能(并且通常)将在Win2K而不是XP上运行,我认为在XP之前本地网络帐户不可用?
3个回答

6
如果您可以更改Windows服务,使其在网络服务帐户下运行,则可执行文件将能够访问网络共享(这是创建网络服务帐户的原因之一)。
本地系统和本地服务帐户没有任何网络凭据,因此无法在网络上进行身份验证。这是设计上的限制。
编辑:如果我没记错的话,网络服务帐户是在Server 2003中引入的,并添加到其中一个XP服务包中。
如果您不能依赖于网络服务帐户可用,那么您可能需要考虑创建一个专用的域帐户,将帐户凭据存储在某个地方,在服务内部读取它们,然后在访问网络共享之前登录并模拟该用户。或者,Windows服务可以直接作为专用帐户运行,在这种情况下,它将需要“作为服务登录”的特权。

谢谢。你上次的建议在我的情况下似乎是可行的,我创建了一个专用账户并且可以使用这个账户和CreateProcessAsUser()来启动我的可执行文件,接着它似乎能够访问网络共享(如果在管理员组中)。 - Adam Cobb
显然,您必须授予您的专用帐户适当的共享访问权限。 - Paul Lalonde

5

当您拥有运行在NT AUTHORITY\LOCALSYSTEM(即服务账户的名称)下的服务时,该服务将以DOMAINNAME\COMPUTERNAME$(注意$符号)的帐户出现在网络的其他部分中。也就是说,它会以计算机的帐户在Active Directory中显示。只需向DOMAINNAME\COMPUTERNAME$授予文件和共享权限,您就可以使用了。


0

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

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

如果未禁用具有exe的文件夹的写入访问权限,则用户可以将该exe替换为(例如)cmd.exe。下次服务尝试启动您的exe时,就会出现一个具有系统权限的命令行窗口!


最好将cmd.exe重命名为服务启动的exe,而在服务未运行时重新启动计算机 :) - Dean Hiller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接