2010-02-27 15 views
18

Ho un servizio Windows (C#) installato su un server che avvia ogni 10 minuti un file eseguibile (C#) per elaborare alcune immagini da una directory a un'altra. Nessuna interazione è richiesta con nessun utente. Tuttavia, poiché il file eseguibile come finestra di output, per eseguire il servizio devo abilitare il servizio "Consenti al servizio di interagire con il desktop" che è considerato come insecure and bad practice. Come andrei su questo problema? Mi piace avere l'eseguibile separato dal mio servizio, perché le finestreAlternativa a "Consenti al servizio di interagire con il desktop"?

  • rende più facile per eseguire il debug e non richiede un completo redeploy servizio di Windows.
  • volte uso le stesse finestre servizio di lanciare diversi file eseguibili a diversi intervalli (ma tutti legati allo stesso progetto ).

EDIT:

Quando l'interazione con il desktop non è abilitato, l'applicazione di console non sono eseguite correttamente e il seguente errore appare all'interno i registri di Windows:

Faulting application myapp.exe, version 1.0.0.0, time stamp 0x4b8304c3, 
faulting module KERNEL32.dll, version 6.0.6002.18005, time stamp 0x49e03821, 
exception code 0xc0000142, fault offset 0x00009eed, process id 0x10ec, 
application start time 0x01cab736950a64b5. 

volta l'interazione desktop è abilitata, l'applicazione viene eseguita normalmente.

Qualche idea?

Grazie mille per il vostro tempo.

+0

È per Vista e versioni successive? –

+0

La parte di debug non è una buona ragione. Potresti avere un eseguibile e il servizio utilizza un assembly comune che contiene tutte le funzionalità. –

+0

Sì, il servizio Windows esegue Windows Server 2008 Web Edition. Windows Service ed eseguibile vengono generati con Visual Studio 2008 rispetto a con .NET Framework 3.5 – jdecuyper

risposta

10

Se si utilizza Vista e versioni successive e non si ha realmente bisogno di alcuna interazione con l'utente, ma hanno un exe interattivo per eseguire, il Session 0 isolation feature dovrebbe contribuire ad alleviare alcune delle preoccupazioni circa il 'cattivo esercitarsi "sull'avere che un servizio interagisca con il desktop (che nella Sessione 0 non ha console fisica).

Questo isolamento della sessione 0 impedisce agli utenti non privilegiati di eseguire Shatter Attacks sul proprio servizio man mano che ottengono i propri desktop interattivi in ​​sessioni diverse. Gli attacchi Shatter sono la ragione principale per cui questa 'interazione con il desktop' è stata considerata una cattiva pratica e se si utilizza Vista o versione successiva, dovrebbe essere ok se non si può evitare (o si dovrà spendere troppi sforzi per farlo).

Quindi, se le cose funzionano come sono, probabilmente stai bene.

Ovviamente, dopo un aggiornamento del sistema operativo, le cose potrebbero semplicemente smettere di funzionare, quindi è probabilmente meglio prepararsi a spostare la dipendenza dall'interattività, poiché non ne hai davvero bisogno.

+0

L'isolamento della Sessione 0 ha molto senso e in qualche modo mi rende un po 'meno preoccupato per le implicazioni di sicurezza del mio servizio. Ma come hai giustamente menzionato, sarebbe meglio escludere l'interattività. Durante la creazione del processo, ho già provato a impostare le proprietà 'UseShellExecute' su true e 'CreateNoWindow' su false ma il servizio richiede comunque l'interazione desktop. – jdecuyper

+0

Hai digitato quello giusto? CreateNoWindow dovrebbe essere * true * e penso che UseShellExecute dovrebbe probabilmente essere falso (sebbene UseShellExecute potrebbe non avere importanza). – Weeble

+0

Mi dispiace per quell'errore di battitura! CreateNoWindow è impostato su true. – jdecuyper

2

Se possibile, si consiglia di riscrivere i file eseguibili che gestiscono lo spostamento per non utilizzare una finestra di output. Se sono standard, le applicazioni console senza output, è possibile eseguirle all'interno di un servizio senza richiedere "Consenti al servizio di interagire con il desktop". Questo ti offre tutti i vantaggi, senza modifiche al tuo servizio.

+0

Come procederesti a rimuovere l'output dell'applicazione? Dove pensi alla stessa soluzione di Weeble? Grazie. – jdecuyper

+0

Sì, quello era fondamentalmente il mio pensiero. Se si tratta solo di un'applicazione console, non è necessario avere un'interazione desktop. Se stai usando un'applicazione Windows, tuttavia, non funzionerà ... –

2

Il sottoprocesso è solo un'applicazione di console? Non ho scritto i servizi di Windows, ma penso che forse sarebbe sufficiente avviare il sottoprocesso senza una finestra. Utilizzare l'overload di Process.Start che accetta ProcessStartInfo e imposta ProcessStartInfo.CreateNoWindow su true.

http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.createnowindow.aspx

+0

Grazie mille per il tuo link. L'ho già provato ma richiede ancora la casella di controllo per essere abilitato. – jdecuyper

+0

Purtroppo non ho accesso a una macchina Windows al momento. Sai se il sottoprocesso sta iniziando e poi fallendo o semplicemente non sta iniziando affatto? Ed è un'applicazione per console o qualcos'altro? – Weeble

+0

Si tratta di un'applicazione console C#. Ho modificato la mia domanda e aggiunto il messaggio di errore che viene registrato. – jdecuyper

4

So che è un po 'tardi ma in questa circostanza utilizzerei l'utilità di pianificazione e non mi preoccuperei del servizio Windows. L'utilità di pianificazione ha un set completo di opzioni di pianificazione e può eseguire le applicazioni della console senza problemi.

Problemi correlati