2011-08-26 17 views
8

Vorrei eseguire un processo da un client Intranet sul lato del servizio WCF. Nel mio caso, un client chiede a un server di creare un nuovo processo sulla macchina del server con le credenziali fornite. servizio WCF è ospitato su IIS 7.5 e avviare un processo utilizzando questo codiceCome avviare un processo da un servizio WCF ospitato da IIS?

var processInfo = new ProcessStartInfo("C:\\Windows\\System32\\notepad.exe") 
{ 
    UserName = "some user", 
    Password = MakeSecureString("some password"), 
    UseShellExecute = false, 
    LoadUserProfile = true 
}; 

Process process = Process.Start(processInfo); 

Questo codice funziona se ospito servizio WCF come un'applicazione di console self-hosted in esecuzione con utente admin e vedo il blocco note iniziata sotto un altro utente . Viene a mancare su IIS senza eccezione, ma il processo è terminato immediatamente

process.HasExited = true; 
process.ExitCode = -1073741502; 

Su richiesta IIS WCF viene eseguito con l'utente con diritti di amministratore e ha piena fiducia definito nel web.config. Non è possibile utilizzare l'applicazione self hosted in quanto non supporta la consegna continua semplice (come WebDeploy con Web farm IIS).

Q: Come è possibile avviare un processo sul lato server dal servizio WCF ospitato su IIS?

EDIT:
sono incappato questo post, con problemi simili e ho provato tutti i metodi là, tra tutte le possibili varianti per Process.Start e P/Invoke con CreateProcessWithLogonW e CreateProcessAsUser ho anche provato concedere autorizzazioni aggiuntive agli utenti. Non di ciò funzionerebbe con i messaggi di errore identici a quelli che il ragazzo aveva pubblicato.

+0

qualsiasi soluzione finale con un esempio di codice sorgente completo? – Kiquenet

+0

Non è possibile senza hack sporchi. Non l'ho fatto – oleksii

+0

quali hack sporchi? – Kiquenet

risposta

4

Oleksii, il punto è che, se si ospita il servizio WCF in un'applicazione di console, v'è una sessione di Windows (un utente registrato e Windows Explorer caricato) per l'utente e il blocco note viene aperto e visualizzato per quell'utente, quindi lo vedi nell'interfaccia utente.

quando si ospita il servizio WCF in IIS, essendo un server, IIS richiede e non consente l'interazione dell'utente e funziona anche se nessun utente ha effettuato l'accesso; in quel contesto non esiste un'interfaccia utente per ospitare il blocco note o altre applicazioni abilitate all'interfaccia utente, è possibile eseguire un processo per l'elaborazione o altri processi batch ma non eseguire il rendering di un'applicazione dell'interfaccia utente di Windows, perché Windows Explorer non è caricato per l'utente e non c'è spazio per rendere l'interfaccia utente del tuo processo.

+1

Voglio il servizio WCF ospitato in IIS (con l'utente A in AppPool) e impersonare con un altro utente B quando chiamo al mio comando EXE (riga di comando, non UI) utilizzando Process.Start. Eventuali suggerimenti? Forse non è possibile. – Kiquenet

1

Ecco cosa uso per chiamare GnuPGP per eseguire la crittografia. Come si confronta la tua configurazione?

private int ExecuteCommand(string arguments, string passPhrase, int timeout) 
     { 
      Process processObject; 
      ProcessStartInfo pInfo = new ProcessStartInfo(_executablePath, arguments); 


      pInfo.CreateNoWindow = true; 
      pInfo.UseShellExecute = false; 

      pInfo.RedirectStandardInput = true; 
      pInfo.RedirectStandardOutput = true; 
      pInfo.RedirectStandardError = true; 
      processObject = Process.Start(pInfo); 

      if (!string.IsNullOrEmpty(passPhrase)) 
      { 
       processObject.StandardInput.WriteLine(passPhrase); 
       processObject.StandardInput.Flush(); 
      } 

      string result = processObject.StandardOutput.ReadToEnd(); 
      string error = processObject.StandardError.ReadToEnd(); 

      if (!processObject.WaitForExit(timeout)) 
      { 
       throw new TimeoutException("GnuPG operation timeout. Waited " + timeout + " milliseconds "); 
      } 

      int exitcode = processObject.ExitCode; 

      Error = error; 
      Output = result; 

      return exitcode; 

     } 
+0

No, questo non sarebbe d'aiuto dopo questa riga 'processObject = Process.Start (pInfo);' ha HasExited impostato su true. – oleksii

+0

Non stai davvero provando a eseguire il blocco note, giusto? –

+0

effettivamente lo sono, è un cablaggio di test che testa le funzionalità di altri software per rilevare l'avvio di un processo. – oleksii

1

C'è un'impostazione di apppool per assicurarsi che carichi il profilo utente.

loadUserProfile Optional Boolean attribute. 

Specifies whether IIS loads the user profile for the application pool identity. Setting  
this value to false causes IIS to revert to IIS 6.0 behavior. IIS 6.0 does not load the 
user profile for an application pool identity. 

The default value is false. 

Questo insieme all'essere un utente di dominio come l'identità con autorizzazioni sufficienti potrebbe funzionare ?? So che almeno l'utente avrà bisogno di un profilo utente.

Detto questo, è un po 'strano di architettura. Sembra che un arco migliore sarebbe avere un processo persistente come un servizio Windows con cui comunica il sito, ma non sono sicuro di quali siano i tuoi vincoli.

Spero che questo aiuti.

+0

Grazie per la risposta. Questo ha senso. Con IIS sarebbe più semplice consegnare il prodotto tramite WebDeploy poiché è possibile creare una Web farm. Detto questo, ho provato Win Service e ho avuto gli stessi problemi lì. Sto invertendo l'hosting di riga di comando e la distribuzione di script in quanto è doloroso configurarlo su IIS. – oleksii

Problemi correlati