Reinicialização agendada de um serviço com powerhshell como conta de serviço não administrador

11

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.

insira a descrição da imagem aqui

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.

VolrathTheFallen
fonte
Isso pode ser de alguma ajuda serverfault.com/questions/357424/... parece PowerShell é muito exigente sobre permissões e não os óbvios
Drifter104
@ Drifter104: Mesmo que eu use o GPO para definir as permissões no serviço, não subinacl, tentei mesmo assim com os parâmetros STOE, mas ainda assim obtive o mesmo resultado. Verifiquei minhas configurações de GPO e elas também têm a opção Enumerar serviços dependentes.
VolrathTheFallen
@ MyronSemack-msemack Tentei definir a sequência SDDL para o serviço manualmente, como descrito no artigo, mas ainda sem sorte, acho que, em última análise, um GPO e um subinacl fazem a mesma coisa, pois parecem substituir um e outro.
VolrathTheFallen
1
Que tal tentar em Set-Service $($service[1]) -status stopped -ComputerName . -Verbose ....vez do Stop-ServiceCmdLet? 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í.) #
31009 John aka hot2use

Respostas:

3

A resposta a outra pergunta também resolveu o meu problema.

Os passos que eu fiz foram:

  1. enable-psremoting no servidor em um prompt do PowerShell de administrador
  2. Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI no servidor em um prompt do PowerShell de administrador
  3. Adicionada a conta de serviço (ou grupo de segurança) com privilégios totais
  4. sc sdshow scmanager no servidor em um prompt de comando admin
  5. Copie a saída SDDL
  6. Adicione (A;;KA;;;SID_OF_USER_OR_SECURITY_GROUP)ao SDDL antes da parte S:
  7. sc sdset scmanager THE_MODIFIED_SDDL o meu ficou assim: sc sdset scmanager D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)(A;;CC;;;AC)(A;;KA;;;S-1-X-XX-XXXXXXXXXX-XXXXXXXX-XXXXXXXXX-XXXX)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)
  8. Alterar meu script do PowerShell para que ele use o Start-ServiceCmdLet em vez de Set-Service(Set-Service não funcionou).

Parece que algo simples acabou, MUITO mais complicado do que deveria ter sido ...

VolrathTheFallen
fonte