Painel Visual no IIS para Monitorar Serviços de Vários Servidores Usando PowerShell

Fala pessoal, tudo bem com vocês?

Imagine o cenário mais comum para qualquer administrador de TI: uma infraestrutura em crescimento, dezenas de servidores e a necessidade incessante de garantir o funcionamento de serviços críticos como o IIS (w3svc), Gerenciamento Remoto (WinRM) e Fila de Impressão (Spooler).

O método tradicional—abrir dezenas de sessões RDP, rodar Get-Service manualmente e verificar logs—é ineficiente, insustentável e impossível de escalar. A informação está dispersa e o tempo é perdido em cliques repetitivos.

A solução? Criar uma Central de Comando leve, visual e proativa, utilizando apenas duas ferramentas nativas e poderosas: PowerShell (para automação e coleta de dados) e IIS (para hospedagem e visualização).

Este projeto é dividido em três etapas claras: configurar o servidor central (IIS), enviar dados dos servidores remotos e gerar o painel visual.

1. Configurando o Servidor Central (O Painel IIS)

 

O script inicial prepara o ambiente. Ele instala o IIS, adiciona os recursos necessários e cria a estrutura de pastas que funcionará como a base de dados centralizada, definindo permissões de escrita para garantir que os servidores remotos possam enviar seus logs.

				
					<#
    .DESCRIPTION
    Script para configurar o IIS e preparar o ambiente para o Painel de Serviços.
    .AUTHOR
    Paulo Costa
#>

# Instalar IIS e recursos essenciais
Write-Host "Iniciando a instalação do IIS e componentes básicos..."
Install-WindowsFeature -Name Web-Server,Web-WebServer,Web-Common-Http,Web-Static-Content,Web-Default-Doc,Web-ASP -IncludeManagementTools -Confirm:$false

# Definir Caminhos
$PainelPath = "C:\inetpub\wwwroot\painel"
$LogsPath = "$PainelPath\logs"

# Criar a estrutura de pastas do Painel
if (-not (Test-Path $PainelPath)) { 
    New-Item -Path $PainelPath -ItemType Directory -Force
    Write-Host "Pasta principal do Painel criada: $PainelPath"
}
if (-not (Test-Path $LogsPath)) { 
    New-Item -Path $LogsPath -ItemType Directory -Force
    Write-Host "Pasta de Logs criada: $LogsPath"
}

# Configurar Permissões de Escrita (MUITO IMPORTANTE: Ajuste 'Everyone' conforme sua política de segurança)
Write-Host "Configurando permissões na pasta de Logs para permitir escrita remota..."
$acl = Get-Acl $LogsPath
# Concede permissão de Modificação (Modify) para o usuário 'Everyone'
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule("Everyone","Modify","ContainerInherit,ObjectInherit","None","Allow")
$acl.SetAccessRule($rule)
Set-Acl $LogsPath $acl

# Criar o arquivo HTML inicial (Placeholder)
$HtmlPath = "$PainelPath\index.html"
@"
<html>
<head><title>Painel de Serviços</title></head>
<body>
    <div style="font-family: monospace; padding: 20px; background-color: #1e1e1e; color: #dcdcdc;">
        <h2>Painel de Serviços - Inicializando...</h2>
        <p>Aguardando a primeira execução do script central para gerar o relatório.</p>
    </div>
</body>
</html>
"@ | Out-File $HtmlPath -Encoding UTF8

Write-Host "IIS configurado e Painel pronto para receber logs!"

				
			

2. O Agente de Coleta Remota (Rodando em Cada Servidor)

Este é o script que transforma cada servidor em um “agente de campo”. Ele verifica o status de uma lista predefinida de serviços e, o ponto crucial, salva o resultado em um arquivo de log nomeado com o nome do próprio computador no caminho de rede centralizado.

Atenção: Agende este script via Task Scheduler para rodar a cada 5 minutos em todos os servidores que você deseja monitorar.

				
					<#
.DESCRIPTION
    Script para verificar o status de serviços essenciais e registrar em log centralizado.
    Gera arquivo TXT com o status atual do servidor, usando o nome da máquina.

.AUTHOR
    Paulo Costa

.VERSION
    1.2
.NOTES
    Este script sobrescreve o arquivo de log a cada execução para fornecer o status mais atual.
    Execução recomendada: via Task Scheduler a cada 15 minutos
#>

[CmdletBinding()]
param(
    [string]$LogDir = '\\NomeServidor\inetpub\wwwroot\painel\logs', 
    [switch]$VerboseOutput
)

## CONFIGURAÇÕES
$ErrorActionPreference = 'Stop'
$InformationPreference = if ($VerboseOutput) { 'Continue' } else { 'SilentlyContinue' }

Write-Information "Iniciando verificação de serviços em $(Get-Date -Format 'dd/MM/yyyy HH:mm:ss')"

$LogPath = Join-Path $LogDir "$env:COMPUTERNAME.txt"

try {
    if (-not (Test-Path $LogDir)) { New-Item -Path $LogDir -ItemType Directory -Force | Out-Null }
    Write-Information "Pasta de logs verificada: $LogDir"
} catch { 
    Write-Error "Não foi possível acessar ou criar a pasta de logs: $_"
    exit 1 
}

try {
    Write-Information "Obtendo e processando dados dos serviços..."
    
    $CurrentTime = Get-Date -Format 'dd/MM/yyyy HH:mm:ss'
    
    $Resultado = Get-Service | 
        Where-Object { 
            # Filtra serviços que estão em status relevante (Running, Stopped, Paused)
            $_.Status -in @('Running', 'Stopped', 'Paused') 
        } | 
        ForEach-Object {
            # Formato de saída exato: Servico;Status;Data
            "$($_.Name);$($_.Status);$CurrentTime" 
        }
    
    Write-Information "Total de logs formatados: $($Resultado.Count)"
    
    $Resultado | Out-File -FilePath $LogPath -Encoding UTF8 -Force
    
    Write-Host "Log de status atualizado com sucesso em $LogPath"

} catch {
    Write-Error "Erro ao obter ou salvar status dos serviços: $_"
    exit 1
}
				
			

 

3. A Central de Processamento (Gerador do Painel HTML)

Este script deve rodar no Servidor IIS (o servidor central) em um intervalo de tempo ligeiramente maior (ex: a cada 5 minutos, garantindo que os logs dos agentes já tenham chegado). Ele lê todos os logs, os consolida e gera o arquivo index.html visualmente aprimorado, utilizando CSS para sinalizar o status de forma clara e imediata.

Script de Geração do Painel HTML

Ao acessar o URL do seu IIS, o administrador tem uma visão instantânea, eliminando a necessidade de RDP. O uso de cores vibrantes sobre o fundo escuro garante que os problemas (vermelho e amarelo) saltem imediatamente aos olhos.

E aí, o que vocês acharam desse painel?

Rolar para cima