¿Puedo escuchar en un puerto (usando HttpListener u otro código .NET) en Vista sin requerir privilegios de administrador? [duplicar]

StackOverflow https://stackoverflow.com/questions/169904

  •  05-07-2019
  •  | 
  •  

Pregunta

    

Esta pregunta ya tiene una respuesta aquí:

    
            
  •              Acceso HttpListener denegado                                      10 respuestas                          
  •     
    

Estoy usando HttpListener para permitir que un usuario configure un proxy en un puerto definido por el usuario. Cuando inicio HttpListener, obtengo una excepción si la aplicación no se ejecuta con privilegios de administrador en Vista.

Por lo que he leído, este es el comportamiento esperado - 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 necesidad de elevarlo al administrador.

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

¿Fue útil?

Solución

Nunca he usado un HttpListener, pero según su descripción, parece más como si quisiera escuchar en un puerto TCP normal, en lugar de incrustar su aplicación en un espacio de nombres de URL del servidor (que es lo que HttpListener parece hacer). Debería poder utilizar 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.

Otros consejos

Si bien puede escribir su propio servidor HTTP usando TCP / IP normal (es relativamente simple), es más fácil usar HttpListener, que aprovecha la funcionalidad HTTP.SYS agregada 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 subespacios de nombres en el puerto 80. El uso de TCP / IP evita directamente este requisito, pero significa que no puede vincularse a un puerto que ya está en uso.

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

En Windows Vista, HTTPCFG todavía es compatible, pero la funcionalidad ha sido absorbida por NETSH:

netsh http show urlacl

... mostrará una lista de las ACL de URL 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.

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).

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 un poco de investigación y lectura, encontré este hilo y las sugerencias de netsh me hicieron usar enlaces acl temporales solo para desarrollar pruebas. En mi computadora existe esta regla.

Hay esta entrada:

Ejecute 'netsh http show urlacl' (como se muestra arriba)

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

Entonces puedo usar 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.

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

Consulte aquí : la página explica el problema, y hay un zip en la parte inferior para que sea utilizable.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top