Come può un servizio Windows avviare un processo quando viene generato un evento timer?

Ho creato un servizio di Windows con Timer e in fase di timer.Elapsed del timer.Elapsed Sto creando un processo ( System.Diagnostics.Process.Start(exe path) ) a intervalli di 5 secondi. Ma questo processo non viene creato durante il lancio di un evento.

C’è un altro modo per farlo?

Grazie in anticipo.

 private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { Process pr = new Process(); pr.StartInfo.FileName = @"C:\Program Files\Messenger\msmsgs.exe"; pr.StartInfo.WindowStyle = ProcessWindowStyle.Normal; pr.StartInfo.CreateNoWindow = false; pr.Start(); } 

Aggiungete le descrizioni del problema nei commenti mentre andate avanti che sarebbe stato utile sapere all’inizio. La ragione per cui è ansible vedere il processo è iniziata ma nessuna finestra viene mai aperta è a causa di modifiche del modello di sicurezza apportate a Servizi Windows in Windows Vista e versioni successive. Non l’hai ancora menzionato in modo specifico, ma ho il forte sospetto che tu stia cercando di eseguirlo sotto uno di quei sistemi operativi. Il vero problema non sta avviando un processo, sta mostrando un’interfaccia utente.

Quello che stai cercando di ottenere è chiamato “servizio interattivo” , che è permesso interagire direttamente con l’utente e il desktop (cioè mostrare una finestra o un dialogo).
Se stai usando Windows XP (e il tuo servizio dovrà sempre funzionare solo con Windows XP), puoi seguire le istruzioni in questo articolo per abilitare il tuo servizio ad essere eseguito in modalità intertriggers, che ti permetterà di visualizzare l’applicazione Adobe Acrobat finestra come ti aspetti. Tuttavia, come indica anche quella documentazione, questa funzione non funziona con Windows Vista e versioni successive:

I servizi importanti non possono interagire direttamente con un utente a partire da Windows Vista. Pertanto, le tecniche menzionate nella sezione intitolata Uso di un servizio interattivo non dovrebbero essere utilizzate nel nuovo codice.

Più specificamente, in quelle versioni, sono state apportate modifiche a come vengono eseguiti i servizi e le applicazioni. I servizi sono ora isolati dal sistema nella Sessione 0, mentre le applicazioni vengono eseguite in altre sessioni. Questo ha lo scopo di isolare i servizi dagli attacchi che hanno origine nel codice dell’applicazione. Quindi, nessuna interfaccia utente mostrata da un servizio sarà visibile a nessun utente sul sistema, inclusa una semplice finestra di messaggio. Puoi leggere il white paper che spiega queste modifiche in maggior dettaglio qui . Se sei una persona più visiva, fai riferimento al seguente diagramma che illustra il nuovo modello, prestando particolare attenzione alle linee di divisione:

Modello di isolamento processo di Windows in Windows Vista / 7

Il risultato è che se hai scelto come target quelle versioni, o potresti doverle indirizzare a quelle versioni, non puoi utilizzare questa scappatoia. Dico “scappatoia” perché la linea di fondo, come ho detto in un commento, è che i servizi di Windows non sono pensati per essere interattivi . Quello che stai cercando di fare qui è contrario allo scopo e alla progettazione di un servizio. Non è stato consigliato prima e ora non funziona affatto. Se hai bisogno di questa particolare funzionalità, dovresti creare un diverso tipo di applicazione. Sia Windows Form che WPF sono destinati alle applicazioni in modalità utente ed entrambi possono avviare processi e aprire nuove windows secondo necessità. Raccomando vivamente di convertire in questo stile di applicazione.

Poiché non verrà visualizzato un processo per mostrare l’interfaccia utente dal servizio, è consigliabile eseguire il processo di supporto quando l’utente accede e avvia il processo da esso.

Mi rendo conto che sono un po ‘in ritardo per questa festa. Ma dal momento che questa domanda è arrivata nella mia ricerca di una soluzione, fornirò una risposta alla domanda dell’OP.

È ansible avviare un programma da un servizio utilizzando CreateProcessAsUser, utilizzando il token dell’utente connesso. MSDN fornisce una bella app di esempio che lo dimostra; cercare CSCreateProcessAsUserFromService: https://code.msdn.microsoft.com/windowsapps/CSCreateProcessAsUserFromSe-b682134e#content

Ho provato e funziona. Sono in grado di creare un nuovo processo per la mia applicazione .NET esistente da un servizio e funziona perfettamente. Ho impostato le proprietà Accesso al servizio sull’account del sistema locale, ma ho lasciato deselezionato “Consenti al servizio di interagire con il desktop”. La mia applicazione viene creata quando scade il timer e funziona esattamente come quando viene avviata normalmente, inclusa la presentazione della GUI e l’interazione dell’utente.

Se questa è una cosa impropria o indesiderabile da fare è un’altra discussione. Ma è davvero ansible, e in realtà non è così difficile.

C’è una specie di soluzione, ma consiglierei di farlo solo se SIETE SICURI DI ACCETTARE IL PROBLEMA DI SICUREZZA!

Questa potrebbe essere la risposta al tuo problema: CreateProcessAsUser .

L’esempio mostra come creare / avviare un processo in modo interattivo nella sessione dell’utente connesso da un’applicazione di servizio scritta in C # .Net.