Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Windows服务:作为本地系统运行时侦听套接字_C_Winapi_Windows Services_Network Programming_Winsock - Fatal编程技术网

C Windows服务:作为本地系统运行时侦听套接字

C Windows服务:作为本地系统运行时侦听套接字,c,winapi,windows-services,network-programming,winsock,C,Winapi,Windows Services,Network Programming,Winsock,我正在用C为Windows编写一个类似服务器的小程序(使用MinGW/GCC,在Windows7上进行测试),该程序最终应该作为带有LocalSystem帐户的服务运行。我正在创建一个套接字,并使用Windows套接字bind(),listen()和accept()侦听传入连接。如果我从命令行运行应用程序(即,不是作为服务运行,而是作为普通用户运行),那么从外部IP连接到应用程序不会有任何问题。但是,如果我使用LocalSystem帐户将程序作为服务运行,我只能从自己的PC连接到该服务,或者使用

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

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


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

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

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

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

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

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

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

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

一些阅读:


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


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

正如其他答案(由和)所建议的,Windows防火墙阻止了该端口,因为我已将可执行文件移动到其他位置进行安装,而且服务不会导致出现连接已被阻止的通知(以及取消阻止应用程序的按钮)。最后,我在.bat文件中使用了
netsh advfirewall firewall add rule name=“%name%”dir=in action=allow program=“%path%”enable=yes
,以便轻松地将异常添加到防火墙中。

我认为防火墙更可能是罪魁祸首,尝试过将其关闭吗?Windows防火墙似乎就是问题所在。是否有一种通过编程方式添加异常的好方法?到目前为止,我只是运行程序,并在出现提示时添加了一个异常。@Socob:尝试查找有关以编程方式添加规则的信息。