Como um serviço do Windows pode iniciar um processo quando um evento de Timer é gerado?

Eu criei um serviço do Windows com Timer e no evento de disparo do timer.Elapsed Estou criando um processo ( System.Diagnostics.Process.Start(exe path) ) no intervalo de 5 segundos. Mas esse processo não é criado no disparo de um evento.

Existe alguma outra maneira de fazer isso?

Desde já, obrigado.

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

Você está adicionando descrições do problema nos comentários ao longo do processo, o que seria útil saber desde o início. O motivo pelo qual você pode ver que o processo foi iniciado, mas nenhuma janela é aberta, é devido a alterações no modelo de segurança que foram feitas no Windows Services no Windows Vista e posterior. Você ainda não mencionou especificamente, mas tenho uma forte suspeita de que você está tentando executar isso em um desses sistemas operacionais. O problema real não é iniciar um processo, ele está mostrando uma interface do usuário.

O que você está tentando realizar é chamado de “Serviço Interativo” , que é aquele que tem permissão para interagir diretamente com o usuário e a área de trabalho (ou seja, mostrar uma janela ou checkbox de diálogo).
Se você estiver usando o Windows XP (e seu serviço só precisará ser executado no Windows XP), siga as instruções desse artigo para permitir que seu serviço seja executado no modo interativo, o que permitirá exibir o aplicativo Adobe Acrobat. janela como você espera. No entanto, como essa documentação também indica, esse recurso não funciona no Windows Vista e posterior:

Serviços importantes não podem interagir diretamente com um usuário a partir do Windows Vista. Portanto, as técnicas mencionadas na seção intitulada Usando um serviço interativo não devem ser usadas no novo código.

Mais especificamente, nessas versões, foram feitas alterações em como os serviços e aplicativos são executados. Os serviços agora são isolados pelo sistema na Sessão 0, enquanto os aplicativos são executados em outras sessões. Isso se destina a isolar os serviços de ataques originados no código do aplicativo. Portanto, nenhuma interface do usuário mostrada por um serviço será visível para qualquer usuário no sistema, incluindo uma checkbox de mensagem simples. Você pode ler o white paper que explica essas alterações em mais detalhes aqui . Se você for uma pessoa mais visual, consulte o diagrama a seguir que ilustra o novo modelo, prestando atenção específica às linhas divisórias:

Modelo de isolamento de processo do Windows no Windows Vista / 7

O resultado é que, se você estiver segmentando essas versões ou precisar segmentar essas versões, não poderá usar essa brecha. Eu digo “brecha” porque a linha de fundo, como mencionei em um comentário, é que os Serviços do Windows não se destinam a ser interativos . O que você está tentando fazer aqui é contrário ao propósito e ao design de um serviço. Não foi recomendado antes e agora não funciona. Se você precisar dessa funcionalidade específica, deverá criar um tipo diferente de aplicativo. Tanto o Windows Forms quanto o WPF são destinados a aplicativos em modo de usuário, e ambos podem iniciar processos e abrir novas janelas conforme necessário. Eu recomendo fortemente que você converta para esse estilo de aplicativo.

Como você não obterá um processo para mostrar a interface do usuário do serviço, recomendo que execute o processo de ajuda quando o usuário fizer logon e iniciar o processo a partir dele.

Eu percebo que estou um pouco atrasado para esta festa. Mas, como essa questão surgiu na minha busca por uma solução, forneço uma resposta à pergunta do OP.

Você pode iniciar um programa a partir de um serviço usando CreateProcessAsUser, usando o token do usuário conectado. O MSDN fornece um bom aplicativo de exemplo demonstrando isso; procure por CSCreateProcessAsUserFromService: https://code.msdn.microsoft.com/windowsapps/CSCreateProcessAsUserFromSe-b682134e#content

Eu tentei e funciona. Eu sou capaz de criar um novo processo para o meu aplicativo .NET existente de um serviço, e funciona muito bem. Eu configurei as propriedades de Logon do serviço para a conta do Sistema Local, mas deixei a opção “Permitir que o serviço interaja com a área de trabalho” desmarcada. Meu aplicativo é criado quando o timer expira e funciona da mesma forma quando é iniciado normalmente, incluindo a apresentação da GUI e a interação do usuário.

Se isso é uma coisa imprópria ou indesejável para fazer é outra discussão. Mas é realmente possível, e realmente não é tão difícil.

Há um tipo de trabalho ao redor, mas eu aconselharia a só fazer isso se você tiver certeza de aceitar a questão da segurança!

Esta poderia ser a resposta ao seu problema: CreateProcessAsUser .

O exemplo demonstra como criar / iniciar um processo interativamente na session do usuário conectado a partir de um aplicativo de serviço gravado em C # .Net.