Iniciar o programa na inicialização do computador quando ninguém estiver conectado e mostrar a janela quando alguém fizer logon (SO: Windows)

19

Eu tenho um programa que é iniciado na inicialização do sistema usando o Agendador de tarefas no Windows Server 2012. O programa deve ser iniciado mesmo se o computador reiniciar automaticamente.

Administrador é a conta usada para iniciar o programa, a opção "Executar se o usuário está conectado ou não" está marcada para a tarefa.

O problema é que, quando alguém finalmente faz logon como administrador usando a Conexão de área de trabalho remota, a interface (janela do programa) fica oculta.

Pelo que entendi, não há como resolver isso usando o Agendador de tarefas.

Como posso resolver isso?

Deve ser um problema bastante comum, mas não consigo encontrar nada pesquisando na rede. Estou bastante surpreso que a Microsoft permita tal limitação em seu agendador. Posso criar um VBScript ou algo que seja executado na inicialização e inicie o programa que ficará visível quando o usuário fizer logon?

Outras idéias?

(Eu não quero ter que criar um programa separado apenas da GUI que se conecte ao programa original a propósito. Também preferiria que não precisasse finalizar o programa já em execução no logon do usuário e iniciar isso de novo.)

Marcus
fonte
2
Firedaemon, instale o aplicativo como um serviço, quando RDPed mudar para "Sessão 0" usando o Firedaemon. Veja o aplicativo.
TheCleaner
Tecnicamente, isso pode ser feito se você desenvolver seu próprio serviço.
Ryan Ries
1
Acabei de responder minha própria pergunta. No entanto, não posso aceitar minha própria resposta por dois dias, porque o sistema aqui em serverfault.com é extremamente ruim (a maioria das pessoas agora abandonaria esta página sem esperar dois dias e deixaria a pergunta para sempre marcada como não resolvida).
Marcus
2
@ Marcus: Os limites de quem pode fazer o que e quando se destinam a impedir certos abusos. Infelizmente, às vezes causam transtornos por tentativas genuínas de fazer as coisas direito, mas às vezes esses compromissos precisam ser feitos. Se você tiver uma sugestão que possa melhorar a situação (protegendo o site pelo menos também, mas incomodando menos os usuários genuínos), seria uma idéia melhor aumentar o pensamento por meio de um site "meta" relevante ( meta.serverfault.com , meta. stackoverflow.com ) em vez de reclamar em um comentário que os corredores do site dificilmente verão.
precisa
Como você pode ver na votação, a resposta que você deseja aceitar não é a que as pessoas aprovam, porque a maneira como você está tentando fazer isso é errada para começar.
precisa saber é o seguinte

Respostas:

28

Descobri como fazer isso sozinho. É uma solução alternativa, mas é o que eu esperava obter.

Pare! Não encolha ainda. Leia...

  • Execute-o, configure-o para que o Administrador faça logon automaticamente.

  • Crie uma tarefa no Agendador de tarefas. Configure-o para executar apenas quando o usuário (Administrador) estiver conectado. O gatilho está "no logon" e especifica que é apenas quando o administrador faz logon.

  • Crie uma segunda tarefa. Executar apenas quando o usuário estiver conectado, acionar no logon do administrador. A ação deve ser "iniciar um programa" e o programa é "C: \ Windows \ System32 \ rundll32.exe" com o campo de argumento definido como "user32.dll, LockWorkStation".

O que acontece agora se você reiniciar o computador é que o Administrador faz logon automaticamente, o programa que você deseja iniciar é iniciado e a estação de trabalho fica bloqueada. Se eu fizer login via Conexão de Área de Trabalho Remota, posso ver a janela do programa e usar a GUI. Posso bloquear / desbloquear o computador sem problemas e desconectar / reconectar como quiser. Não há problema se eu for ao servidor e efetuar login na estação de trabalho real. Como o Administrador já está conectado, a tarefa não será executada novamente (ela não cria um loop infinito de log-in-lock-lock, do qual você não pode sair).

Simples assim. Concedido que existe um período de um segundo antes que o computador seja bloqueado após o login automático e acho que um hacker profissional com acesso físico ao computador poderia fazer algo furtivo durante essa janela de tempo, mas no meu caso, posso ignorar esse risco de segurança. Desde que eu não permita que hackers profissionais entrem em minha casa e mostre a eles o computador, o sistema deve ser relativamente seguro. Acima de tudo, não há tanto valor no computador que precise de proteção contra super-cofre, por isso estou muito feliz com esta solução.

Marcus
fonte
7
Sem desrespeito (ou voto negativo), Marcus. Mas se esse é realmente o tipo de resposta que você estava procurando, essa pergunta teria sido mais apropriada para o SuperUser .
Ryan Bolger
2
Não foi fácil decidir em qual troca de pilhas publicar isso.
Marcus
Olá Marcus, segui sua resposta, mas tenho um problema ao iniciar dois programas com GUI em vez de apenas um. Eu postei uma pergunta em SuperUser. Se você poderia respondê-la lá vai ser uma grande ajuda - superuser.com/questions/902386/...
user2162550
1
Na verdade, isso também diminuiu o voto agora, porque NÃO é uma resposta para a pergunta. A pergunta define explicitamente o meio-dia sendo logado - e sua "solução" aqui faz um login automático (para que alguém esteja logado). Talvez não seja um fomento inteligente na questão, mas a questão é como é.
TomTom
1
@TomTom Como uma opção apresentada a um usuário final "Executar se o usuário está logado ou não" certamente poderia significar "Você não precisará estar aqui para tomar conta para garantir que ele comece".
Aryeh Leib Taurog
16

Eu tenho um programa que é iniciado na inicialização do sistema usando o Agendador de tarefas no Windows Server 2012. O programa deve ser iniciado mesmo se o computador reiniciar automaticamente.

Então, por que você não o torna um serviço do sistema, como as especificações do Windows definem?

Como posso resolver isso?

Você não pode. Os programas em segundo plano não devem interagir com a interface do usuário. Ou: a interface do usuário deve executar seu próprio programa que se conecta ao serviço. A interface do usuário em execução no espaço do usuário conectado faz a apresentação, o serviço Windows faz o processamento. É assim que o modelo é projetado por talvez 15 anos ou mais.

Estou bastante surpreso que a Microsoft permita tal limitação em seu agendador.

Fico mais surpreso por você nunca ter perguntado o porquê.

Existem vários problemas:

  • Quando várias pessoas estão conectadas, quem recebe a interface do usuário?
  • Quando o usuário efetua logout, você mata o programa? OUCH.
  • Segurança. O programa em segundo plano pode ser executado sob direitos limitados - expor a interface do usuário ao usuário significa que ele pode executar o código lá. O modelo de mensagens do Windows está cheio de problemas.

Eu não quero ter que criar um programa separado apenas por GUI que se conecte ao programa original a propósito.

Nem eu nem a Microsoft se preocupam com o que você gosta de fazer. Existe um modelo estabelecido e suportado para vincular o processamento em segundo plano a uma interface de usuário conectada - use-o ou não. Mas quando não, não reclame dos problemas de segurança que você coloca.

TomTom
fonte
3
Um homem. Desejo que mais fornecedores de aplicativos compreendam esse conceito.
Ryan Bolger
15
Uau, você não é esnobe na sua atitude. Bem, acho que estou sem sorte. A menos que você esteja mal informado e alguém tenha uma maneira de resolver isso, todo mundo não pode saber tudo, então você pode estar errado com a parte absoluta "você não pode" da sua postagem. Gostaria de deixar a pergunta em aberto para obter mais respostas por mais algum tempo, caso alguém tenha uma solução alternativa incomum para compartilhar. Senão eu aceitarei sua resposta.
Marcus
Atualmente, é cada vez mais difícil oferecer uma interface do usuário a um serviço nas versões atuais do Windows, mas não impossível.
MDMoore313
Não é procurado ativamente devido principalmente a preocupações de segurança. O principal problema aqui é esse - e você realmente precisa entender isso - se você mostrar uma janela na minha interface do usuário, eu posso executar o código no seu processo. Posso enviar mensagens do Windows e isso tem MUITO material que pode ser explorado. Normalmente não é um problema - porque, se for um aplicativo de usuário, só posso fazer as coisas que eu como usuário ... mas se o serviço tiver privilégios mais altos, aqui está o pesadelo da segurança. É por isso que isso foi encerrado há muitos anos e todos que aprenderam a programar e ler a documentação deveriam ter lido sobre isso
TomTom
1
Se você realmente deseja ir para lá, tente as etapas em coretechnologies.com/WindowsServices/FAQ.html#GUIServices - não tenho certeza de que ainda funcionam nas janelas atuais, mas existem maneiras de tornar a interface do usuário acessível - e abra todos os problemas de segurança .
TomTom
0

É tudo sobre o Sessionqual o seu programa é executado. Se ninguém está logado, não há uma sessão interativa para exibir, acredito que ele é executado sob Session 0, que tem uma interface estranha que não aparece como as outras.

Agora, se o seu programa detectar quando é explorer.exeiniciado (ou alguma outra maneira de detectar o logon do usuário) e se remodelar magicamente ou gerar algum processo filho no novo ID da sessão, qualquer pessoa que fizer login verá com satisfação o que você está fazendo.

MDMoore313
fonte