2010-04-06 13 views
19

Mi aplicación usa un servidor web pequeño para server algunos archivos y tiene una interfaz web para administración remota. En este momento el usuario tiene que utilizar netsh para registrar el URI como talC# HttpListener sin usar netsh para registrar un URI

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

cual no es divertido para el usuario medio. Me gustaría que el programa pueda escuchar en cualquier puerto especificado por el usuario desde mi programa sin que el usuario final necesite usar el símbolo del sistema. ¿Hay alguna manera de lograr esto solo usando Process.Start y ejecutando el comando prompt mismo?

+0

Supongo que saben que la línea de comandos no iba a funcionar en Windows XP, ¿verdad? –

+0

Sí, por lo que sé, es solo para Vista y Win7 –

+2

Consulte esta pregunta aquí: http://stackoverflow.com/questions/6851161/net-or-win32-equivalent-of-netsh-http-add-urlacl -command Hay una API Win32 para hacer esto. – Travis

Respuesta

27

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

Se les solicitará a los usuarios que realicen cambios en su sistema, pero es mejor que nada. Es posible que desee hacer esto en respuesta a una 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(); 
    } 
} 
+0

¡Esto funcionó muy bien! –

+0

1. ¿Funciona también en WinXP? 2. Si desea agregar acl, es genial, ¿cómo verificar si se ha agregado acl concreto todavía? – UGEEN

2

Si está utilizando un HttpListener, usted tiene que utilizar httpconfig.exe o netsh para configurar su HttpListener, porque:

A. Que yo sepa hay ninguna API para hacer esto desde C#, sólo las herramientas de línea de comandos

B. Por defecto único sistema o el grupo Administradores local puede escuchar http prefijos

Así que ... si su aplicación se ejecuta bajo la cuenta del usuario, es necesario conceder acceso explícitamente (mediante 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 b aplicación en el puerto 80 mientras IIS se está ejecutando en el puerto 80 también).

Una mejor solución podría ser utilizar un servidor web incorporado para escuchar en el puerto que necesita. Esto no funcionará si otra aplicación (por ejemplo, IIS) ya está utilizando el puerto, pero como 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 ejecutarlo en otro puerto además del puerto 80.

Mi empresa produce un producto comercial llamado Servidor web Neokernel (http://www.neokernel.com) que ejecuta ASP.NET y le permite programar iniciar/detener el servidor y configurar 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 la falta de registro o la compatibilidad con SSL.

+5

La API para cambiar estos programáticamente es [HttpSetServiceConfiguration] (http://msdn.microsoft.com/en-us/library/aa364503%28v=vs.85%29.aspx) – Mitch

Cuestiones relacionadas