socket example code c winapi windows-services network-programming winsock

code - winsock example



Servicio de Windows: Escucha en el socket mientras se ejecuta como LocalSystem (3)

La cuenta de usuario utilizada para ejecutar el servicio no afecta la operación de vinculación / escucha de TCP / UDP.

Asegúrese de haber desactivado el servicio de firewall y / o el antivirus y vuelva a intentarlo.

Puede leer más detalles sobre MSDN y las cuentas de servicio integradas:

Cuentas de servicio

  • Un servicio que se ejecuta en el contexto de la cuenta LocalSystem hereda el contexto de seguridad de SCM.LocalSystem es una cuenta incorporada con privilegios muy altos. Tiene amplios privilegios en el sistema local y actúa como la computadora en la red. El nombre real de la cuenta es " NT AUTHORITY / SYSTEM ".

  • LocalService tiene privilegios mínimos en la computadora local y presenta credenciales anónimas en la red. La cuenta de servicio local es una cuenta integrada que tiene el mismo nivel de acceso a los recursos y objetos que los miembros del grupo de usuarios. Este acceso limitado ayuda a proteger el sistema si los servicios o procesos individuales se ven comprometidos. Los servicios que se ejecutan como la cuenta de servicio local acceden a los recursos de red como una sesión nula sin credenciales. Tenga en cuenta que la cuenta de servicio local no es compatible con los servicios de SQL Server o SQL Server Agent. El nombre real de la cuenta es " NT AUTHORITY / LOCAL SERVICE ".

  • Un servicio que se ejecuta en el contexto de la cuenta NetworkService presenta las credenciales de la computadora a los servidores remotos. La cuenta del servicio de red es una cuenta integrada que tiene más acceso a recursos y objetos que los miembros del grupo de usuarios. Los servicios que se ejecutan como la cuenta del servicio de red acceden a los recursos de la red utilizando las credenciales de la cuenta de la computadora. El nombre real de la cuenta es " NT AUTHORITY / NETWORK SERVICE "

Estoy bastante seguro de que puedes vincular / escuchar en el puerto cuando ejecutas el servicio como LocalSystem. Por ejemplo, Apache 2.2 lo hizo:

Algunos leyendo:

Comprender el servicio local y las cuentas de servicio de red

Estoy escribiendo un pequeño programa similar al servidor en C para Windows (usando MinGW / GCC, probando en Windows 7) que finalmente se supone que se ejecutará como un servicio con la cuenta LocalSystem. Estoy creando un socket y usando Windows Sockets bind() , listen() y accept() para escuchar las conexiones entrantes. Si ejecuto la aplicación desde la línea de comandos (es decir, no como un servicio, sino como un usuario normal), no tengo problemas para conectarme a ella desde direcciones IP externas. Sin embargo, si ejecuto el programa como un servicio con la cuenta LocalSystem, solo puedo conectarme al servicio desde mi propia PC, ya sea con 127.0.0.1 o con mi dirección local, 192.168.1.80 (estoy detrás de un enrutador en una pequeña red local). Ni las IP externas ni otras PC en la misma red local, que usan mi dirección local, pueden conectarse ahora, a pesar de que no hubo problemas sin ejecutar como servicio.

Ahora, he oído que la red se maneja de manera diferente o incluso no accesible (?) Cuando se ejecuta como LocalSystem o LocalService o que los servicios no pueden acceder tanto al escritorio como a la red (nota: mi servicio no es interactivo) al mismo tiempo debido a Consideraciones de Seguridad. Esencialmente, necesito descubrir qué está pasando / cómo escuchar las conexiones en un servicio. ¿Funciona como NetworkService lo mismo que ejecutar LocalSystem, pero con acceso a la red? Seguramente debe haber servidores que puedan ejecutarse como servicios en segundo plano, entonces, ¿cómo lo hacen?

ACTUALIZACIÓN: parece que las sugerencias para desactivar el firewall estaban en el camino correcto: puedo obtener una conexión después de agregar una excepción en el Firewall de Windows. Supongo que no estaba pensando en el firewall porque cuando ejecutas una aplicación que usa sockets normalmente, obtienes un mensaje pidiendo agregar una excepción, lo que no ocurre cuando se ejecuta un servicio por primera vez. ¿Hay una forma mejor de manejar esto que agregar la regla al cortafuegos manualmente? ¿Tiene LocalSystem los privilegios para agregar una regla al firewall en sí mismo o tendré que hacer esto durante la instalación de alguna manera?


Las cuentas LocalSystem y LocalService tienen derechos de inicio de sesión de red restringidos, pero hasta donde yo sé, no deberían afectar las conexiones de socket.

Sin embargo, el firewall de Windows estará activo, y si movió el ejecutable a un nuevo directorio para instalarlo como servicio, es posible que ya no coincida con la regla que creó para la prueba.


Como las otras respuestas (por rkosegi y Ben Voigt ) sugirieron, el Firewall de Windows estaba bloqueando el puerto porque moví el ejecutable a una ubicación diferente para la instalación y porque los servicios no causan la notificación de que se ha bloqueado una conexión (junto con un botón para desbloquear la aplicación) para que aparezca. Terminé usando netsh advfirewall firewall add rule name="%name%" dir=in action=allow program="%path%" enable=yes en un archivo .bat para agregar fácilmente una excepción al firewall.