3

我正在用 C for Windows 编写一个类似服务器的小型程序(使用 MinGW/GCC,在 Windows 7 上进行测试),最终应该使用 LocalSystem 帐户作为服务运行。我正在创建一个套接字,并使用 Windows Socketsbind()listen()监听accept()传入的连接。如果我从命令行运行应用程序(即不是作为服务,而是作为普通用户),我从外部 IP 连接到它没有问题。但是,如果我使用 LocalSystem 帐户将程序作为服务运行,我只能从我自己的 PC 连接到该服务,无论是使用127.0.0.1本地地址还是本地地址,192.168.1.80(我在一个小型本地网络中的路由器后面)。使用我的本地地址,外部 IP 和同一本地网络中的其他 PC 现在都无法连接,即使没有作为服务运行没有问题。

现在,我听说当作为 LocalSystem 或 LocalService 运行时,网络的处理方式不同甚至无法访问(?),或者服务无法同时访问桌面和网络(注意:我的服务不是交互式的),因为安全考虑。本质上,我需要找出问题所在/如何监听服务中的连接。作为 NetworkService 运行是否与作为 LocalSystem 运行相同,但具有网络访问权限?肯定有服务器可以作为后台服务运行,那么它们是怎么做的呢?

更新:关闭防火墙的建议似乎在正确的轨道上——我可以在 Windows 防火墙中添加例外后获得连接。我想我并没有考虑防火墙,因为当您正常使用套接字运行应用程序时,您会收到一个提示,要求添加一个异常,这在第一次运行服务时不会发生。有没有比手动将规则添加到防火墙更好的方法来处理这个问题?LocalSystem 是否有权向防火墙本身添加规则,或者我必须在安装过程中以某种方式执行此操作?

4

3 回答 3

5

LocalSystem 和 LocalService 帐户具有受限的网络登录权限,但据我所知,它不应该影响套接字连接。

但是,Windows 防火墙将处于活动状态,如果您将可执行文件移动到新目录以作为服务安装,它可能不再符合您为测试制定的规则。

于 2012-06-08T04:36:53.967 回答
3

用于运行服务的用户帐户不影响 TCP/UDP 绑定/侦听操作。

确保您已禁用防火墙服务和/或防病毒,然后重试。

您可以阅读有关 MSDN 和内置服务帐户的更多详细信息:

服务帐号

  • 在LocalSystem帐户的上下文中运行的服务会继承 SCM 的安全上下文。LocalSystem 是一个特权非常高的内置帐户。它在本地系统上具有广泛的权限,并充当网络上的计算机。该帐户的实际名称是“ NT AUTHORITY\SYSTEM ”。

  • LocalService在本地计算机上具有最低权限,并在网络上提供匿名凭据。Local Service 帐户是一个内置帐户,与用户组的成员具有相同级别的资源和对象访问权限。如果个别服务或流程受到损害,这种有限的访问权限有助于保护系统。作为本地服务帐户运行的服务作为没有凭据的空会话访问网络资源。请注意,SQL Server 或 SQL Server 代理服务不支持本地服务帐户。该帐户的实际名称是“ NT AUTHORITY\LOCAL SERVICE ”。

  • 在NetworkService帐户的上下文中运行的服务将计算机的凭据提供给远程服务器。网络服务帐户是一个内置帐户,它比用户组的成员拥有更多的资源和对象访问权限。作为网络服务帐户运行的服务使用计算机帐户的凭据访问网络资源。该帐户的实际名称是“ NT AUTHORITY\NETWORK SERVICE

我很确定当您将服务作为 LocalSystem 运行时,您可以在端口上绑定/侦听。例如 Apache 2.2 做到了:

阿帕奇服务

一些阅读:

了解本地服务和网络服务帐户

于 2012-06-08T04:17:42.847 回答
0

正如其他答案(由rkosegiBen Voigt提出)所建议的那样,Windows 防火墙阻止了端口,因为我将可执行文件移动到不同的位置进行安装,并且因为服务不会导致连接已被阻止的通知(以及一个按钮取消阻止应用程序)出现。我最终netsh advfirewall firewall add rule name="%name%" dir=in action=allow program="%path%" enable=yes在一个 .bat 文件中轻松地向防火墙添加了一个例外。

于 2012-06-09T16:45:38.587 回答