2011-02-08 24 views
10

Estoy tratando de distribuir IIS Express con mi aplicación. IIS Express atenderá solicitudes web externas en el puerto 80.Cómo ejecutar IIS Express como un proceso iniciado a través de un servicio de Windows

No tengo problemas para ejecutar IIS Express y atender solicitudes externas, sin embargo, Microsoft, en su sabiduría infinita, decidió ejecutar IIS Express desde una ventana de la consola y un elemento de la bandeja del sistema . Puede desactivar el elemento de la bandeja mediante un argumento de línea de comando pero no la ventana de la consola.

Quiero ejecutar IIS Express sin que se muestre la ventana de la consola. También quiero ejecutar IIS Express desde un servicio de Windows.

Ejecutar el siguiente código de mi aplicación hace exactamente lo que quiero:

Directory.SetCurrentDirectory(string.Format("{0}\\IIS Express", iisProgramDirectory)); 
    process.EnableRaisingEvents = true; 
    //process.Exited += new EventHandler(process_Exited); 
    process.StartInfo.FileName = "iisexpress.exe"; 
    process.StartInfo.Arguments = string.Format("\"/config:{0}webservice\\config\\applicationhost.config\"", dataDirectory); 
    process.StartInfo.UseShellExecute = false; 
    process.StartInfo.RedirectStandardOutput = true; 
    process.StartInfo.RedirectStandardError = true; 
    process.StartInfo.CreateNoWindow = true; 
    process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
    //process.StartInfo.UserName = "Administrator"; 
    //System.Security.SecureString securePwd = new System.Security.SecureString(); 
    //string password = "**********"; 
    //char[] pword = password.ToCharArray(); 
    //for (int i = 0; i < pword.Length; i++) 
    //{ 
    // securePwd.AppendChar(pword[i]); 
    //} 
    //process.StartInfo.Password = securePwd; 
    process.Start(); 

Obviamente estoy funcionando como administrador. IIS Express aparentemente necesita ejecutarse con privilegios de administrador para atender solicitudes externas y escuchar en el puerto 80.

Mi servicio de Windows se ejecuta bajo la cuenta de servicio de Windows, que creo que tiene privilegios completos, pero el proceso IIS Express simplemente sale con gracia código de error de 0 cuando intento ejecutarlo desde el servicio de Windows.

He intentado una serie de escenarios (como se puede ver en el fragmento de código) pero parece que no hay forma de que pueda ejecutar IIS Express utilizando el servicio de Windows Y ocultar la ventana de la consola de darn.

Cualquier sugerencia será apreciada.

+1

PS. también puedes aceptar más respuestas, a las preguntas que has hecho. –

Respuesta

-1

No se puede hacer si también desea utilizar el puerto 80.

+0

Consulte esta URL sobre cómo configurar HTTP.sys para permitir la escucha de solicitudes en el puerto 80 con IIS Express. http://learn.iis.net/page.aspx/1005/handling-url-binding-failures-in-iis-express/ –

0

Hubo una pregunta similar (ejecutando iisexpress sin ventana de consola) en los foros de iis.net. Por favor, eche un vistazo a http://forums.iis.net/p/1175262/1970513.aspx#1970513

+0

Gracias por el enlace y voto. ¡Creo que cada vez más personas hacen montañas en las montañas cuando se trata de ocultar la ventana de la consola, pero de nuevo solo utilizan archivos por lotes! El problema que tengo es ejecutarlo como un proceso iniciado dentro de un servicio de Windows. No puedo hacer que funcione ni mucho menos sin una ventana de consola. – David

+0

David ... creo que debes verificar el "Aislamiento de la sesión 0" ... según tu comentario lo interpreto como que estás tratando de iniciar IIS express desde un servicio de Windows ... iniciará el IIS pero eso estará en la sesión 0 ... para verificar que cuando ejecute su servicio vaya a administrador de tareas-> procesos-> haga clic en Mostrar procesos de todos los usuarios. Ahí puede ver que IIS se ejecuta con su nombre pero con la ID de sesión 0 ... incluso estoy buscando una solución para la misma. si obtienes uno ... por favor déjame saber también – Gautam

2

Pruebe esto. Tuvimos la misma situación y esto funcionó. Esto puede ayudarte.

Esto es con IIS Express 7.5 que no necesita derechos de administrador.

string IIS_EXPRESS = @"C:\Program Files\IIS Express\iisexpress.exe"; 

StringBuilder arguments = new StringBuilder(); 
arguments.Append(@"/path:"); 
arguments.Append(@"C:\Inetpub\wwwroot\ClientSyncService"); 
arguments.Append(@" /Port:2000"); 
Process process = Process.Start(new ProcessStartInfo() 
{ 
    FileName = IIS_EXPRESS, 
    Arguments = arguments.ToString(), 
    RedirectStandardOutput = true, 
    UseShellExecute = false, 
    CreateNoWindow = true 
}); 
+0

Gracias por tomarse el tiempo, sin embargo, como mencioné en mi pregunta, esto no funcionará cuando intente usar el puerto 80 ya que IIS Express debe ejecutarse como administrador cuando se atiendan solicitudes externas en el puerto 80 – David

7

La respuesta como: cadena IIS_EXPRESS = @ "C: \ Archivos de programa \ IIS Express \ iisexpress.exe";

StringBuilder arguments = new StringBuilder(); 
    arguments.Append(@"/path:"); 
    arguments.Append(@"C:\Inetpub\wwwroot\ClientSyncService"); 
    arguments.Append(@" /Port:2000"); 
    Process process = Process.Start(new ProcessStartInfo() 
     { 
      FileName = IIS_EXPRESS, 
      Arguments = arguments.ToString(), 
      RedirectStandardOutput = true, 
      UseShellExecute = false, 
      CreateNoWindow = true 
     }); 

debería funcionar, sin embargo, el truco es que se necesita para conceder ACL para la identidad del servicio para que pueda tomar posesión de puerto 80. En otras palabras, durante su programa de instalación (suponiendo que tiene un MSI que se ejecutará elevado), haga que ejecute una línea de comando como: netsh http add urlacl url = http: // WhateverMachineName: 80/user = everyone

donde puede limitar "todos" a un solo lugar específico cuenta bajo la cual se ejecutará su servicio. Cuando lo haga, IIS Express podrá comenzar bien sin requerir privilegios de administrador.

+0

Sé que este es un hilo viejo, pero estoy tratando de hacer lo mismo pero no puedo hacerlo funcionar con el iisexpress.exe de 32 bits que se encuentra en C: \ archivos de programa (x86) \ IIS Express. Solo el iisexpress.exe de 64 bits funciona por alguna razón. – Dan

3

Para ejecutar IIS 7.5 como administrador, solo cambia ligeramente su código a:

Process process = Process.Start(new ProcessStartInfo() 
{ 
    FileName = IIS_EXPRESS, 
    Arguments = arguments.ToString(), 
    RedirectStandardOutput = true, 
    UseShellExecute = true, 
    CreateNoWindow = true, 
    Verb = "runas" 
}); 

Esto también le permitirá ejecuta tu sitio en el puerto 80.

0

Sé que esta es una publicación anterior, pero ¿ha considerado la envoltura de servicio SRVANY de Microsoft?

Se instala y se ejecuta como un servicio de Windows (bajo cualquier credencial) y ejecuta su proceso en un proceso sin ventanas.

Cualquier cosa se puede ejecutar desde una línea de comandos (o Start/Run window), que puede funcionar como un servicio a través de SRVANY:

bonito reportaje en: http://www.tacktech.com/display.cfm?ttid=197

Cuestiones relacionadas