O programa não é executado corretamente como tarefa agendada

12

Situação

Eu tenho um script em lote que prepara alguns arquivos, executa um programa ( .exe) e exclui os arquivos.

Essa tarefa deve ser executada a cada hora, por isso estou tentando configurar isso usando Tarefas agendadas. O problema é que o programa mencionado anteriormente não é executado corretamente quando chamado da tarefa (nem pelo .batscript nem ao chamar .exediretamente), mas não recebo nenhuma mensagem de aviso ou erro nos logs.

Configuração

A tarefa está configurada para ser executada como uma Conta de Serviço do Windows com todos os privilégios definidos corretamente. Ao usar esta conta para efetuar logon via RDP, posso executar o .bate .exediretamente sem problemas, mas ainda assim a tarefa parece não fazer nada. Isso é facilmente observado porque o programa sempre modifica um arquivo e o carimbo de data / hora modificado não muda na tarefa.

Nos logs de tarefas agendadas, recebo as mensagens informativas da tarefa iniciando um processo, saindo, etc. O "código de resultado", no entanto, é 111(tentei pesquisar no Google sem sorte, a única associação que recebo é "nome do arquivo é muito longo ", que é um AFAIK completamente irrelevante). Nos logs do aplicativo, não recebo absolutamente nada.

O que eu suspeito é o problema

O programa é uma monstruosidade antiga que gera algum tipo de tela inicial (na verdade é uma janela normal), mesmo que a GUI não seja necessária porque não requer interação e se fecha após as operações. A janela aparece por cerca de 2 segundos.

Suspeito que esse requisito para uma GUI tenha algo a ver com a falha da tarefa, mas não tenho certeza. Quando efetuo login com o usuário sob o qual a tarefa é executada (via RDP), nenhuma janela aparece quando inicio a tarefa agendada.


Edite sobre a GUI

Eu criei um executável C # muito pequeno que inicia o programa sem a janela principal (usando ProcessStartInfo.WindowStyle = ProcessWindowStyle.Hidden). Mesmo assim, a tarefa agendada ainda não consegue iniciar o programa corretamente, mas o código de retorno é agora 0.


Atualizar

Quando configuro a tarefa para dizer "execute se o usuário está conectado ou não" e a run with highest privilegesopção está desmarcada , o valor do erro é 2147943859.


O que posso fazer para solucionar problemas?

SO = Windows Server 2008 R2 SP1

Se mais informações forem necessárias, entre em contato nos comentários.

MarioDS
fonte
Seu script e "programa" recebem alguma entrada, como opções ou parâmetros? Você já tentou usar o PowerShell em vez de lote? Ao iniciar um .exe"programa" com parâmetros de dentro de um script, a entrada deve ser fornecida adequadamente como argumento.
slybloty
1
Você já tentou o agendador com um programa diferente? Apenas substitua o programa por outro e veja quais resultados você obtém.
slybloty
2
@ out-null Eu não acho que o agendador de tarefas use a janela para saber quando o programa terminou de executar, ele deve esperar pelo processo, o que quer que faça com o Windows. Mas se o programa tentar procurar algo específico para criar sua tela inicial (digamos a barra de tarefas) e não conseguir encontrá-lo (porque é executado em uma estação de desktop / janela separada), pode ser que pare ...
Ale
1
ESTÁ BEM. Você já tentou executá-lo na conta LocalSystem? Além disso, você tentou monitorar o evento de inicialização do processo com o Process Monitor da Sysinternals?
Lucky Luke
1
@BradBouchard Mesmo que sua resposta possa não resolver a questão dos OPs neste caso específico, é uma resposta válida e pode ser útil para futuros visitantes do SF, e, portanto, encorajo você a não excluí-lo.
Eu digo Reinstate Monica

Respostas:

6

Acredito que seu problema esteja relacionado às permissões da conta que está sendo usada para executar a tarefa ou ao contexto da conta existente ao tentar executar a tarefa.

Teste para requisito de sessão do console

É possível que o .EXE precise ser executado na Consolesessão (também conhecida como Sessão 0) no computador. Para testar isso:

  1. Configure a tarefa para Executar apenas quando o usuário estiver conectado e especifique uma hora de início da tarefa de 2 minutos no futuro
  2. Faça logon na máquina com a mesma conta de usuário usada para executar a tarefa (de preferência faça logon na sessão do console, estando fisicamente no console ou usando um programa de acesso remoto que dê acesso ao console. sessão do console, em uma execução do Prompt de Comando QWINSTA, observe a SESSIONNAMEcoluna e confirme se o >indicador está próximo a console, ou seja, deve aparecer como >console)
  3. Aguarde a execução da tarefa

Se a tarefa for executada corretamente, tente agendá-la SCHTASKS.EXEusando o /ITparâmetro Caso contrário, você pode não ter outra opção a não ser configurar o computador para fazer logon automaticamente como sua conta de usuário de serviço e executar a tarefa como um programa de inicialização.

Verificar permissões

Além disso, como já sugeri, verifique o seguinte para confirmar se a conta usada para executar a tarefa está devidamente autorizada:

  1. Conceda à conta o direito de usuário de Logon como um trabalho em lotes (encontrado na Diretiva de Grupo Local em Computer Configuration/Windows Settings/Security Settings/Local Policies/User Rights Assignments)
  2. Confirme se a tarefa está configurada para Executar com os privilégios mais altos
  3. Confirme se o usuário tem permissões NTFS completas para todas as pastas e arquivos com os quais ele deve interagir. Não faça suposições; em vez disso, confirme navegando para esses locais de arquivos e usando a Effective Permissionsguia em Propriedades do arquivo / pasta emSecurity > Advanced

Itens adicionais a serem verificados / experimentados

  • A tarefa requer acesso para acessar os recursos de rede? Coisas como unidades mapeadas podem estar presentes quando você faz logon com a conta de usuário, mas dependendo da configuração do servidor pode não estar presente no contexto da conta do usuário quando executado no Agendador de Tarefas.
  • Adicione algum log ao seu arquivo em lotes. Depois de cada linha executada, faça com que ela grave alguma saída em um arquivo de log para que você saiba onde está ficando preso. Por exemplo:

    @echo off
    echo Line 1 >> "C:\MyLog.txt"
    "C:\My Folder\myOldProgram.exe"
    echo Line 2 >> "C:\MyLog.txt"
    DEL somefile.dat
    echo Line 3 >> "C:\MyLog.txt"
    
  • Tente executar o arquivo .exe com START, por exemploSTART "myTitle" "C:\full\path\to\my.EXE"

Eu digo Restabelecer Monica
fonte
2

Estou respondendo a uma postagem antiga, caso isso ajude outra pessoa. Eu tive o mesmo problema. O log de eventos dizia que o programa era concluído normalmente, mas nem mesmo a primeira linha de código gravaria no log para mim. Acabou sendo a opção "Iniciar em" no Agendador de tarefas. Ocorreu-me que o programa funcionava bem na linha de comando quando eu estava no diretório atual. Existem arquivos de manifesto e outras dependências no mesmo diretório. Portanto, se você solicitar que o trabalho agendado inicie no mesmo diretório que o EXE, poderá obter resultados favoráveis. Foi a solução para mim.

Rob Wilson
fonte
Esta foi a solução para executar um aplicativo de console personalizado desenvolvido no Visual Studio com suporte a arquivos de configuração.
billfredtom
1

talvez isso ajude você?

/programming/6939548/a-workaround-for-the-fact-that-a-scheduled-task-in-windows-requires-a-user-to-be

Tivemos um problema semelhante e sua única solução foi criar uma conta especial no servidor com o logon automático. Portanto, se a tarefa foi executada no usuário já conectado, nosso .exe funcionou bem ...

Eu sei que essa não é uma solução muito boa, mas para nós foi a única coisa que funcionou. Eu não sei se isso funciona para você ... (Mas, com essa solução, você deve verificar se o usuário está realmente conectado o tempo todo ...)

frupfrup
fonte
A tarefa nem é executada corretamente para mim quando o usuário sob o qual está efetivamente conectado (via RDP). Eu uso a conta de serviço para fazer logon no RDP, iniciar a tarefa manualmente e não vejo uma janela aparecer.
MarioDS
2
Você desmarcou a opção "executar com mais privilégios"? Eu acho que quando você marcar essa opção, ocorrerá um evelation de direitos (UAC) e você não verá uma janela mesmo quando o usuário estiver logado (será chamado em uma sessão separada sem janela e falhará). Tente também selecionar a opção "configurado para" -> "Windows Server 2003, Windows XP ou Windows 2000".
Frupfrup # 7/14
Isso parece não fazer diferença, exceto quando agora defino "executar se o usuário está conectado ou não", recebo o código de erro 2147943859. Só posso definir "Configurado para" para um Windows Vista/Windows Server 2008ou outro Windows 7/Windows Server 2008 R2. Parece não fazer diferença.
MarioDS
Está bem. um último teste: crie uma nova tarefa com "criar nova tarefa" em vez de "criar tarefa fácil" (não sei qual texto é realmente exibido - meus servidores são alemães - mas espero que você saiba o que quero dizer.) e depois Eu acho que você pode selecionar "Windows Server 2003, ...". e, em seguida, pls tentar mais uma vez com as outras opções ...
frupfrup
1

Os funcionários da empresa que administra os servidores de nossos clientes disseram que um programa de GUI não seria executado por meio de tarefas agendadas de forma alguma.

Eles usam um sistema de monitoramento que também possui recursos de agendamento de tarefas. Eles definiram isso através disso e parece funcionar.

Lamento não ter tido a oportunidade de avaliar mais sugestões aqui, mas obrigado por tentar ajudar de qualquer maneira. Espero que ajude outras pessoas no futuro, o que acho que certamente ajudará.

MarioDS
fonte
1

Eu estava tentando iniciar um programa VB6 antigo usando o agendador de tarefas em um servidor Windows 2008 R2. O aplicativo seria executado a partir do exe, via arquivo em lotes ou clicando em um atalho, mas não seria executado no agendador de tarefas. Descobri que quando os arquivos de configuração do aplicativo, armazenados na pasta de aplicativos no diretório C: \ Arquivos de Programas (x86), foram copiados para a pasta do aplicativo em c: \ programdata. o agendador trabalhou. parece que o cmd.exe aplica a configuração de um local diferente daquele usado pelo agendador de tarefas. Se o seu aplicativo tiver arquivos de configuração, tente movê-los para a pasta c: \ programdata \ application.

Kasa
fonte
0

Você está fazendo referência a alguma unidade de rede mapeada em seu script ou programa? Há algum tempo, tive um problema semelhante em que minha tarefa agendada não era executada e não conseguia descobrir o porquê. Alterar o (s) caminho (s) para UNC resolveu isso para mim.

Mude T:\Apps\MyProgram.exepara\\MyServer\MyShare\Apps\MyProgram.exe

AdamsTips
fonte
Não, o programa está na C:unidade local .
MarioDS 10/10
0

Quando configuro a tarefa para dizer "execute se o usuário está conectado ou não" e a opção de execução com mais privilégios estiver desmarcada, o valor do erro é 2147943859.

2147943859 convertido em Hex é 800705b3, que uma rápida viagem ao Google indica: "Não foi possível iniciar o programa de instalação no computador. Esta operação requer uma estação de janela interativa".

Agora, pode haver alguma maneira de fazê-lo funcionar interativamente sem usar o PSEXEC (da Sysinternals), mas como eu já sei como fazê-lo via PSEXEC, é isso que eu usaria.

PSExec: http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx

Portanto, altere sua ação para acrescentar tudo com psexec.exe -i (e -h se você precisar dele elevado) e deve funcionar.

Eu tentei isso no Windows Server 2008 R2 SP1 com o seguinte na minha 'ação':

c:\windows\system32\cmd.exe

e então os parâmetros:

/c psexec.exe -h -i notepad.exe

Quando executo a tarefa manualmente (já que não tenho agendamento), recebo um bloco de notas elevado em execução na minha sessão atual.

Mark Allen
fonte
0

Talvez a resposta a esta pergunta ajude alguém a ler este tópico?

/programming/32589381/

Resumo: as Tarefas agendadas do Windows 2012 não veem as variáveis ​​de ambiente corretas, incluindo PATHa conta na qual a tarefa está definida para execução.

Eu li tudo isso por um longo tempo antes de descobrir o que foi dito acima. (Qual foi o meu próprio problema, levando à mesma pergunta do OP.)

Depois que você (finalmente!) Sabe disso, é bastante fácil testá-lo (como na resposta do stackoverflow), ver isso acontecendo e contornar isso ....

Mike Beaton
fonte