Por que o comando powershell “Restart-Service Tomcat6” falha quando executado a partir de uma tarefa agendada?

1

Eu recebo o seguinte erro no histórico da tarefa agendada quando tento executar uma tarefa:

Task Scheduler successfully completed task "\Restart Tomcat" ,
instance "{264b4620-5f3b-6c5f-a6cb-1625a7fa57de}" ,
action "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.EXE"
with return code 1.

A tarefa agendada é configurada da seguinte forma:

  • Nome: Reiniciar o Tomcat
  • Usuário: DOMAIN \ tomcat.restarter
  • Disparadores: Diariamente 2AM ativado
  • Ações: Iniciar um programa :
    • Programa / script: powershell
    • Argumentos: -Command "Restart-Service Tomcat6"

Quando eu inicio um Prompt de Comando como DOMAIN \ tomcat.restarter com:

runas /user:DOMAIN\tomcat.restart cmd

E corra:

powershell -Command "Restart-Service Tomcat6"

Em seguida, echo %errorlevel% imprime 0 e o Tomcat é reiniciado. Isso mostra que o SDDL no serviço Tomcat6 é suficiente para o propósito e que o DOMAIN \ tomcat.restarter pode reiniciá-lo.

Se eu alterar os argumentos da tarefa agendada para -Command "'hello world'" > '%TEMP%\Temp.log' , obtenho return code 0 no Histórico de tarefas e hello world aparece em C:\Users\tomcat.restarter\AppData\Local\Temp\Temp.log . Isso mostra que o direito de usuário Fazer logon como um trabalho em lote é efetivo para DOMAIN \ tomcat.restarter , que pode executar o Powershell e gravar arquivos.

ATUALIZAÇÃO: investigação adicional

Eu criei um restart.bat em D: \ tomcat \ bin e configurei o Program / script para restart.bat , argumentos para > "%TEMP%\Temp.log" 2>&1 e Start in para D:\tomcat\bin .

Listagem de restart.bat:

powershell -Command "Restart-Service Tomcat6"

Eu recebo o seguinte em C:\Users\tomcat.restarter\AppData\Local\Temp\Temp.log Eu recebo o seguinte conteúdo:

D:\tomcat\bin>powershell -Command "Restart-Service Tomcat6" 
Restart-Service : Cannot open Tomcat6 service on computer '.'.
At line:1 char:16
+ Restart-Service <<<<  Tomcat6
    + CategoryInfo          : NotSpecified: (:) [Restart-Service], InvalidOper 
   ationException
    + FullyQualifiedErrorId : System.InvalidOperationException,Microsoft.Power 
   Shell.Commands.RestartServiceCommand

Por que o powershell -Command "Restart-Service Tomcat6" falha quando executado a partir de uma tarefa agendada?

    
por Alain O'Dea 01.10.2012 / 20:18

3 respostas

3

tl; dr

Meu SDDL estava incompleto. Eu precisava adicionar SW (EnumDeps) às permissões LCRPWP já adicionadas no SDDL.

Versão longa

Aqui está a versão (higienizada) do meu SDDL (quebrado):

D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;LCRPWP;;;S-1-1-11-1111111111-1111111111-1111111111-1111)

O problema está nas permissões da última cláusula:

(A;;LCRPWP;;;S-1-1-11-1111111111-1111111111-1111111111-1111)

O SID S-1-1-11-1111111111-1111111111-1111111111-1111 está correto para o grupo DOMAIN \ Tomcat Restarters que DOMAIN \ tomcat .restarter é um membro de. Isso está certo. As permissões concedidas ( LCRPWP ) são insuficientes para Restart-Service .

Para que o cmdlet Restart-Service funcione, ele precisa do direito de Enumerar Serviços Dependentes. No SDDL isso é SW (EnumDeps) na string SDDL. Eu tinha LCRPWP que permite QueryStat, Start e Stop.

O SDDL correto para o Tomcat 6 para mim é:

D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;LCSWRPWP;;;S-1-1-11-1111111111-1111111111-1111111111-1111)

O mistério é por que o Powershell pode executar Restart-Service de um prompt de comando runas, mas não do Agendador de Tarefas.

Eu obtive a revelação necessária lendo os bits @plattered respondendo ao seu próprio problema similar com Restart-Service em link .

    
por 02.10.2012 / 15:21
0

O comando requer elevação? Mesmo se você tiver o UAC desativado, a tarefa agendada precisaria da caixa de seleção para ter privilégios elevados.

    
por 01.10.2012 / 20:40
0

Eu adicionaria isso como um comentário, mas o tratamento do código é horrível:

Você pode adicionar algumas linhas para capturar mais algumas informações, por favor?

$1 = Get-Service *tomcat*
Restart-Service $1
$1 >log.log
$error >>log.log
O erro

$ deve gerar todas as informações de erro que foram geradas nesta sessão.

$ 1 apenas mostrará o que encontrar quando pesquisar o serviço Tomcat. apenas no caso de não poder ver por qualquer motivo.

    
por 02.10.2012 / 15:30