Reinício agendado de um serviço com powerhshell como conta de serviço não administrativa

11

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.

    
por VolrathTheFallen 29.12.2016 / 14:10

1 resposta

4

A pergunta para outra pergunta resolveu meu problema também.

Os passos que fiz foram:

  1. enable-psremoting no servidor em um prompt do powershell admin
  2. Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI no servidor em um prompt do powershell admin
  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 do SDDL
  6. Adicione (A;;KA;;;SID_OF_USER_OR_SECURITY_GROUP) ao SDDL antes do S: parte
  7. sc sdset scmanager THE_MODIFIED_SDDL mine 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. Altere meu script do powershell para usar o Start-Service CmdLet em vez de Set-Service (o Set-Service não funcionou).

Parece que algo simples acabou, muito mais complicado do que deveria ...

    
por 30.12.2016 / 13:08