Antes de ser abatido, sei como agendar uma tarefa, reiniciar um serviço com o powershell ou conceder a uma conta não administrativa os privilégios para reiniciar um serviço. Esse não é o problema. O problema, no entanto, é a combinação de todas essas três tarefas combinadas.
Eu tenho um serviço do Windows que precisa processar arquivos em uma pasta de rede. Portanto, ele faz logon com uma "conta de serviço" que, na verdade, é apenas uma conta de domínio comum. Esta conta de domínio não é um administrador, mas possui direitos de acesso à referida pasta. O serviço funciona bem e faz o seu trabalho.
No entanto, às vezes, há um erro em um dos arquivos que impede que outros arquivos sejam processados. Normalmente, demora um pouco para alguém perceber e há um atraso.
Então, criei um script de monitoramento no PowerShell que pesquisa a pasta de rede para esses arquivos errados. Se forem encontrados, os arquivos serão movidos para uma pasta temporária para revisão e o serviço precisará ser reiniciado.
Eu dei privilégios à conta de serviço por meio da diretiva de grupo para iniciar e parar o serviço.
Quandofaçologonnoservidorcomacontadeserviço,possoreiniciaroserviçomanualmenteusandooMMCdeServiços.Eutambémsoucapazdeexecutaroscriptpowershelleelefazexatamenteoquedevefazer:pesquisarapasta,moverosarquivosereiniciaroserviço.Ótimo!
Nafaseseguinte,crieiumatarefaagendadaqueéexecutadaacada10minutos.AtarefausaamesmacontadeserviçoqueoserviçoparaexecutaroscriptdoPowerShell.Acaixa"executar com os privilégios mais altos" está marcada. Como eu disse, o script powershell precisa de acesso à unidade de rede, por isso não posso executá-lo como o administrador do servidor local e não quero usar credenciais de administrador de domínio para uma tarefa tão simples como essa. (Eu tento implementar o princípio do menor privilégio o máximo que posso.)
Eu dei à conta de serviço os direitos de "logon como tarefa em lote" no servidor local usando o MMC da Diretiva de Segurança Local.
Agora, para a parte que não consigo descobrir: No horário agendado, as tarefas agendadas são concluídas com êxito e o script do PowerShell está sendo executado. O script pesquisa a pasta e os arquivos de erro são movidos. A única coisa que não funciona é reiniciar o serviço ...?! Novamente, executar o script manualmente como o mesmo usuário funcionou perfeitamente.
Não vejo muito no visualizador de eventos, mas o registro no meu script informa esse erro:
TerminatingError(Stop-Service): "Cannot open Service Control Manager on computer '.'. This operation might require other privileges."
Os comandos que eu uso para reiniciar o serviço são:
Stop-Service -Verbose -DisplayName $($service[1])
...
Start-Service -Verbose -DisplayName $($service[1])
(Estou usando o Windows Server 2012 R2 e o PowerShell versão 4 em um domínio 2008 R2.)
Atualização:
Eu tentei configurar as permissões de serviço para o usuário usando subinacl (conforme descrito aqui ) e definindo a string SDDL manualmente (conforme descrito aqui ), assim minhas flags de controle ficam assim (A ;; CCLCSWRPWPDTLOCRRC ;;; S-1-X-XX-XXXXXXXXXX-XXXXXXXX-XXXXXXXXX-XXXX). Também tentei definir os privilégios no serviço como Controle total no GPO. Nenhum destes resolveu o problema também. Deve ser um problema com privilégios em algum lugar que ainda estou negligenciando, porque quando eu agendo a tarefa com uma conta de domínio que é um administrador local no servidor, funciona muito bem.