Files
NoIdle/VERIFICAR_E_CORRIGIR_NOIDLE.ps1
root 6086c13be7 feat: Implementação completa do NoIdle - Cliente, Backend e Scripts
- Cliente Windows com modo silencioso e auto-start robusto
- Backend Node.js + API REST
- Frontend Next.js + Dashboard
- Scripts PowerShell de configuração e diagnóstico
- Documentação completa
- Build scripts para Windows e Linux
- Solução de auto-start após reinicialização

Resolução do problema: Cliente não voltava ativo após reboot
Solução: Registro do Windows + Task Scheduler + Modo silencioso
2025-11-16 22:56:35 +00:00

353 lines
15 KiB
PowerShell
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Script de Verificação e Correção Automática do NoIdle
# Este script verifica se o NoIdle está configurado e funcionando corretamente
# E corrige automaticamente qualquer problema encontrado
# Uso: .\VERIFICAR_E_CORRIGIR_NOIDLE.ps1
param(
[switch]$AutoFix
)
$AppName = "NoIdle"
$TaskName = "NoIdle_Monitor"
$InstallDir = "$env:ProgramFiles\$AppName"
$ExePath = "$InstallDir\NoIdle.exe"
$ConfigPath = "$env:APPDATA\$AppName\config.json"
$RegKey = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run"
$ApiUrl = "https://admin.noidle.tech"
$problemsFound = @()
$warningsFound = @()
Write-Host "========================================" -ForegroundColor Cyan
Write-Host "NoIdle - Diagnóstico e Correção" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
Write-Host ""
# ============================================
# 1. VERIFICAR INSTALAÇÃO
# ============================================
Write-Host "[ 1/8 ] Verificando instalação..." -ForegroundColor Yellow
if (Test-Path $ExePath) {
Write-Host " ✅ Executável encontrado: $ExePath" -ForegroundColor Green
$fileInfo = Get-Item $ExePath
Write-Host " Tamanho: $([math]::Round($fileInfo.Length / 1MB, 2)) MB | Modificado: $($fileInfo.LastWriteTime)" -ForegroundColor Gray
} else {
Write-Host " ❌ ERRO: Executável não encontrado!" -ForegroundColor Red
$problemsFound += "Executável não instalado em $ExePath"
}
Write-Host ""
# ============================================
# 2. VERIFICAR CONFIGURAÇÃO
# ============================================
Write-Host "[ 2/8 ] Verificando configuração..." -ForegroundColor Yellow
if (Test-Path $ConfigPath) {
Write-Host " ✅ Arquivo de configuração encontrado" -ForegroundColor Green
try {
$config = Get-Content $ConfigPath | ConvertFrom-Json
if ($config.device_id) {
Write-Host " ✅ Device ID configurado: $($config.device_id)" -ForegroundColor Green
} else {
Write-Host " ❌ Device ID não encontrado na configuração" -ForegroundColor Red
$problemsFound += "Device ID não configurado"
}
} catch {
Write-Host " ⚠️ Erro ao ler configuração: $_" -ForegroundColor Yellow
$warningsFound += "Arquivo de configuração corrompido"
}
} else {
Write-Host " ⚠️ Arquivo de configuração não encontrado" -ForegroundColor Yellow
Write-Host " (Será criado na primeira execução)" -ForegroundColor Gray
$warningsFound += "Arquivo de configuração não existe (normal em primeira instalação)"
}
Write-Host ""
# ============================================
# 3. VERIFICAR PROCESSO
# ============================================
Write-Host "[ 3/8 ] Verificando se está em execução..." -ForegroundColor Yellow
$runningProcess = Get-Process -Name "NoIdle" -ErrorAction SilentlyContinue
if ($runningProcess) {
Write-Host " ✅ NoIdle está em execução (PID: $($runningProcess.Id))" -ForegroundColor Green
Write-Host " Tempo de execução: $((Get-Date) - $runningProcess.StartTime)" -ForegroundColor Gray
} else {
Write-Host " ❌ NoIdle NÃO está em execução" -ForegroundColor Red
$problemsFound += "Processo não está rodando"
}
Write-Host ""
# ============================================
# 4. VERIFICAR AUTO-START (REGISTRY)
# ============================================
Write-Host "[ 4/8 ] Verificando auto-start (Registro)..." -ForegroundColor Yellow
try {
$regValue = Get-ItemProperty -Path $RegKey -Name $AppName -ErrorAction SilentlyContinue
if ($regValue) {
$regCommand = $regValue.$AppName
Write-Host " ✅ Registro configurado" -ForegroundColor Green
Write-Host " Comando: $regCommand" -ForegroundColor Gray
# Verificar se tem --silent
if ($regCommand -notlike "*--silent*") {
Write-Host " ⚠️ AVISO: Comando não inclui --silent" -ForegroundColor Yellow
$warningsFound += "Registro não está usando modo silencioso"
}
# Verificar se o caminho está correto
if ($regCommand -notlike "*$ExePath*") {
Write-Host " ⚠️ AVISO: Caminho no registro não corresponde ao instalado" -ForegroundColor Yellow
$warningsFound += "Caminho no registro está incorreto"
}
} else {
Write-Host " ❌ Registro NÃO configurado" -ForegroundColor Red
$problemsFound += "Auto-start não configurado no Registro"
}
} catch {
Write-Host " ❌ Erro ao verificar registro: $_" -ForegroundColor Red
$problemsFound += "Erro ao acessar Registro"
}
Write-Host ""
# ============================================
# 5. VERIFICAR AUTO-START (TASK SCHEDULER)
# ============================================
Write-Host "[ 5/8 ] Verificando auto-start (Task Scheduler)..." -ForegroundColor Yellow
try {
$task = Get-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue
if ($task) {
$taskState = $task.State
$taskEnabled = $task.State -ne "Disabled"
if ($taskEnabled) {
Write-Host " ✅ Task Scheduler configurado e ativo" -ForegroundColor Green
} else {
Write-Host " ⚠️ Task Scheduler configurado mas DESABILITADO" -ForegroundColor Yellow
$warningsFound += "Task Scheduler está desabilitado"
}
Write-Host " Nome: $TaskName | Estado: $taskState" -ForegroundColor Gray
# Verificar última execução
$taskInfo = Get-ScheduledTaskInfo -TaskName $TaskName -ErrorAction SilentlyContinue
if ($taskInfo.LastRunTime) {
Write-Host " Última execução: $($taskInfo.LastRunTime)" -ForegroundColor Gray
}
} else {
Write-Host " ⚠️ Task Scheduler NÃO configurado" -ForegroundColor Yellow
$warningsFound += "Task Scheduler não configurado (Registry será usado)"
}
} catch {
Write-Host " ⚠️ Erro ao verificar Task Scheduler: $_" -ForegroundColor Yellow
$warningsFound += "Erro ao acessar Task Scheduler"
}
Write-Host ""
# ============================================
# 6. VERIFICAR CONECTIVIDADE COM API
# ============================================
Write-Host "[ 6/8 ] Verificando conectividade com API..." -ForegroundColor Yellow
try {
$testUrl = "$ApiUrl/api/devices/heartbeat"
$testData = @{ device_id = "TEST" } | ConvertTo-Json
$response = Invoke-WebRequest `
-Uri $testUrl `
-Method POST `
-Body $testData `
-ContentType "application/json" `
-TimeoutSec 10 `
-ErrorAction Stop
Write-Host " ✅ API acessível (Status: $($response.StatusCode))" -ForegroundColor Green
Write-Host " URL: $ApiUrl" -ForegroundColor Gray
} catch {
Write-Host " ❌ Não foi possível conectar à API" -ForegroundColor Red
Write-Host " Erro: $($_.Exception.Message)" -ForegroundColor Gray
$problemsFound += "Sem conectividade com a API"
}
Write-Host ""
# ============================================
# 7. VERIFICAR FIREWALL
# ============================================
Write-Host "[ 7/8 ] Verificando Firewall..." -ForegroundColor Yellow
$firewallRules = Get-NetFirewallRule | Where-Object {
$_.DisplayName -like "*NoIdle*"
}
if ($firewallRules) {
$enabledRules = $firewallRules | Where-Object { $_.Enabled -eq $true }
Write-Host " ✅ Regras de firewall encontradas: $($firewallRules.Count)" -ForegroundColor Green
Write-Host " Ativas: $($enabledRules.Count)" -ForegroundColor Gray
} else {
Write-Host " ⚠️ Nenhuma regra de firewall específica" -ForegroundColor Yellow
Write-Host " (Isso é normal, mas pode causar problemas se o firewall estiver restritivo)" -ForegroundColor Gray
}
Write-Host ""
# ============================================
# 8. VERIFICAR LOGS/ERROS RECENTES
# ============================================
Write-Host "[ 8/8 ] Verificando logs do sistema..." -ForegroundColor Yellow
try {
$appErrors = Get-EventLog -LogName Application -Source "NoIdle*" -Newest 10 -ErrorAction SilentlyContinue
if ($appErrors) {
$errors = $appErrors | Where-Object { $_.EntryType -eq "Error" }
if ($errors) {
Write-Host " ⚠️ Erros encontrados nos logs: $($errors.Count)" -ForegroundColor Yellow
$warningsFound += "Erros no log de eventos"
} else {
Write-Host " ✅ Sem erros recentes nos logs" -ForegroundColor Green
}
} else {
Write-Host " Nenhum log do NoIdle encontrado" -ForegroundColor Gray
}
} catch {
Write-Host " Não foi possível verificar logs" -ForegroundColor Gray
}
Write-Host ""
# ============================================
# RESUMO
# ============================================
Write-Host "========================================" -ForegroundColor Cyan
Write-Host "RESUMO DO DIAGNÓSTICO" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
Write-Host ""
if ($problemsFound.Count -eq 0 -and $warningsFound.Count -eq 0) {
Write-Host "✅ TUDO OK! Nenhum problema encontrado." -ForegroundColor Green
Write-Host ""
Write-Host "O NoIdle está configurado e funcionando corretamente." -ForegroundColor Green
} else {
if ($problemsFound.Count -gt 0) {
Write-Host "❌ PROBLEMAS CRÍTICOS ENCONTRADOS:" -ForegroundColor Red
foreach ($problem in $problemsFound) {
Write-Host "$problem" -ForegroundColor Red
}
Write-Host ""
}
if ($warningsFound.Count -gt 0) {
Write-Host "⚠️ AVISOS:" -ForegroundColor Yellow
foreach ($warning in $warningsFound) {
Write-Host "$warning" -ForegroundColor Yellow
}
Write-Host ""
}
}
# ============================================
# CORREÇÃO AUTOMÁTICA
# ============================================
if ($problemsFound.Count -gt 0) {
Write-Host "========================================" -ForegroundColor Yellow
Write-Host "CORREÇÃO AUTOMÁTICA" -ForegroundColor Yellow
Write-Host "========================================" -ForegroundColor Yellow
Write-Host ""
$shouldFix = $AutoFix
if (-not $shouldFix) {
$resposta = Read-Host "Deseja tentar corrigir os problemas automaticamente? (S/N)"
$shouldFix = ($resposta -eq "S" -or $resposta -eq "s")
}
if ($shouldFix) {
Write-Host "Iniciando correções..." -ForegroundColor Cyan
Write-Host ""
# Corrigir auto-start no Registry
if ($problemsFound -contains "Auto-start não configurado no Registro" -or
$warningsFound -contains "Registro não está usando modo silencioso" -or
$warningsFound -contains "Caminho no registro está incorreto") {
Write-Host "Corrigindo Registro do Windows..." -ForegroundColor Cyan
try {
$registryValue = "`"$ExePath`" --silent"
Set-ItemProperty -Path $RegKey -Name $AppName -Value $registryValue -Type String -Force
Write-Host "✅ Registro corrigido" -ForegroundColor Green
} catch {
Write-Host "❌ Erro ao corrigir registro: $_" -ForegroundColor Red
}
Write-Host ""
}
# Corrigir Task Scheduler
if ($warningsFound -contains "Task Scheduler não configurado (Registry será usado)" -or
$warningsFound -contains "Task Scheduler está desabilitado") {
Write-Host "Configurando Task Scheduler..." -ForegroundColor Cyan
try {
# Remover tarefa existente se houver
Unregister-ScheduledTask -TaskName $TaskName -Confirm:$false -ErrorAction SilentlyContinue | Out-Null
# Criar nova tarefa
$action = New-ScheduledTaskAction -Execute "`"$ExePath`"" -Argument '--silent'
$trigger = New-ScheduledTaskTrigger -AtLogOn -User $env:USERNAME
$principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -LogonType Interactive -RunLevel Limited
$settings = New-ScheduledTaskSettingsSet `
-AllowStartIfOnBatteries `
-DontStopIfGoingOnBatteries `
-StartWhenAvailable `
-RestartCount 3 `
-RestartInterval (New-TimeSpan -Minutes 1) `
-ExecutionTimeLimit (New-TimeSpan -Days 0)
Register-ScheduledTask `
-TaskName $TaskName `
-Action $action `
-Trigger $trigger `
-Principal $principal `
-Settings $settings `
-Description "Monitora atividades do usuário para o sistema NoIdle" `
-Force | Out-Null
Write-Host "✅ Task Scheduler configurado" -ForegroundColor Green
} catch {
Write-Host "⚠️ Erro ao configurar Task Scheduler: $_" -ForegroundColor Yellow
}
Write-Host ""
}
# Iniciar processo se não estiver rodando
if ($problemsFound -contains "Processo não está rodando") {
Write-Host "Iniciando NoIdle..." -ForegroundColor Cyan
try {
Start-Process -FilePath $ExePath -ArgumentList "--silent" -WindowStyle Hidden
Start-Sleep -Seconds 2
$checkProcess = Get-Process -Name "NoIdle" -ErrorAction SilentlyContinue
if ($checkProcess) {
Write-Host "✅ NoIdle iniciado com sucesso (PID: $($checkProcess.Id))" -ForegroundColor Green
} else {
Write-Host "⚠️ NoIdle foi iniciado mas não aparece nos processos" -ForegroundColor Yellow
}
} catch {
Write-Host "❌ Erro ao iniciar NoIdle: $_" -ForegroundColor Red
}
Write-Host ""
}
Write-Host "========================================" -ForegroundColor Green
Write-Host "✅ Correções aplicadas!" -ForegroundColor Green
Write-Host "========================================" -ForegroundColor Green
Write-Host ""
Write-Host "Recomendações:" -ForegroundColor Cyan
Write-Host "1. Reinicie o computador para testar o auto-start" -ForegroundColor White
Write-Host "2. Execute este script novamente após o reboot para verificar" -ForegroundColor White
Write-Host ""
} else {
Write-Host "Correção cancelada. Execute novamente com -AutoFix para corrigir automaticamente." -ForegroundColor Yellow
}
}
Write-Host ""