O programa não é executado adequadamente como tarefa agendada

11

Situação

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

Esta tarefa deve ser executada de hora em 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 por meio do script .bat , nem ao chamar o .exe diretamente), mas eu não recebo mensagens de aviso ou de erro nos logs .

Configuração

A tarefa é configurada para ser executada como uma conta de serviço do Windows que possui todos os privilégios definidos corretamente. Ao usar essa conta para fazer logon via RDP, posso executar o .bat e o .exe diretamente sem problemas, mas ainda assim a tarefa parece não fazer nada. Isso é facilmente observado porque o programa sempre modifica um arquivo, e o registro de data e hora modificado no não muda através da tarefa.

Nos logs de tarefas agendadas eu recebo as mensagens de informação para a tarefa iniciando um processo, saindo, etc. O "código de resultado", no entanto, é 111 (tentei o Google sem sorte, a única associação que obtive é "nome do arquivo é muito longo", que é apenas completamente irrelevante AFAIK). 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.

Eu 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 no qual a tarefa é executada (via RDP), nenhuma janela é exibida quando inicio a tarefa agendada.

Edite sobre a GUI

Eu construí 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 "executar se o usuário está conectado ou não", e a opção run with highest privileges 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, por favor me avise nos comentários.

    
por MarioDS 29.09.2014 / 10:21

8 respostas

1

Os caras da empresa que gerencia os servidores de nossos clientes disseram que um programa 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 configuraram isso e parece funcionar.

Desculpe-me por não ter tido a oportunidade de avaliar mais sugestões aqui, mas obrigado por tentar ajudar de qualquer maneira. Espero que possa ajudar os outros no futuro, o que eu acho que certamente irá ajudar.

    
por 12.10.2014 / 18:19
6

Acredito que seu problema tenha a ver com as permissões da conta que está sendo usada para executar a tarefa ou com o contexto da conta existente ao tentar executar a tarefa.

Teste para o requisito de sessão de console

É possível que seu .EXE seja executado em Console session (também conhecida como Sessão 0) no computador. Para testar isso:

  1. Configure a tarefa para Executar somente quando o usuário estiver conectado e especifique um tempo 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, seja fisicamente no console ou usando um programa de acesso remoto que dá acesso ao console. Para confirmar está usando a sessão do console, em uma execução do Prompt de Comando QWINSTA , observe a coluna SESSIONNAME e confirme se o indicador > está ao lado de console , em outras palavras, deve aparecer como >console )
  3. Aguarde a execução da tarefa

Se a tarefa for executada corretamente, tente agendar a tarefa com SCHTASKS.EXE usando o parâmetro /IT . 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 do 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 Fazer logon como trabalho em lote (localizado 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 privilégios mais altos
  3. Confirme se o usuário tem permissões completas de NTFS para todas as pastas & arquivos com os quais ele deve interagir. Não faça suposições; em vez disso, confirme navegando para esses locais de arquivo e usando a guia Effective Permissions nas Propriedades do arquivo / pasta em Security > Advanced

Coisas adicionais para verificar / experimentar

  • A tarefa requer acesso para acessar recursos da rede? Coisas como unidades mapeadas podem estar presentes quando você efetua logon com a conta de usuário, mas dependendo da configuração do servidor pode não estar presente no contexto da conta de usuário quando executado no Agendador de Tarefas.
  • Adicione um pouco de log ao seu arquivo de lote. Depois que 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 .EXE com START , por exemplo, START "myTitle" "C:\full\path\to\my.EXE"

por 09.10.2014 / 17:29
2

Estou respondendo a um post antigo no caso de ajudar alguém. Eu tive o mesmo problema. O log de eventos disse que o programa foi concluído normalmente, mas nem 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 correu bem a partir da 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ê informar ao trabalho agendado para iniciar no mesmo diretório do EXE, poderá obter resultados favoráveis. Foi a solução para mim.

    
por 26.06.2015 / 06:40
1

talvez isso ajude você?

link

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

Eu sei que esta 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 este trabalho você tem que verificar se o usuário está realmente logado o tempo todo ...)

    
por 07.10.2014 / 15:06
1

Eu estava tentando iniciar e o antigo programa VB6 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 a partir do agendador de tarefas. Descobri que quando os arquivos de configuração para o aplicativo, que foram armazenados na pasta de aplicativos no diretório C: \ Arquivos de Programas (x86), foram copiados para a pasta de aplicativos em c: \ programdata. o agendador funcionou. parece que o cmd.exe aplica a configuração de um local diferente ao utilizado pelo agendador de tarefas. Se o seu aplicativo tiver arquivos de configuração, você pode tentar movê-los para a pasta c: \ programdata \ application.

    
por 02.11.2015 / 21:58
0

Você está referenciando quaisquer unidades de rede mapeadas em seu script ou programa? Eu tive um problema semelhante há algum tempo, onde minha tarefa agendada não seria executada, e não conseguia descobrir por quê. Mudar o (s) caminho (s) para os caminhos UNC resolveu isso para mim.

Alterar T:\Apps\MyProgram.exe para \MyServer\MyShare\Apps\MyProgram.exe

    
por 09.10.2014 / 16:50
0

When I configure the task to say "run whether the user is logged on or not", and the run with highest privileges option is unchecked, the error value is 2147943859.

2147943859 convertido para Hex é 800705b3 que uma rápida visita ao Google me diz "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 uma maneira de fazer isso funcionar interativamente sem usar o PSEXEC (da Sysinternals), mas como eu já sei como fazer isso via PSEXEC, é o que eu usaria.

PSExec: link

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

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

c:\windows\system32\cmd.exe

e depois os parâmetros:

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

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

    
por 09.10.2014 / 22:04
0

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

link

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

Eu li tudo isso por um bom tempo antes de resolver o problema acima. (Qual foi o meu próprio problema levando à mesma pergunta do OP).

Uma vez que você (finalmente!) saiba disso, é muito fácil testá-lo (conforme a resposta do stackoverflow), vê-lo acontecendo e contornar isso ...

    
por 16.09.2015 / 17:39