Windows服务:在作为LocalSystem运行时侦听套接字

时间:2012-06-08 04:02:06

标签: c winapi windows-services network-programming winsock

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

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

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

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

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

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

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

Service accounts

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

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

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

我非常确定您在运行LocalSystem服务时可以绑定/侦听端口。 例如Apache 2.2就做到了:

Apache service

一些阅读:

Understanding the Local Service and Network Service Accounts

答案 2 :(得分:0)

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