[Dúvida] Problema para executar scripts powershell em um serviço windows
Contexto
Atualmente estou desenvolvendo em meu trabalho um software para um empresa de TI, que gerencia vários servidores e vm's, então eles precisam executar várias rotinas nessas máquinas, rotinas essas que são executadas por scripts PowerShell. A ideia inicial era uma aplicação Windows que se comunicava com um portal web, onde eram cadastradas as rotinas e scripts que deveriam ser executadas, então a aplicação puxava esses dados do portal, agendava as rotinas e executava os scripts no momento que deveriam. Após alguns testes foi decidido criar além da aplicação um serviço do windows que seria responsável pela atualização automática da aplicação, mas além disso, foi solicitado que este serviço também ficasse responsável por toda a parte de agendamento e execução dos scripts.
Problema
E é nesse momento que eu estou e que me encontro com um problema, consegui transformar tudo em serviço e fazer a atualização, porém na parte dos scripts, o serviço simplesmente não executa certos scripts por questões de privilégios, simplesmente ignora. Já estou a uma semana pesquisando possíveis soluções e não encontrei, já tentei com scripts assinados, configurei a aba logon
do serviço, porém sem solução. Estou desenvolvendo o serviço com C#, já tentei usando a classe Proccess
e também algumas libs específicas para execução de PowerShell com VS2022. Preciso saber se existe essa possibilidade ou não tem jeito de fazer mesmo. Qualquer contribuição a esse post será bem vinda.
Que conta você está usando? Que privilégios ela tem?
Uma coisa confusa tanto no Windows quanto Linux e permissão de acesso.
Por exemplo, certo tempo eu descobri que a conta administrador pode não ser uma conta administrador, você tem que ativar. Não sei se isso já mudou.
Ativar
net user administrador /active:yes
Definir senha
net user administrador *
Desativar
net user administrador /active:no
Outras gambiarras Insira o trecho de código abaixo antes do seu script bat
@echo off
:: BatchGotAdmin (Run as Admin code starts)
REM --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
echo Requesting administrative privileges...
goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
exit /B
:gotAdmin
if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
pushd "%CD%"
CD /D "%~dp0"
:: BatchGotAdmin (Run as Admin code ends)
@echo off
:: Article: http://www.techgainer.com/create-batch-file-automatically-run-administrator
:: Your code starts from here
Echo Hello world!
pause
Uma vez tentei rodar um Powershell, veio essa porcaria de não ter permissão. Fiz um .bat chamar, aí rodou.
Nível de administrador para programas
1) Crie um atalho na area de trabalho para o executavel
2) Vá na propreidade do atalho e adicione a seguinte linha de comando:
runas /user:<nome_do administrador> /savecred <diretorio_programa.exe>
3) Na primeira execução do programa ele ira solicitar a senha do administrador e não ira te pertubar mais.
Exemplos
runas /user:administrador /savecred "c:\windows\programa.exe"
runas.exe /user:Wellington /savecred "G:\BKP_JOGOS\Super Nintendo\Emulador Snes9x\snes9x.exe"
Procure também por Nível de administrador local para um usuário de domínio