net httplistenerexception 0x80004005 c# windows http httplistener netsh

httplistenerexception - C#HttpListener sin usar netsh para registrar un URI



system net httplistenerexception 0x80004005): access is denied (2)

Mi aplicación utiliza un pequeño servidor web para almacenar algunos archivos y tener una interfaz web para la administración de forma remota. En este momento, el usuario tiene que usar netsh para registrar la URI como tal

netsh http add urlacl url=http://+:1233/ user=Chris-PC/Chris

Lo cual no es divertido para el usuario promedio. Me gustaría que el programa pueda escuchar en cualquier puerto especificado por el usuario desde mi programa sin que el usuario final tenga que usar el símbolo del sistema. ¿Hay alguna forma de lograr esto sin solo usar Process.Start y ejecutar el indicador de comandos?


Escribí esto para elevar los permisos y agregar las entradas de la ACL de http a través de netsh .

Se les pedirá a los usuarios que realicen cambios en su sistema, pero es mejor que nada. Es posible que desee hacer esto en respuesta a una excepción AddressAccessDeniedException

public static class NetAclChecker { public static void AddAddress(string address) { AddAddress(address, Environment.UserDomainName, Environment.UserName); } public static void AddAddress(string address, string domain, string user) { string args = string.Format(@"http add urlacl url={0} user={1}/{2}", address, domain, user); ProcessStartInfo psi = new ProcessStartInfo("netsh", args); psi.Verb = "runas"; psi.CreateNoWindow = true; psi.WindowStyle = ProcessWindowStyle.Hidden; psi.UseShellExecute = true; Process.Start(psi).WaitForExit(); } }


Si está usando un HTTPListener, tiene que usar httpconfig.exe o netsh para configurar su HTTPListener, porque:

A. AFAIK No hay API para hacer esto desde C #, solo las herramientas de línea de comandos

B. Por defecto, solo el SISTEMA o el grupo de Administradores locales pueden escuchar los prefijos de http

Entonces ... si su aplicación se ejecuta bajo la cuenta del usuario, debe otorgar acceso explícito (usando httpcfg.exe o netsh) porque su HTTPHandler usa HTTP.sys para compartir puertos con el servidor web en ejecución (para que pueda alojar su propio aplicación web en el puerto 80, mientras que IIS también se ejecuta en el puerto 80).

Una mejor solución podría ser utilizar un servidor web incorporado real para escuchar en el puerto que necesita. Esto no funcionará si otra aplicación (p. Ej., IIS) ya está utilizando el puerto, pero dado que NO utiliza HTTP.sys para compartir puertos, no hay restricciones de seguridad sobre qué cuenta de usuario está abriendo / escuchando en el puerto . Como desea que el usuario especifique su propio puerto, parece aceptable ejecutarse en otro puerto además del puerto 80.

Mi empresa fabrica un producto comercial llamado Neokernel Web Server ( http://www.neokernel.com ) que ejecuta ASP.NET y le permite iniciar / detener programáticamente el servidor y establecer configuraciones; Puede incrustar y distribuir este conjunto con la aplicación.

También existe el código fuente de Cassini que puede modificar e incrustar, es gratis pero tiene algunos inconvenientes, como no tener registro o soporte SSL.