Por que os serviços do Windows não podem ter uma GUI?

22

Eu estava usando esse recurso na versão anterior do Windows, como XP e NT. Consegui executar uma GUI a partir de um serviço do Windows. Mas não é possível nas versões posteriores.

Qual é o motivo por trás da remoção desse recurso? Por que os serviços do Windows não podem ter uma GUI?

Uma corrida
fonte

Respostas:

47

Principalmente razões de segurança.

Pelo que entendi, quando um serviço do Windows cria controles de GUI, como um MessageBox, eles normalmente eram vistos apenas na sessão em que os serviços são executados, ou seja, na Sessão 0, que também costumava ser o primeiro usuário conectado localmente ou por alguém fazendo logon usando mstsc / admin. Portanto, esse usuário veria esses controles e poderia interagir com o serviço.

Mas, por razões de segurança, a Sessão 0 agora está reservada e o primeiro usuário a fazer logon receberá uma nova sessão e, portanto, não verá os controles da GUI.

Como isso interrompe muitos serviços, para compatibilidade, existe um processo (consulte este blog do MSDN) que tenta detectar se alguma mensagem está sendo exibida e aparece com um aviso 'Um programa em execução neste computador está tentando exibir uma mensagem 'e permite visualizar ou ignorar a mensagem.

A Microsoft possui um WhitePaper sobre esse assunto, que pode ser baixado aqui

Eu também suspeitaria que outro motivo menor é porque o recurso foi mal utilizado / mal interpretado e levou a projetos ruins. Por exemplo, eu costumava ter um servidor antigo com um serviço de terceiros que exibia algumas notificações / erros usando uma caixa de mensagem em vez de gravar no log de eventos. Mas nunca efetuei logon localmente e raramente efetuei logon no modo de administrador e, portanto, não veria as mensagens.

sgmoore
fonte
1
Tenho a sensação de que tinha algo a ver com o UAC - proteger isso significa que o prompt do UAC não poderia compartilhar uma sessão da estação de trabalho com o usuário interativo ou que um hacker poderia aparecer fingindo ser o prompt do UAC.
precisa
23

Serviços interativos costumavam ser possíveis , mas o modelo de serviço é o de um processo executado independentemente de qualquer usuário. Eles são projetados para serem executados sem supervisão e, portanto, não precisam de uma GUI.

Os serviços interativos não estão disponíveis desde o Windows Vista, portanto, não devem mais ser usados.

Se você precisar interagir com o serviço, a página à qual vinculei recomenda a criação de um aplicativo GUI separado que se comunique com o serviço através de algum tipo de comunicação entre processos (IPC) - por exemplo, pipes nomeados.

ChrisF
fonte
Sua imagem está obsoleta: os serviços não podem interagir diretamente com um usuário no 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.
7/15
10

Porque os serviços devem ser executados em segundo plano sem interagir com o usuário; na verdade, eles podem ser executados enquanto nenhum usuário estiver conectado.

Michael Borgwardt
fonte
então por que esse recurso existia nas versões anteriores? Considerando sua resposta, não haverá comunicação entre o serviço Windows e o aplicativo de desktop. Portanto, essa resposta não pode ser apropriada.
Arun28
3
@ Arun - com base nessa lógica, as coisas quebradas nunca seriam corrigidas. A resposta de Michael está correta - os serviços não devem ter nomenclatura. Só porque as versões anteriores do Windows os possuíam (serviços com guis) não significa que eles deveriam tê-los.
8
@ Arun, não é verdade que não há comunicação entre aplicativos e serviços de desktop, apenas que o serviço em si não possui uma GUI. Em vez disso, um aplicativo de desktop tem a GUI e se comunica com o servidor.
Paul Hiemstra
Portanto, os serviços do Windows podem ter GUI, mas não deveriam?
Arun
1
@Arun, serviços não têm GUIs si, mas muitas vezes são controlados por aplicações front-end separados que podem controlar o serviço comunicando com ele de alguma maneira (via pipes nomeados, soquetes, ...)
GrandmasterB
0

Sim, era possível e funcionou. Quando você efetuou login, obteve a interface do aplicativo. Foi muito útil para aplicativos mais antigos que não têm um serviço disponível, mas ainda precisam ser executados no servidor. Embora não fosse a solução mais estável. Tornou-se executado como o usuário que poderia clicar nele ou sair. Isso não foi muito legal.

Agora, todos desenvolvem serviços nativos e adicionam um aplicativo ou log para gerenciar o serviço. Esse é um bom padrão de design e agora está sendo usado na maioria das vezes.

Então, veja isso como um legado que era possível.

Luc Franken
fonte
-1

Os serviços destinam-se a operações não atendidas, principalmente em segundo plano. O serviço de nome em si significa atuar como um servidor para alguns aplicativos clientes ou outros serviços que consomem esse serviço. Portanto, a Microsoft pode querer agora seguir o básico e fazer uma distinção clara entre serviços e aplicativos. Enquanto o cortador de unhas existe, por que escolher faca de cozinha para cortar nada?

Tony Thomas
fonte