Pregunta

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

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 de mi programa sin que el usuario final necesita usar el símbolo del sistema. ¿Hay de todos modos para lograr esto menos solo usar el proceso.

¿Fue útil?

Solución

Escribí esto para elevar las permanentes y agregar entradas de ACL HTTP a través de netsh.

Los usuarios recibirán solicitados que realicen cambios en su sistema, pero es mejor que nada. Es posible que desee hacer esto en respuesta a un DirectAccessDeniedException

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();
    }
}

Otros consejos

Si está utilizando un httplistener, debe 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 comando

B. Por defecto, solo el sistema o el grupo de administradores locales puede escuchar los prefijos HTTP

Entonces ... si su aplicación se ejecuta bajo la cuenta del usuario, debe otorgar explícitamente el acceso (usando httpcfg.exe o netsh) porque su httphandler usa el http.sys para compartir puertos con el servidor web en ejecución (para que pueda alojar el suyo 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 usar un servidor web integrado real para escuchar en el puerto que necesita. Esto no funcionará si otra aplicación (por ejemplo, IIS) ya está utilizando el puerto, pero dado que esto no utiliza el http.sys para compartir puertos, no hay restricciones de seguridad sobre qué cuenta de usuario está abriendo /escuchando en el puerto . Debido a que desea que el usuario especifique su propio puerto, parece aceptable ejecutarse en otro puerto además del puerto 80.

Mi compañía hace 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 ensamblaje con la aplicación.

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

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