2011-02-08 2 views
10

Sto tentando di distribuire IIS Express con la mia applicazione. IIS Express servirà le richieste Web esterne sulla porta 80.Come eseguire IIS Express come processo avviato tramite un servizio Windows

Non ho problemi nell'esecuzione di IIS Express e al servizio di richieste esterne, tuttavia Microsoft nella sua infinita saggezza ha deciso di eseguire IIS Express da una finestra della console e una voce nella barra delle applicazioni . È possibile disabilitare l'elemento vassoio da un argomento della riga di comando ma non dalla finestra della console.

Voglio eseguire IIS Express senza visualizzare la finestra della console. Voglio anche eseguire IIS Express da un servizio di Windows.

L'esecuzione del seguente codice da dentro il mio applicazione fa esattamente quello che voglio:

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

Ovviamente io sono in esecuzione come amministratore. Sembra che IIS Express debba essere eseguito con i privilegi di amministratore per servire richieste esterne e per ascoltare sulla porta 80.

Il mio servizio Windows gira sotto l'account del servizio Windows che credo abbia i privilegi completi ma il processo IIS Express esce con grazia con un codice di errore 0 quando provo ad eseguirlo dal servizio Windows.

Ho provato una serie di scenari (come puoi vedere dal frammento di codice) ma sembra che non ci sia modo per far funzionare IIS Express usando il mio servizio Windows E nascondere la finestra della console darn.

Qualsiasi suggerimento sarà apprezzato.

+1

PS. puoi accettare anche più risposte, alle domande che hai posto. –

risposta

-1

Esso non può essere fatto se si vuole anche di utilizzare Port 80.

+0

Vedere questo URL su come configurare HTTP.sys per consentire l'ascolto di richieste sulla porta 80 con IIS Express. http://learn.iis.net/page.aspx/1005/handling-url-binding-failures-in-iis-express/ –

0

C'era una domanda simile (eseguendo iisexpress senza finestra della console) nei forum di iis.net. Si prega di dare un'occhiata a http://forums.iis.net/p/1175262/1970513.aspx#1970513

+0

Grazie per il link e voto. Penso che più persone stiano costruendo montagne dai cumuli di terra quando si tratta di nascondere la finestra della console, ma poi usano solo file batch! Il problema che sto avendo è eseguirlo come un processo avviato all'interno di un servizio di Windows. Non riesco a farlo funzionare da solo senza una finestra della console. – David

+0

David .. penso che tu debba controllare "Isolamento di sessione 0" .. secondo il tuo commento, sto prendendo come se tu stia provando ad avviare IIS Express da dentro un servizio Windows ... inizierà IIS ma quello sarà nella sessione 0 ... per verificare che quando esegui il tuo servizio vai su task manager-> processi-> fai clic su mostra i processi da tutti gli utenti. Lì puoi vedere IIS in esecuzione sotto il tuo nome ma con ID di sessione 0 ... anche io sto cercando una soluzione per lo stesso. se ne ottieni uno .. per favore fammi sapere anche – Gautam

2

Prova questo. Abbiamo avuto la stessa situazione e questo ha funzionato. Questo potrebbe aiutarti.

Questo è con IIS Express 7.5 che non richiede i diritti di amministratore.

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

Grazie per aver dedicato del tempo però come ho detto nella mia domanda, questo non funzionerà quando proverai ad usare la porta 80 dato che IIS Express deve essere eseguito come Amministratore quando serve richieste esterne sulla porta 80 – David

7

La risposta del tipo: stringa 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 
     }); 

dovrebbe funzionare, ma il trucco è che è necessario concedere ACL per l'identità del servizio in modo che possa assumere la proprietà di porta 80. In altre parole, durante il programma di installazione (ammesso che abbiate un MSI che verrà eseguito in alto), esegui una riga di comando come: netsh http aggiungi urlacl url = http: // WhateverMachineName: 80/user = everyone

dove puoi limitare "tutti" a un solo specifico account in base al quale verrà eseguito il servizio. Quando lo fai, allora IIS Express dovrebbe essere in grado di iniziare perfettamente senza richiedere i privilegi di amministratore.

+0

So che questo è un thread vecchio, ma sto cercando di fare la stessa cosa, ma non riesco a farlo funzionare con iisexpress.exe a 32-bit trovato in C: \ program files (x86) \ IIS Express. Solo il 64 bit iisexpress.exe funziona per qualche motivo. – Dan

3

Per eseguire IIS 7.5 come amministratore, basta modificare il codice leggermente a:

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

Questo sarà anche consentire di avvia il tuo sito sulla porta 80.

0

So che questo è un vecchio post, ma avete preso in considerazione SRVANY Service Wrapper di Microsoft?

Si installa ed esegue come servizio Windows (con qualsiasi credenziale) e avvia il processo in un processo senza finestre.

Tutto ciò che è possibile eseguire da una riga di comando (o Start/finestra Esegui), è possibile eseguire come un servizio via SRVANY:

Nizza write-up a: http://www.tacktech.com/display.cfm?ttid=197