Esses dias eu precisei montar um script de “unattended uninstallation” para fazer a desinstalação automática do antivírus McAfee LiveSafe para em seguida colocar os programas homologados por aqui no meu trampo.
Minha surpresa depois de revirar os sites na Internet, foi descobrir que o McAfee LiveSafe não possui desinstalador automático do aplicativo.
Em outras palavras, eu teria que abrir mais de 100 máquinas, entrar no Windows, abrir o painel de controle, ir em programas e recursos, clicar no ícone do McAfee LiveSafe, abrir a tela de desinstalação, e ir manualmente clicando nos devidos botões até conseguir desinstalar o aplicativo de todos os computadores… Nem a pau, Juvenas!
Se você curtir esse artigo, e ele der um adianto no seu trampo, não esqueça de dar uns cliques nos anúncios para ver o que os anunciantes tem para te oferecer. Vou ficar muito contente.
É só um rolloutizinho
E como a gente resolve essa parada?
A gente pode resolver essa parada (sem esgotar as opções), combinando o poder do PowerShell com o bom e velho script do DOS, o tal dos arquivos “*.bat”.
Um pouco de teoria:
Antes de continuarmos:
Todos os scripts abordados aqui devem rodar como administrador, e é presumido que o técnico tem direito de administrador sobre os equipamentos, ok?
PowerShell e segurança:
Se você já mexeu com o PowerShell, sabe que por motivos de segurança o Windows não habilita por padrão a execução de scripts em PowerShell.
Se tentar rodar um script PowerShel em um computador que não esteja habilitado, ele vai dar o erro abaixo:
Isso tanto é verdade que se precisarmos executar um script de PowerShell, primeiro temos que dar o comando “Set-ExecutionPolicy RemoteSigned” no prompt do PowerShell, com seus parâmetros e alertas de segurança para depois liberar a execução de scripts.
Outro ponto importante para lembrar é que a chave “-force” dos comandos do PowerShell, só permite a execução de comandos sem confirmação, DEPOIS de termos realizado o comando “Set-ExecutionPolicy RemoteSigned”.
Em outras palavras, não dá para iniciar um script PowerShell em uma máquina bloqueada e dentro dele dar o comando para autorizar sua execução. É a mesma coisa que querer passar na ponte antes de virar o graveto!
Ganha-se em agilidade e perde-se em segurança, o eterno trade-off:
Eu diria que essa trava de segurança trata-se de um mal necessário, porque ao habilitarmos o computador a executar scripts PowerShel, que ajuda em muito a tarefa de administração de um parque de máquinas, também abre-se a vulnerabilidade do computador à execução de scripts maliciosos.
Habilitar, rodar o script e desabilitar sua execução na saída (abrir e fechar as portas):
Uma boa prática quando alguém precisar rodar um script PowerShell, seria habilitar sua execução, rodar o script e não esquecer de desabilitar a execução de scripts ao término do serviço. E aqui mando um aviso: TODO MUNDO um dia vai esquecer de desabilitar a execução de scripts se sempre tiver que fazer isso manualmente.
Entendi. Afinal, como faz para habilitar e desabilitar a execução de scripts PowerShell?
Para habilitar a execução de scripts de PowerShell, basta mandar o comando “Set-ExecutionPolicy RemoteSigned”, antes de rodar o script.
Para desabilitar a execução de scripts de PowerShell, basta mandar o comando “Set-ExecutionPolicy Default”, depois de rodar o script.
E a gente tem que dar um jeito de fazer isso programaticamente.
E é aí que entra o script do DOS e o hackeamento do McAfee LifeSave:
Cola na minha que agora você vai entender a maracutaia.
Vamos criar dois scripts, um em DOS chamado de “configura.bat” e um outro chamado de “script_powershell.ps1”, que funcionarão conforme abaixo:
- O script “configura.bat” vai servir para habilitar e desabilitar a execução de scripts PowerShell, sem pedir confirmação de nada … ok? Sim, essa idosa linguagem de script do prompt de comando serve e pode fazer isso!
- A gente inicia rodando o script “configura.bat” que vai habilitar a execução de scripts PowerShell.
- Em seguida o script “configura.bat”, marotamente vai chamar o “script_powershell.ps1”.
- O “script_poweshell.ps1” vai lá e desinstala o McAfee LiveSafe, dando uns comandos bem legais.
- Assim que o “script_poweshell.ps1” termina o seu trabalho sujo, ele volta o controle para o script “configura.bat”.
- O script “configura.bat” coloca a cereja do bolo, desabilitando a execução de scripts PowerShell.
Como é que fica o script “configura.bat”?
Segue o script “configura.bat”. É auto explicativo e é obvio que deve ser iniciado com direito de administrador.
echo off
cls
echo **************************************
echo ********* Instalador Windows *********
echo **************************************
echo.
REM Coloque aqui outros programas "normais" que deseja instalar ou remover em modo silent...
echo ********** Removendo McAfee **********
C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe "Set-ExecutionPolicy RemoteSigned"
C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe d:/lenovo/script_powershell.ps1
C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe "Set-ExecutionPolicy Default"
echo ********** McAfee removido ***********
echo.
Como é que fica o “script_powershell.ps1” ?
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
& 'C:\Program Files\McAfee\MSC\mcuihost.exe' /body:misp://MSCJsRes.dll::uninstall.html /id:uninstall
sleep 8;
$wshell = New-Object -ComObject wscript.shell;
$wshell.AppActivate('McAfee LiveSafe');
[System.Windows.Forms.SendKeys]::SendWait('{TAB}{TAB}{TAB} {TAB} {TAB}{TAB}{ENTER}');
sleep 1;
[System.Windows.Forms.SendKeys]::SendWait('{ENTER}');
sleep 120;
$wshell.AppActivate('McAfee LiveSafe');
[System.Windows.Forms.SendKeys]::SendWait('{TAB}{ENTER}');
As duas primeiras linhas do “script_powershell.ps1” servem para importar as bibliotecas System.Drawing e o System.Windows.Form que servem para o script conseguir manusear os objetos da interface gráfica.
A terceira linha de código, executa o desinstalador do McAfee LiveSafe, da mesma maneira que um usuário normal faria, abrindo o painel de controle, indo em aplicativos e selecionando o McAfee para ser desinstalado, tudo isso pela interface gráfica do usuário.
Em seguida o script dá um tempo de 8 segundos para a tela de desinstalação ser apresentada na interface gráfica.
Passado esse tempo, o script abre um objeto janela ($wshell) e usa a propriedade “AppActivate” para colocar em foco a janela do desinstalador do McAfee LiveSafe que acabou de subir.
Cara, depois disso é só alegria.
A gente pega o SendKeys e usando o comando SendWait, manda uma série de comandos como se fosse alguém navegando pelo teclado enquanto vai configurando a desinstalação do aplicativo.
Feito isso, de zoa o script dá um sleep de 1 segundo antes de mandar o <ENTER> que serve para executar a desinstalação que foi previamente configurada.
Dado o comando <ENTER>, o script aguarda 120 segundos, tempo mais que suficiente para acontecer a desinstalação.
Passado os 120 segundos, a tela do McAfee é chamada de volta para o foco, caso alguém tenha indevidamente clicado fora dela e em seguida executa mais um <TAB> e <ENTER>, dando o comando para reiniciar o computador.
Assim que é dado o comando para reiniciar o computador, o “script_powershell.ps1” finaliza, voltando o controle para o script “configura.bat”.
Assim que o script “configura.bat” reassume o controle, ele rapidamente desabilita a execução de scripts PowerShell e finaliza rapidinho, antes que ocorra a reinicialização do computador que já está em andamento.
E assim a gente consegue desinstalar “em modo silent” o McAfee LiveSafe.
By Renato de Pierri.
Publicado em 16/julho/2022