2008-10-30 62 views
7

我有一个由Windows服务启动的可执行文件,该程序将在客户机器上运行,并且需要连接到远程共享才能执行一个特定的任务。这个份额是由客户通过用户界面指定的,所以我们事先并不知道这一点,这意味着它不能被“硬编码”,或预先分配了共享。由使用本地系统帐户的Windows服务启动的可执行文件无法访问网络共享

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

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

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

我一般认为解决这类问题的建议似乎都使用用户帐户,因为系统帐户无法访问网络共享,但在我们的情况下,这是不可能的。有没有其他办法可以让这个工作?

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

回答

6

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

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

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

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

+0

谢谢。你的最后一个建议看起来就像我的情况一样,我创建了一个专用帐户,并且能够使用此帐户和CreateProcessAsUser()启动我的可执行文件,然后它似乎能够访问网络共享(如果它在管理员组中)... – 2008-10-31 15:02:05

+0

显然,您必须授予您的专用帐户适当的访问权限。 – 2008-11-01 16:17:55

4

当您拥有在NT AUTHORITY \ LOCALSYSTEM(这是服务帐户的名称)下运行的服务时,它显示为网络其余部分的DOMAINNAME \ COMPUTERNAME $(注意$符号)帐户。也就是说,它显示为活动目录中的计算机帐户。只需将您的文件和共享权限授予DOMAINNAME \ COMPUTERNAME $,您就应该很好。

0

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

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

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

相关问题