Antes de ser derrubado, sei como agendar uma tarefa, reiniciar um serviço com o PowerShell ou conceder a uma conta que não seja administrador 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 a essa pasta. O serviço funciona bem e faz o seu trabalho.
No entanto, às vezes, há um erro em um dos arquivos que impede o processamento de outros arquivos. Geralmente, leva um tempo para alguém perceber e há alguma reserva.
Então, criei um script de monitoramento no PowerShell que consulta a pasta da rede em busca desses arquivos errados. Se eles forem encontrados, os arquivos serão movidos para uma pasta temporária para revisão e o serviço precisará ser reiniciado.
Dei privilégios à conta de serviço por meio da diretiva de grupo para iniciar e parar o serviço.
Quando faço logon no servidor com a conta de serviço, consigo reiniciar o serviço manualmente usando o MMC de Serviços. Também sou capaz de executar o script do PowerShell e ele faz exatamente o que deve fazer: pesquisar na pasta, mover os arquivos e reiniciar o serviço. Ótimo!
Na próxima fase, criei uma tarefa agendada que é executada a cada 10 minutos. A tarefa usa a mesma conta de serviço que o serviço para executar o script do PowerShell. A caixa "executar com os privilégios mais altos" está marcada. Como eu disse, o script do PowerShell precisa acessar a unidade de rede; portanto, não posso executá-lo como administrador do servidor local e não quero usar credenciais de administrador de domínio para uma tarefa tão servil como essa. (Tento implementar o princípio do mínimo de privilégios o máximo que posso.)
Dei à conta de serviço os direitos "logon como trabalho em lote" no servidor local usando o MMC da Diretiva de Segurança Local.
Agora, 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, a execução manual do script como o mesmo usuário funcionou perfeitamente.
Não vejo muito no visualizador de eventos, mas o logon no meu script indica esse erro:
TerminatingError (Stop-Service): "Não é possível abrir o Service Control Manager no computador '.'. Esta operação pode exigir outros privilégios."
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 a versão 4 do PowerShell em um domínio 2008 R2.)
Atualização: eu tentei definir as permissões de serviço para o usuário usando subinacl (como descrito aqui ) e definir a sequência SDDL manualmente (conforme descrito aqui ), para que meus sinalizadores de controle sejam 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 deles resolveu o problema também. Deve-me ter um problema com privilégios em algum lugar que ainda estou ignorando, porque quando agendar a tarefa com uma conta de domínio que seja um administrador local no servidor, ela funcionará perfeitamente.
Set-Service $($service[1]) -status stopped -ComputerName . -Verbose ....
vez do Stop-Service
CmdLet? Aparentemente, o Stop-Service e o Start-Service não podem ser remotamente controlados de acordo com esta resposta: Não é possível usar Get-Service –ComputerName no computador remoto e sua mensagem de erro pode estar relacionada à tentativa de conexão com um host local "remoto" '.' (<== isso é um ponto aí.) #