Explicando o script em PowerShell para manipular processos filtrados por cliente

13 Sep 2024

No cenário de administração de sistemas HCM, gerenciar processos remotamente é uma tarefa crítica para garantir o bom funcionamento dos ambientes dos clientes. Um dos desafios é monitorar e encerrar processos em execução de maneira eficiente, sem impactar negativamente a operação dos serviços.

Esse script PowerShell foi desenvolvido para realizar a verificação e encerramento de processos de maneira remota, permitindo interatividade com o operador, e garantindo que apenas os processos específicos de cada cliente sejam afetados.

Funcionalidades do Script

Interação com o Operador: O script solicita ao usuário informações importantes, como o nome do servidor remoto, o nome do cliente e o tipo de ambiente (produção ou homologação), tornando-o flexível para diferentes cenários.

Consulta de Processos Remotamente: Utilizando o comando Invoke-Command, o script consulta o servidor remoto para identificar processos em execução relacionados ao cliente. A lógica aplicada filtra os processos pelo caminho onde estão sendo executados, garantindo precisão na identificação.

Encerramento Seguro de Processos: Após listar os processos em execução, o operador pode optar por encerrar um ou mais processos. Isso é feito de maneira controlada, onde o ID do processo é fornecido pelo usuário e o encerramento é realizado remotamente usando o comando Stop-Process.

Laços de Repetição e Controle de Fluxo: O script é contínuo, permitindo ao operador realizar várias verificações e encerramentos sem precisar reiniciá-lo manualmente. Após cada ciclo, o operador pode escolher se deseja reiniciar o script ou encerrá-lo.

Fluxo de Execução

O usuário insere o nome do servidor remoto e do cliente. O script consulta se há processos em execução para o cliente no servidor remoto. Se processos forem encontrados, eles são listados para o operador. O operador pode optar por encerrar processos individualmente, fornecendo o ID do processo. O script pergunta se o operador deseja continuar ou encerrar mais processos.

Benefícios

Automação e Eficiência: Reduz a necessidade de intervenções manuais e automatiza a busca por processos relacionados ao cliente. Flexibilidade: Pode ser adaptado para diferentes ambientes (produção ou homologação) e diferentes clientes de forma rápida. Interação Amigável: A interface com o operador é simples e clara, facilitando o uso para administradores de sistemas. Esse script oferece uma solução poderosa e automatizada para a gestão de processos remotos em ambientes HCM, contribuindo para a estabilidade e eficiência dos serviços prestados.

Segue o código completo:

While ($true) {

    Clear-Host;
    Write-Host "Mega Cloud HCM - Verifica processos em execução por cliente..." -ForegroundColor Green

    Write-Host "Digite o nome do servidor remoto:" -ForegroundColor Cyan
    $computerName = Read-Host

    # DEFINIÇÃO DO CLIENTE
    Write-Host "Qual o nome do cliente?" -ForegroundColor Cyan
    $nomeCli = Read-Host

    Write-Host "Sabe qual o código HCM do cliente? (S)Sim, (N)Não" -ForegroundColor Cyan
    $codCliQ = Read-Host;

    if ($codCliQ -eq "N") {
        # Caso o código do cliente não seja conhecido
        Invoke-Command -ComputerName $computerName -ScriptBlock {
            param($nomeCli)
            Get-WMIObject win32_service | Where-Object { $_.pathname -like "*$nomeCli*" -and $_.name -like "*SeniorInstInfoService*" } | Format-Table -AutoSize PSComputerName, Name, State, PathName
        } -ArgumentList $nomeCli

        Write-Host "Digite o código do cliente:" -ForegroundColor Cyan
        $codCli = Read-Host
    } else {
        Write-Host "Confirme o código..." -ForegroundColor Cyan
        $codCli = Read-Host
    }

    Write-Host "Qual o tipo de ambiente? (p)Produção, (h)Homologação" -ForegroundColor Cyan
    $tipAmb = Read-Host
    $cliente = "$nomeCli" + "_" + "$codCli" + "_" + "$tipAmb"

    Write-Host "Consultando processos..." -ForegroundColor Cyan
    
$nenhumProcesso = $false

# CONSULTA OS PROCESSOS EM EXECUÇÃO
Invoke-Command -ComputerName $computerName -ScriptBlock {
    param($cliente)

    # Armazena os processos em uma variável
    $processos = Get-Process -Name * | Where-Object { $_.path -like "*$cliente*" }

    # Verifica se a lista de processos está vazia
    if ($processos) {
        # Se houver processos, exibe-os em formato de tabela
        $processos | Format-Table -AutoSize ID, ProcessName, Path
    } else {
        # Caso contrário, exibe a mensagem e define uma flag para pular o encerramento
        Write-Host "Nenhum processo encontrado para o cliente $cliente" -ForegroundColor Yellow
        return $true
    }

} -ArgumentList $cliente -OutVariable resultado

    $nenhumProcesso = $resultado

# Verifica se nenhum processo foi encontrado
if ($nenhumProcesso -eq $true) {
    # Pula o encerramento e vai direto para o laço de repetição
    Write-Host "Deseja reiniciar o script? Sim(S) Não(N)" -ForegroundColor Cyan
    $restartScript = Read-Host
    if ($restartScript -eq "S") {
        continue
    } else {
        break
    }
}

# Se processos foram encontrados, continua o fluxo para encerrar processos
Write-Host "Deseja encerrar algum processo? (S)Sim, (N)Não" -ForegroundColor Cyan
$processo = Read-Host

if ($processo -eq "S") {
    do {
        Write-Host "Digite o ID do processo que você deseja encerrar" -ForegroundColor Cyan
        $comando = Read-Host

        # ENCERRA O PROCESSO DESEJADO
        Invoke-Command -ComputerName $computerName -ScriptBlock {
            param($comando)
            Get-Process | Where-Object { $_.id -eq $comando } | Stop-Process -Force
        } -ArgumentList $comando

        Write-Host "Processo encerrado com sucesso!!" -ForegroundColor Cyan

        # Exibe os processos restantes
        Invoke-Command -ComputerName $computerName -ScriptBlock {
            param($cliente)
            Get-Process -Name * | Where-Object { $_.path -like "*$cliente*" } | Format-Table -AutoSize ID, ProcessName, Path
        } -ArgumentList $cliente

        # Pergunta se deseja encerrar mais algum processo
        Write-Host "Deseja encerrar mais algum processo? (S)Sim, (N)Não" -ForegroundColor Cyan
        $maisProcessos = Read-Host

    } while ($maisProcessos -eq "S")
}

# LACO DE REPETIÇÃO
Write-Host "Deseja reiniciar o script? Sim(S) Não(N)" -ForegroundColor Cyan
$restartScript = Read-Host
if ($restartScript -eq "S") {
    continue
} else {
    break
}

}

Exit

A automação com PowerShell é uma excelente ferramenta para garantir o controle e monitoramento de processos em ambientes corporativos, proporcionando mais segurança e eficiência ao time de TI.