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"
@"
Painel de Serviços
Painel de Serviços - Inicializando...
Aguardando a primeira execução do script central para gerar o relatório.
"@ | 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.
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?