2008-10-04 11 views
33

Estoy usando HttpListener para permitir que un usuario configure un proxy en un puerto definido por el usuario. Cuando inicio el HttpListener, recibo una excepción si la aplicación no se está ejecutando bajo privilegios de administrador en Vista.¿Puedo escuchar en un puerto (usando HttpListener u otro código .NET) en Vista sin requerir privilegios de administrador?

Según lo que he leído, this is expected behavior - se requieren privilegios de administrador para comenzar a escuchar en un puerto. Pero estoy seguro de que hay formas de evitar esto, ya que ejecuto muchos programas (como Skype) que escuchan en un puerto sin requerir elevación al administrador.

¿Hay alguna manera de hacer esto con HttpListener? Si no, ¿puedo hacer otras llamadas a la API en el código .NET para configurar el puerto?

+0

¡Guau, no sabía de eso! Desde el enlace que proporcionó, no parece ser de ninguna manera. :( – leppie

Respuesta

9

Nunca he usado un HttpListener, pero por su descripción suena más como si quisiera escuchar en un puerto TCP normal, en lugar de incrustar su aplicación en el espacio de nombres URL del servidor (que es lo que parece hacer HttpListener). Debería poder usar las funciones de socket regulares (System.Net.Sockets.TcpListener) para abrir y escuchar en un puerto TCP sin requerir privilegios de administrador. Estoy casi seguro de que Skype no usa un HttpListener.

+1

Interesante - Creo que este es el mejor plan. Procesaré las solicitudes HTTP, por lo que es difícil abandonar el HttpListener, pero creo que esta es la mejor idea. Dos enlaces que he encontrado hasta ahora eso puede ayudar: http://is.gd/3wuX http://is.gd/3wv2 –

2

En XP, tenía que usar una línea de comandos (httpcfg) para abrir el puerto primero, de lo contrario no funcionaría para los no administradores.

Ver here - la página explica el problema, y ​​hay un zip en la parte inferior para que se pueda utilizar.

62

Si bien puede escribir su propio servidor HTTP utilizando TCP/IP normal (es relativamente simple), es más fácil utilizar HttpListener, que aprovecha la funcionalidad HTTP.SYS añadida en Windows XP SP2.

Sin embargo, HTTP.SYS agrega el concepto de URL ACL. Esto se debe en parte a que HTTP.SYS le permite vincularse a espacios de nombres secundarios en el puerto 80. Usar TCP/IP directamente evita este requisito, pero significa que no puede vincularse a un puerto que ya está en uso.

En Windows XP, puede utilizar el programa HttpCfg.exe para configurar una ACL de URL que otorgue a su cuenta de usuario el derecho de enlazar a una URL en particular. Está en las muestras de Platform SDK.

En Windows Vista, httpcfg todavía se soporta, pero la funcionalidad ha sido absorbido en NETSH:

netsh http show urlacl 

... mostrará una lista de URL ACL existentes. Las ACL se expresan en SDDL.

netsh http add urlacl url=http://+:80/MyUri user=DOMAIN\User listen=yes 

... configurará el espacio de nombres MyURI para que DOMAIN \ User pueda escuchar las solicitudes.

+19

wow. ¿Regresó después de 4 meses para editar una sola palabra en su publicación? impresionante, señor :) –

22

Si necesita manejar solicitudes solo desde su propia computadora (generalmente para fines de prueba), puede escribir localhost en lugar de * en el prefijo.

Por ejemplo, en lugar de "http: // *: 9669 /" puede escribir "http: // localhost: 9669 /". Esto funciona bien con HttpListener y no requiere privilegios administrativos (al menos en Windows 7).

+1

que encontré esta respuesta es útil más de tres años después. Si obtiene una 'HttpListenerException' con el mensaje' Acceso denegado', es posible que el puerto ya esté siendo utilizado por otro proceso. –

+0

Aquí en Windows 10 usando ServiceHost no puedo confirmar esto. Al establecer la dirección base con una dirección IP específica, en netstat puedo ver que se vinculará a 0.0.0.0 de todos modos, por lo que necesitan privilegios elevados. –

7

Bueno, tuve que lidiar con algo similar. Mi computadora está en un dominio restringido, por lo que no tengo privilegios de administrador. Después de algunas investigaciones y lecturas, encontré este hilo y las sugerencias netsh me hicieron usar enlaces temporales de acl solo para desarrollar pruebas. En mi computadora, esta regla existe.

Hay esta entrada:

Run 'netsh http show de urlacl' (como se muestra arriba)

[...] 
     Reservierte URL   : http://+:80/Temporary_Listen_Addresses/ 
      Benutzer: \Jeder 
       Abhören: Yes 
       Delegieren: No 
       SDDL: D:(A;;GX;;;WD) 
    [...] 

así que puedo utilizar el HttpListener como no administrador (Jeder):

[...] 
    HttpListener l = new HttpListener(); 
    string prefix = "http://+:80/Temporary_Listen_Addresses/"; 
    l.Prefixes.Add(prefix); 
    l.Start(); // does not throw any "Permission Denied/Access Denied/Zugriff verweigert" 
    [...] 

Que esto ayude a cualquiera a encontrar este hilo.

+0

¡Un gran hallazgo! Creo que el comentario de @ Don01001100 en esta [respuesta] (http://stackoverflow.com/questions/169904/can-i-listen-on-a-port-using-httplistener-or-other-net-code-on- vista-without/5408458 # 5408458) está relacionado con esta respuesta. Considere otra aplicación (como IIS, Apache, Skype, ...) usando el puerto 80 si recibe un mensaje de "Acceso denegado". – ischas

Cuestiones relacionadas