# ============================================================ # VicTool - Ferramenta de Otimizacao Windows em PT-BR # by Schiavinato Tecnologia | schiavinato.tec.br # v1.4 - Mais tweaks, servicos, hardware detalhado # ============================================================ #Requires -RunAsAdministrator Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing # ─── Cores ──────────────────────────────────────────────── $corFundo = [System.Drawing.Color]::FromArgb(13, 17, 23) $corPainel = [System.Drawing.Color]::FromArgb(22, 27, 34) $corBorda = [System.Drawing.Color]::FromArgb(48, 54, 61) $corDestaque = [System.Drawing.Color]::FromArgb(0, 122, 204) $corVerde = [System.Drawing.Color]::FromArgb(35, 197, 120) $corAmarelo = [System.Drawing.Color]::FromArgb(255, 189, 46) $corVermelho = [System.Drawing.Color]::FromArgb(248, 81, 73) $corTexto = [System.Drawing.Color]::FromArgb(201, 209, 217) $corTextoClaro = [System.Drawing.Color]::FromArgb(255, 255, 255) $corTextoEscuro = [System.Drawing.Color]::FromArgb(110, 118, 129) $corTabInativa = [System.Drawing.Color]::FromArgb(30, 35, 42) $corTabHover = [System.Drawing.Color]::FromArgb(40, 50, 60) # ─── Dados: Programas ───────────────────────────────────── $programas = @( @{ Nome="Google Chrome"; Winget="Google.Chrome"; Cat="Navegadores" } @{ Nome="Mozilla Firefox"; Winget="Mozilla.Firefox"; Cat="Navegadores" } @{ Nome="Brave Browser"; Winget="Brave.Brave"; Cat="Navegadores" } @{ Nome="VLC"; Winget="VideoLAN.VLC"; Cat="Midia" } @{ Nome="Spotify"; Winget="Spotify.Spotify"; Cat="Midia" } @{ Nome="K-Lite Codec Pack"; Winget="CodecGuide.K-LiteCodecPack.Full"; Cat="Midia" } @{ Nome="7-Zip"; Winget="7zip.7zip"; Cat="Utilitarios" } @{ Nome="Notepad++"; Winget="Notepad++.Notepad++"; Cat="Utilitarios" } @{ Nome="Everything"; Winget="voidtools.Everything"; Cat="Utilitarios" } @{ Nome="WinRAR"; Winget="RARLab.WinRAR"; Cat="Utilitarios" } @{ Nome="PowerToys"; Winget="Microsoft.PowerToys"; Cat="Utilitarios" } @{ Nome="TreeSize Free"; Winget="JAMSoftware.TreeSize.Free"; Cat="Utilitarios" } @{ Nome="VS Code"; Winget="Microsoft.VisualStudioCode"; Cat="Dev" } @{ Nome="Git"; Winget="Git.Git"; Cat="Dev" } @{ Nome="Python 3"; Winget="Python.Python.3"; Cat="Dev" } @{ Nome="Node.js LTS"; Winget="OpenJS.NodeJS.LTS"; Cat="Dev" } @{ Nome="Windows Terminal"; Winget="Microsoft.WindowsTerminal"; Cat="Dev" } @{ Nome="FileZilla"; Winget="TimKosse.FileZilla.Client"; Cat="Dev" } @{ Nome="TeamViewer"; Winget="TeamViewer.TeamViewer"; Cat="Remoto" } @{ Nome="AnyDesk"; Winget="AnyDesk.AnyDesk"; Cat="Remoto" } @{ Nome="RustDesk"; Winget="RustDesk.RustDesk"; Cat="Remoto" } @{ Nome="WinSCP"; Winget="WinSCP.WinSCP"; Cat="Remoto" } @{ Nome="PuTTY"; Winget="PuTTY.PuTTY"; Cat="Remoto" } @{ Nome="Bitwarden"; Winget="Bitwarden.Bitwarden"; Cat="Seguranca" } @{ Nome="Malwarebytes"; Winget="Malwarebytes.Malwarebytes"; Cat="Seguranca" } @{ Nome="KeePassXC"; Winget="KeePassXCTeam.KeePassXC"; Cat="Seguranca" } @{ Nome="OBS Studio"; Winget="OBSProject.OBSStudio"; Cat="Criacao" } @{ Nome="GIMP"; Winget="GIMP.GIMP"; Cat="Criacao" } @{ Nome="HandBrake"; Winget="HandBrake.HandBrake"; Cat="Criacao" } @{ Nome="Zoom"; Winget="Zoom.Zoom"; Cat="Comunicacao" } @{ Nome="Discord"; Winget="Discord.Discord"; Cat="Comunicacao" } @{ Nome="Telegram"; Winget="Telegram.TelegramDesktop"; Cat="Comunicacao" } ) # ─── Dados: Bloatware ───────────────────────────────────── $bloatware = @( @{ Nome="Microsoft Copilot"; Pkg="Microsoft.Copilot"; Risco="Baixo" } @{ Nome="Clipchamp (editor video)"; Pkg="Clipchamp.Clipchamp"; Risco="Baixo" } @{ Nome="Microsoft News"; Pkg="Microsoft.BingNews"; Risco="Baixo" } @{ Nome="Microsoft Weather"; Pkg="Microsoft.BingWeather"; Risco="Baixo" } @{ Nome="Microsoft Bing Search"; Pkg="Microsoft.BingSearch"; Risco="Baixo" } @{ Nome="Xbox App"; Pkg="Microsoft.XboxApp"; Risco="Baixo" } @{ Nome="Xbox Game Bar"; Pkg="Microsoft.XboxGamingOverlay"; Risco="Baixo" } @{ Nome="Xbox Identity Provider"; Pkg="Microsoft.XboxIdentityProvider"; Risco="Baixo" } @{ Nome="Xbox Speech To Text"; Pkg="Microsoft.XboxSpeechToTextOverlay"; Risco="Baixo" } @{ Nome="Xbox Game Speech Window"; Pkg="Microsoft.XboxGameSpeech"; Risco="Baixo" } @{ Nome="Solitaire Collection"; Pkg="Microsoft.MicrosoftSolitaireCollection"; Risco="Baixo" } @{ Nome="Candy Crush Saga"; Pkg="king.com.CandyCrushSaga"; Risco="Baixo" } @{ Nome="Candy Crush Friends"; Pkg="king.com.CandyCrushFriendsSaga"; Risco="Baixo" } @{ Nome="Disney Magic Kingdoms"; Pkg="Disney.DisneyMagicKingdoms"; Risco="Baixo" } @{ Nome="Farmville 3"; Pkg="Zynga.FarmVille3"; Risco="Baixo" } @{ Nome="Microsoft Tips"; Pkg="Microsoft.Getstarted"; Risco="Baixo" } @{ Nome="Feedback Hub"; Pkg="Microsoft.WindowsFeedbackHub"; Risco="Baixo" } @{ Nome="Microsoft To Do"; Pkg="Microsoft.Todos"; Risco="Baixo" } @{ Nome="Skype (legacy)"; Pkg="Microsoft.SkypeApp"; Risco="Baixo" } @{ Nome="Teams (pessoal)"; Pkg="MicrosoftTeams"; Risco="Baixo" } @{ Nome="Microsoft People"; Pkg="Microsoft.People"; Risco="Baixo" } @{ Nome="Mapas do Windows"; Pkg="Microsoft.WindowsMaps"; Risco="Baixo" } @{ Nome="Microsoft Sticky Notes"; Pkg="Microsoft.MicrosoftStickyNotes"; Risco="Baixo" } @{ Nome="Microsoft Power Automate"; Pkg="Microsoft.PowerAutomateDesktop"; Risco="Baixo" } @{ Nome="Widgets (Feed de noticias)"; Pkg="MicrosoftWindows.Client.WebExperience"; Risco="Baixo" } @{ Nome="Mixed Reality Portal"; Pkg="Microsoft.MixedReality.Portal"; Risco="Baixo" } @{ Nome="3D Viewer"; Pkg="Microsoft.Microsoft3DViewer"; Risco="Baixo" } @{ Nome="Paint 3D"; Pkg="Microsoft.MSPaint"; Risco="Baixo" } @{ Nome="Camera do Windows"; Pkg="Microsoft.WindowsCamera"; Risco="Medio" } @{ Nome="Gravador de Voz"; Pkg="Microsoft.WindowsSoundRecorder"; Risco="Medio" } @{ Nome="Alarmes e Relogio"; Pkg="Microsoft.WindowsAlarms"; Risco="Medio" } @{ Nome="Calculadora"; Pkg="Microsoft.WindowsCalculator"; Risco="Medio" } @{ Nome="Fotos"; Pkg="Microsoft.Windows.Photos"; Risco="Medio" } @{ Nome="Filmes e TV"; Pkg="Microsoft.ZuneVideo"; Risco="Medio" } @{ Nome="Groove Musica"; Pkg="Microsoft.ZuneMusic"; Risco="Medio" } @{ Nome="Correio e Calendario"; Pkg="microsoft.windowscommunicationsapps"; Risco="Medio" } @{ Nome="OneNote (Store)"; Pkg="Microsoft.Office.OneNote"; Risco="Medio" } @{ Nome="OneDrive"; Pkg="OneDrive"; Risco="Alto" } @{ Nome="Microsoft 365 (trial)"; Pkg="Microsoft.MicrosoftOfficeHub"; Risco="Alto" } ) # ─── Dados: Tweaks ──────────────────────────────────────── $tweaks = @( # Performance @{ Nome="Desativar Efeitos Visuais"; Cat="Performance"; Acao="perf_visual" } @{ Nome="Plano de Energia: Alto Desempenho"; Cat="Performance"; Acao="perf_energia" } @{ Nome="Plano de Energia: Maximo (Oculto)"; Cat="Performance"; Acao="perf_energia_max" } @{ Nome="Desativar SysMain (Superfetch)"; Cat="Performance"; Acao="perf_sysmain" } @{ Nome="Desativar Search Indexing"; Cat="Performance"; Acao="perf_index" } @{ Nome="Desativar Xbox Game DVR"; Cat="Performance"; Acao="perf_gamedvr" } @{ Nome="Limpar Arquivos Temporarios"; Cat="Performance"; Acao="perf_temp" } @{ Nome="Ajustar Prioridade de CPU para Apps"; Cat="Performance"; Acao="perf_cpu_prio" } @{ Nome="Desativar Hibernacao"; Cat="Performance"; Acao="perf_hibern" } @{ Nome="Otimizar NTFS (desativar 8.3)"; Cat="Performance"; Acao="perf_ntfs" } # Privacidade @{ Nome="Desativar Telemetria"; Cat="Privacidade"; Acao="priv_telemetria" } @{ Nome="Desativar Publicidade Direcionada"; Cat="Privacidade"; Acao="priv_ads" } @{ Nome="Desativar Bing no Menu Iniciar"; Cat="Privacidade"; Acao="priv_bing" } @{ Nome="Desativar Activity History"; Cat="Privacidade"; Acao="priv_activity" } @{ Nome="Desativar Diagnosticos Opcionais"; Cat="Privacidade"; Acao="priv_diag" } @{ Nome="Desativar Cortana"; Cat="Privacidade"; Acao="priv_cortana" } @{ Nome="Desativar Rastreamento de Localizacao";Cat="Privacidade"; Acao="priv_location" } @{ Nome="Desativar Acesso Micro/Camera por Apps";Cat="Privacidade";Acao="priv_devices" } @{ Nome="Desativar Envio de Tinta e Digitacao"; Cat="Privacidade"; Acao="priv_inktyping" } @{ Nome="Desativar WiFi Sense"; Cat="Privacidade"; Acao="priv_wifisense" } @{ Nome="Bloquear Telemetria no Hosts"; Cat="Privacidade"; Acao="priv_hosts" } # Interface @{ Nome="Mostrar Extensoes de Arquivo"; Cat="Interface"; Acao="ui_ext" } @{ Nome="Mostrar Arquivos Ocultos"; Cat="Interface"; Acao="ui_hidden" } @{ Nome="Desativar Notificacoes Inuteis"; Cat="Interface"; Acao="ui_notif" } @{ Nome="Habilitar Encerrar Tarefa na Barra"; Cat="Interface"; Acao="ui_endtask" } @{ Nome="Restaurar Menu Contexto Classico"; Cat="Interface"; Acao="ui_menu" } @{ Nome="Alinhar Barra a Esquerda"; Cat="Interface"; Acao="ui_taskbar" } @{ Nome="Desativar Recomendados no Menu Iniciar";Cat="Interface"; Acao="ui_recstart" } @{ Nome="Desativar Pesquisa Destacada (Bing)"; Cat="Interface"; Acao="ui_searchhl" } @{ Nome="Mostrar Segundos no Relogio"; Cat="Interface"; Acao="ui_clock_sec" } @{ Nome="Desativar Snap Assist Popup"; Cat="Interface"; Acao="ui_snap" } # Servicos @{ Nome="Desativar DiagTrack (Telemetria)"; Cat="Servicos"; Acao="svc_diagtrack" } @{ Nome="Desativar WSearch (Indexacao)"; Cat="Servicos"; Acao="svc_wsearch" } @{ Nome="Desativar SysMain (Superfetch)"; Cat="Servicos"; Acao="svc_sysmain" } @{ Nome="Desativar Print Spooler (sem impr.)"; Cat="Servicos"; Acao="svc_spooler" } @{ Nome="Desativar Fax"; Cat="Servicos"; Acao="svc_fax" } @{ Nome="Desativar Remote Registry"; Cat="Servicos"; Acao="svc_remreg" } @{ Nome="Desativar Tablet Input Service"; Cat="Servicos"; Acao="svc_tablet" } @{ Nome="Desativar Touch Keyboard (sem touch)"; Cat="Servicos"; Acao="svc_touch" } @{ Nome="Desativar Geolocation Service"; Cat="Servicos"; Acao="svc_geoloc" } @{ Nome="Desativar Connected User Experiences"; Cat="Servicos"; Acao="svc_diagsvc" } @{ Nome="Desativar Xbox Live Services (4x)"; Cat="Servicos"; Acao="svc_xbox" } @{ Nome="Desativar WalletService"; Cat="Servicos"; Acao="svc_wallet" } @{ Nome="Desativar MapsBroker"; Cat="Servicos"; Acao="svc_maps" } @{ Nome="Desativar RetailDemo"; Cat="Servicos"; Acao="svc_retail" } @{ Nome="Desativar SharedAccess (ICS)"; Cat="Servicos"; Acao="svc_ics" } @{ Nome="Desativar Distributed Link Tracking"; Cat="Servicos"; Acao="svc_trkwks" } ) # ─── Funcoes Core ───────────────────────────────────────── function Escrever-Log { param([string]$Msg, [string]$Tipo = "INFO") $ts = Get-Date -Format "HH:mm:ss" $linha = "[$ts][$Tipo] $Msg" Write-Host $linha if ($script:txtLog -and !$script:txtLog.IsDisposed) { $script:txtLog.Invoke([System.Action]{ $script:txtLog.AppendText("$linha`r`n") $script:txtLog.ScrollToCaret() }) | Out-Null } } function RegSet { param([string]$path, [string]$name, $value, [string]$type = "DWord") if (-not (Test-Path $path)) { New-Item -Path $path -Force | Out-Null } Set-ItemProperty -Path $path -Name $name -Value $value -Type $type -ErrorAction SilentlyContinue } function Svc-Disable { param([string]$Nome) try { Stop-Service -Name $Nome -Force -ErrorAction SilentlyContinue Set-Service -Name $Nome -StartupType Disabled -ErrorAction SilentlyContinue Escrever-Log "Servico '$Nome' desativado!" "OK" } catch { Escrever-Log "Aviso ($Nome): $_" "AVISO" } } function Rodar-Async { param( [ScriptBlock]$Bloco, [hashtable]$Vars = @{}, [ScriptBlock]$AoFinalizar = $null ) $rs = [System.Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace() $rs.ApartmentState = "STA" $rs.ThreadOptions = "ReuseThread" $rs.Open() foreach ($k in $Vars.Keys) { $rs.SessionStateProxy.SetVariable($k, $Vars[$k]) } $fnLog = ${function:Escrever-Log}.ToString() $fnRegSet = ${function:RegSet}.ToString() $fnSvcDis = ${function:Svc-Disable}.ToString() $rs.SessionStateProxy.SetVariable("fnLog", $fnLog) $rs.SessionStateProxy.SetVariable("fnRegSet", $fnRegSet) $rs.SessionStateProxy.SetVariable("fnSvcDis", $fnSvcDis) $rs.SessionStateProxy.SetVariable("txtLogRef", $script:txtLog) $ps = [System.Management.Automation.PowerShell]::Create() $ps.Runspace = $rs $ps.AddScript({ Invoke-Expression "function Escrever-Log { $fnLog }" Invoke-Expression "function RegSet { $fnRegSet }" Invoke-Expression "function Svc-Disable { $fnSvcDis }" $script:txtLog = $txtLogRef }) | Out-Null $ps.AddScript($Bloco) | Out-Null $handle = $ps.BeginInvoke() # Capturar callback numa variavel de escopo script indexada para garantir acesso no Tick $script:_asyncIdx = if ($script:_asyncIdx -is [int]) { $script:_asyncIdx + 1 } else { 0 } $myIdx = $script:_asyncIdx $script:_asyncCallbacks = if ($script:_asyncCallbacks -is [hashtable]) { $script:_asyncCallbacks } else { @{} } $script:_asyncCallbacks[$myIdx] = $AoFinalizar $timer = New-Object System.Windows.Forms.Timer $timer.Interval = 500 $timer.add_Tick({ if (-not $handle.IsCompleted) { return } $timer.Stop() $timer.Dispose() try { $ps.EndInvoke($handle) } catch {} try { $ps.Dispose() } catch {} try { $rs.Close() } catch {} try { $rs.Dispose() } catch {} $cb = $script:_asyncCallbacks[$myIdx] $script:_asyncCallbacks.Remove($myIdx) if ($cb) { try { & $cb } catch { Write-Host "AoFinalizar erro: $_" } } }) $timer.Start() } # ─── Favicon ────────────────────────────────────────────── function Criar-Icone { $bmp = New-Object System.Drawing.Bitmap(16, 16) $g = [System.Drawing.Graphics]::FromImage($bmp) $g.SmoothingMode = [System.Drawing.Drawing2D.SmoothingMode]::AntiAlias $g.Clear([System.Drawing.Color]::Transparent) $brush = New-Object System.Drawing.SolidBrush([System.Drawing.Color]::FromArgb(0, 122, 204)) $g.FillEllipse($brush, 0, 0, 15, 15) $pen = New-Object System.Drawing.Pen([System.Drawing.Color]::White, 2) $g.DrawLine($pen, 2, 3, 7, 12) $g.DrawLine($pen, 12, 3, 7, 12) $g.Dispose(); $pen.Dispose(); $brush.Dispose() $icon = [System.Drawing.Icon]::FromHandle($bmp.GetHicon()) $bmp.Dispose() return $icon } # ─── Aplicar Tweak ──────────────────────────────────────── function Aplicar-Tweak-Item { param([string]$Acao) switch ($Acao) { # Performance "perf_visual" { RegSet "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\VisualEffects" "VisualFXSetting" 2; Escrever-Log "Efeitos visuais desativados!" "OK" } "perf_energia" { & powercfg /setactive 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c 2>$null; Escrever-Log "Plano Alto Desempenho ativado!" "OK" } "perf_energia_max" { $guid = (& powercfg /duplicatescheme e9a42b02-d5df-448d-aa00-03f14749eb61 2>$null) -replace ".*GUID: ([a-f0-9-]+).*",'$1' if ($guid) { & powercfg /setactive $guid 2>$null; Escrever-Log "Plano Desempenho Maximo ativado! ($guid)" "OK" } else { Escrever-Log "Plano maximo nao disponivel neste hardware." "AVISO" } } "perf_sysmain" { Svc-Disable "SysMain" } "perf_index" { Svc-Disable "WSearch" } "perf_gamedvr" { RegSet "HKCU:\System\GameConfigStore" "GameDVR_Enabled" 0; RegSet "HKLM:\SOFTWARE\Policies\Microsoft\Windows\GameDVR" "AllowGameDVR" 0; Escrever-Log "Game DVR desativado!" "OK" } "perf_temp" { @("$env:TEMP","$env:WINDIR\Temp","$env:WINDIR\Prefetch") | ForEach-Object { if (Test-Path $_) { Get-ChildItem $_ -Recurse -Force -EA SilentlyContinue | Remove-Item -Recurse -Force -EA SilentlyContinue } } Escrever-Log "Temporarios limpos!" "OK" } "perf_cpu_prio" { RegSet "HKLM:\SYSTEM\CurrentControlSet\Control\PriorityControl" "Win32PrioritySeparation" 38 Escrever-Log "Prioridade de CPU otimizada para aplicacoes!" "OK" } "perf_hibern" { & powercfg /hibernate off 2>$null; Escrever-Log "Hibernacao desativada! (libera espaco no SSD)" "OK" } "perf_ntfs" { & fsutil behavior set disable8dot3 1 2>$null; Escrever-Log "Nomes curtos NTFS (8.3) desativados!" "OK" } # Privacidade "priv_telemetria" { RegSet "HKLM:\SOFTWARE\Policies\Microsoft\Windows\DataCollection" "AllowTelemetry" 0 @("DiagTrack","dmwappushservice") | ForEach-Object { Svc-Disable $_ } Escrever-Log "Telemetria desativada!" "OK" } "priv_ads" { RegSet "HKCU:\Software\Microsoft\Windows\CurrentVersion\AdvertisingInfo" "Enabled" 0; Escrever-Log "Publicidade desativada!" "OK" } "priv_bing" { RegSet "HKCU:\Software\Microsoft\Windows\CurrentVersion\Search" "BingSearchEnabled" 0; RegSet "HKCU:\Software\Microsoft\Windows\CurrentVersion\Search" "CortanaConsent" 0; Escrever-Log "Bing removido do Menu Iniciar!" "OK" } "priv_activity" { RegSet "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System" "EnableActivityFeed" 0; RegSet "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System" "PublishUserActivities" 0; Escrever-Log "Activity History desativado!" "OK" } "priv_diag" { RegSet "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\DataCollection" "AllowTelemetry" 0; Escrever-Log "Diagnosticos minimizados!" "OK" } "priv_cortana" { RegSet "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Windows Search" "AllowCortana" 0; Escrever-Log "Cortana desativada!" "OK" } "priv_location" { RegSet "HKLM:\SOFTWARE\Policies\Microsoft\Windows\LocationAndSensors" "DisableLocation" 1 RegSet "HKCU:\Software\Microsoft\Windows\CurrentVersion\DeviceAccess\Global\{BFA794E4-F964-4FDB-90F6-51056BFE4B44}" "Value" "Deny" "String" Escrever-Log "Rastreamento de localizacao desativado!" "OK" } "priv_devices" { @("{2EEF81BE-33FA-4800-9670-1CD474972C3F}","{992AFA70-6F47-4148-B3E9-3003349C1548}") | ForEach-Object { RegSet "HKCU:\Software\Microsoft\Windows\CurrentVersion\DeviceAccess\Global\$_" "Value" "Deny" "String" } Escrever-Log "Acesso de apps a microfone/camera negado!" "OK" } "priv_inktyping" { RegSet "HKCU:\Software\Microsoft\InputPersonalization" "RestrictImplicitInkCollection" 1; RegSet "HKCU:\Software\Microsoft\InputPersonalization" "RestrictImplicitTextCollection" 1; Escrever-Log "Coleta de tinta/digitacao desativada!" "OK" } "priv_wifisense" { RegSet "HKLM:\SOFTWARE\Microsoft\WcmSvc\wifinetworkmanager\config" "AutoConnectAllowedOEM" 0; Escrever-Log "WiFi Sense desativado!" "OK" } "priv_hosts" { $hostsPath = "$env:WINDIR\System32\drivers\etc\hosts" $dominios = @( "0.0.0.0 telemetry.microsoft.com", "0.0.0.0 vortex.data.microsoft.com", "0.0.0.0 settings-win.data.microsoft.com", "0.0.0.0 watson.telemetry.microsoft.com", "0.0.0.0 oca.telemetry.microsoft.com", "0.0.0.0 sqm.telemetry.microsoft.com" ) $hostsConteudo = Get-Content $hostsPath -ErrorAction SilentlyContinue foreach ($d in $dominios) { if ($hostsConteudo -notcontains $d) { Add-Content -Path $hostsPath -Value $d -ErrorAction SilentlyContinue } } Escrever-Log "Dominios de telemetria bloqueados no Hosts!" "OK" } # Interface "ui_ext" { RegSet "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" "HideFileExt" 0; Escrever-Log "Extensoes de arquivo visiveis!" "OK" } "ui_hidden" { RegSet "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" "Hidden" 1; Escrever-Log "Arquivos ocultos visiveis!" "OK" } "ui_notif" { $p = "HKCU:\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" @("SubscribedContent-338388Enabled","SubscribedContent-338389Enabled","SubscribedContent-353694Enabled","SubscribedContent-353696Enabled","SoftLandingEnabled","SystemPaneSuggestionsEnabled","OemPreInstalledAppsEnabled","PreInstalledAppsEnabled","SilentInstalledAppsEnabled") | ForEach-Object { RegSet $p $_ 0 } Escrever-Log "Notificacoes e sugestoes desativadas!" "OK" } "ui_endtask" { RegSet "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\TaskbarDeveloperSettings" "TaskbarEndTask" 1; Escrever-Log "Encerrar Tarefa ativado!" "OK" } "ui_menu" { $p="HKCU:\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32"; if(-not(Test-Path $p)){New-Item -Path $p -Force|Out-Null}; Set-ItemProperty -Path $p -Name "(Default)" -Value "" -Type String; Escrever-Log "Menu classico restaurado!" "OK" } "ui_taskbar" { RegSet "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" "TaskbarAl" 0; Escrever-Log "Barra alinhada a esquerda!" "OK" } "ui_recstart" { RegSet "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" "Start_TrackProgs" 0; Escrever-Log "Recomendados do Menu Iniciar desativados!" "OK" } "ui_searchhl" { RegSet "HKCU:\Software\Microsoft\Windows\CurrentVersion\Feeds\DSB" "ShowDynamicContent" 0; RegSet "HKCU:\Software\Microsoft\Windows\CurrentVersion\SearchSettings" "IsDynamicSearchBoxEnabled" 0; Escrever-Log "Destaque da Pesquisa (Bing) desativado!" "OK" } "ui_clock_sec" { RegSet "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" "ShowSecondsInSystemClock" 1; Escrever-Log "Segundos no relogio ativados!" "OK" } "ui_snap" { RegSet "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" "SnapAssist" 0; Escrever-Log "Snap Assist popup desativado!" "OK" } # Servicos "svc_diagtrack" { Svc-Disable "DiagTrack" } "svc_wsearch" { Svc-Disable "WSearch" } "svc_sysmain" { Svc-Disable "SysMain" } "svc_spooler" { Svc-Disable "Spooler" } "svc_fax" { Svc-Disable "Fax" } "svc_remreg" { Svc-Disable "RemoteRegistry" } "svc_tablet" { Svc-Disable "TabletInputService" } "svc_touch" { Svc-Disable "TouchKeyboardAndHandwritingPanelService" } "svc_geoloc" { Svc-Disable "lfsvc" } "svc_diagsvc" { Svc-Disable "DiagnosticHub.StandardCollector.Service" } "svc_xbox" { @("XblAuthManager","XblGameSave","XboxGipSvc","XboxNetApiSvc") | ForEach-Object { Svc-Disable $_ } } "svc_wallet" { Svc-Disable "WalletService" } "svc_maps" { Svc-Disable "MapsBroker" } "svc_retail" { Svc-Disable "RetailDemo" } "svc_ics" { Svc-Disable "SharedAccess" } "svc_trkwks" { Svc-Disable "TrkWks" } } } # ═══════════════════════════════════════════════════════════ # JANELA PRINCIPAL # ═══════════════════════════════════════════════════════════ $script:form = New-Object System.Windows.Forms.Form $script:form.Text = "VicTool v1.4 | by Victor Schiavinato" $script:form.Size = New-Object System.Drawing.Size(1220, 780) $script:form.StartPosition = "CenterScreen" $script:form.BackColor = $corFundo $script:form.ForeColor = $corTexto $script:form.Font = New-Object System.Drawing.Font("Segoe UI", 9) $script:form.MinimumSize = New-Object System.Drawing.Size(1000, 660) $script:form.Icon = Criar-Icone # Barra de acento + Header $pnlAccent = New-Object System.Windows.Forms.Panel $pnlAccent.Dock = "Top"; $pnlAccent.Height = 3; $pnlAccent.BackColor = $corDestaque $pnlHeader = New-Object System.Windows.Forms.Panel $pnlHeader.Dock = "Top"; $pnlHeader.Height = 54; $pnlHeader.BackColor = $corPainel # Titulo + versao lado a lado, subtitulo na linha de baixo $lblTitulo = New-Object System.Windows.Forms.Label $lblTitulo.Text = "VicTool" $lblTitulo.Font = New-Object System.Drawing.Font("Segoe UI", 18, [System.Drawing.FontStyle]::Bold) $lblTitulo.ForeColor = $corDestaque $lblTitulo.Location = New-Object System.Drawing.Point(18, 8) $lblTitulo.AutoSize = $true $lblVersion = New-Object System.Windows.Forms.Label $lblVersion.Text = "v1.4" $lblVersion.Font = New-Object System.Drawing.Font("Segoe UI", 8) $lblVersion.ForeColor = $corTextoEscuro $lblVersion.Location = New-Object System.Drawing.Point(110, 12) $lblVersion.AutoSize = $true $sepHeaderV = New-Object System.Windows.Forms.Panel $sepHeaderV.Location = New-Object System.Drawing.Point(148, 10) $sepHeaderV.Size = New-Object System.Drawing.Size(1, 32) $sepHeaderV.BackColor = $corBorda $lblSub = New-Object System.Windows.Forms.Label $lblSub.Text = "Ferramenta de Otimizacao, Debloat e Configuracao Windows | by Victor Schiavinato" $lblSub.Font = New-Object System.Drawing.Font("Segoe UI", 9) $lblSub.ForeColor = $corTextoEscuro $lblSub.Location = New-Object System.Drawing.Point(158, 17) $lblSub.AutoSize = $true $pnlHeader.Controls.AddRange(@($lblTitulo, $lblVersion, $sepHeaderV, $lblSub)) $script:form.Controls.Add($pnlAccent) $script:form.Controls.Add($pnlHeader) # Container principal — com padding bottom de 10px para botoes nao colarem no footer $pnlMain = New-Object System.Windows.Forms.Panel $pnlMain.Location = New-Object System.Drawing.Point(0, 57) $pnlMain.Size = New-Object System.Drawing.Size(1220, 686) $pnlMain.Anchor = "Top,Left,Bottom,Right" $pnlMain.BackColor = $corFundo $pnlMain.Padding = New-Object System.Windows.Forms.Padding(0, 0, 0, 10) $script:form.Controls.Add($pnlMain) # Sidebar $pnlSidebar = New-Object System.Windows.Forms.Panel $pnlSidebar.Location = New-Object System.Drawing.Point(0, 0) $pnlSidebar.Size = New-Object System.Drawing.Size(182, 686) $pnlSidebar.Anchor = "Top,Left,Bottom" $pnlSidebar.BackColor = $corPainel $pnlMain.Controls.Add($pnlSidebar) $sepSide = New-Object System.Windows.Forms.Panel $sepSide.Location = New-Object System.Drawing.Point(182, 0); $sepSide.Size = New-Object System.Drawing.Size(1, 686) $sepSide.Anchor = "Top,Left,Bottom"; $sepSide.BackColor = $corBorda $pnlMain.Controls.Add($sepSide) # Area de conteudo — cresce horizontalmente, deixando 240px para o log $pnlContent = New-Object System.Windows.Forms.Panel $pnlContent.Location = New-Object System.Drawing.Point(183, 0) $pnlContent.Size = New-Object System.Drawing.Size(796, 686) $pnlContent.Anchor = "Top,Left,Bottom,Right" $pnlContent.BackColor = $corFundo $pnlMain.Controls.Add($pnlContent) # Log — 235px de largura $sepLog = New-Object System.Windows.Forms.Panel $sepLog.Location = New-Object System.Drawing.Point(979, 0); $sepLog.Size = New-Object System.Drawing.Size(1, 686) $sepLog.Anchor = "Top,Right,Bottom"; $sepLog.BackColor = $corBorda $pnlMain.Controls.Add($sepLog) $pnlLog = New-Object System.Windows.Forms.Panel $pnlLog.Location = New-Object System.Drawing.Point(980, 0) $pnlLog.Size = New-Object System.Drawing.Size(240, 686) $pnlLog.Anchor = "Top,Right,Bottom" $pnlLog.BackColor = $corFundo $pnlMain.Controls.Add($pnlLog) # ─── Tabs ───────────────────────────────────────────────── $tabDefs = @( @{ Label="Pagina Inicial"; Icon="[H]"; } @{ Label="Instalar Programas"; Icon="[+]"; } @{ Label="Remover Bloatware"; Icon="[-]"; } @{ Label="Tweaks + Servicos"; Icon="[*]"; } @{ Label="Sistema"; Icon="[S]"; } @{ Label="Microsoft"; Icon="[M]"; } ) $tabPanels = [System.Collections.ArrayList]@() $tabButtons = [System.Collections.ArrayList]@() function Criar-TabPanel { $p = New-Object System.Windows.Forms.Panel $p.Dock = "Fill"; $p.BackColor = $corFundo; $p.Visible = $false $pnlContent.Controls.Add($p) return $p } function Selecionar-Tab { param([int]$idx) $script:tabAtual = $idx for ($i = 0; $i -lt $tabPanels.Count; $i++) { $tabPanels[$i].Visible = ($i -eq $idx) } for ($i = 0; $i -lt $tabButtons.Count; $i++) { if ($i -eq $idx) { $tabButtons[$i].BackColor = $corDestaque; $tabButtons[$i].ForeColor = $corTextoClaro } else { $tabButtons[$i].BackColor = $corTabInativa; $tabButtons[$i].ForeColor = $corTextoEscuro } } } $yBtn = 10 foreach ($def in $tabDefs) { $btn = New-Object System.Windows.Forms.Button $btn.Text = " $($def.Icon) $($def.Label)" $btn.Location = New-Object System.Drawing.Point(6, $yBtn) $btn.Size = New-Object System.Drawing.Size(166, 42) $btn.BackColor = $corTabInativa; $btn.ForeColor = $corTextoEscuro $btn.FlatStyle = "Flat"; $btn.FlatAppearance.BorderSize = 0 $btn.FlatAppearance.MouseOverBackColor = $corTabHover $btn.Font = New-Object System.Drawing.Font("Segoe UI", 9, [System.Drawing.FontStyle]::Bold) $btn.TextAlign = "MiddleLeft"; $btn.Cursor = [System.Windows.Forms.Cursors]::Hand $btn.Tag = $tabButtons.Count $pnl = Criar-TabPanel $tabPanels.Add($pnl) | Out-Null $tabButtons.Add($btn) | Out-Null $btn.add_Click({ Selecionar-Tab -idx $this.Tag }) $pnlSidebar.Controls.Add($btn) $yBtn += 48 } $sepSideLine = New-Object System.Windows.Forms.Panel $sepSideLine.Location = New-Object System.Drawing.Point(10, ($yBtn - 6)); $sepSideLine.Size = New-Object System.Drawing.Size(158, 1); $sepSideLine.BackColor = $corBorda $pnlSidebar.Controls.Add($sepSideLine) $lblCredit = New-Object System.Windows.Forms.Label $lblCredit.Text = "by Victor Schiavinato"; $lblCredit.ForeColor = $corTextoEscuro $lblCredit.Font = New-Object System.Drawing.Font("Segoe UI", 7); $lblCredit.Location = New-Object System.Drawing.Point(8, 620); $lblCredit.AutoSize = $true $pnlSidebar.Controls.Add($lblCredit) # ═══════════════════════════════════════════════════════════ # ABA 0 — PAGINA INICIAL # ═══════════════════════════════════════════════════════════ $pHome = $tabPanels[0] $pnlHomeScroll = New-Object System.Windows.Forms.Panel $pnlHomeScroll.Dock = "Fill" $pnlHomeScroll.BackColor = $corFundo $pnlHomeScroll.AutoScroll = $true # ── Boas-vindas ─────────────────────────────────────────── $pnlWelcome = New-Object System.Windows.Forms.Panel $pnlWelcome.Location = New-Object System.Drawing.Point(16, 16) $pnlWelcome.Size = New-Object System.Drawing.Size(760, 100) $pnlWelcome.BackColor = $corPainel $acHome = New-Object System.Windows.Forms.Panel $acHome.Location = New-Object System.Drawing.Point(0,0); $acHome.Size = New-Object System.Drawing.Size(4,100); $acHome.BackColor = $corDestaque $pnlWelcome.Controls.Add($acHome) $lblWelTit = New-Object System.Windows.Forms.Label $lblWelTit.Text = "Bem-vindo ao VicTool v1.4" $lblWelTit.Font = New-Object System.Drawing.Font("Segoe UI", 14, [System.Drawing.FontStyle]::Bold) $lblWelTit.ForeColor = $corTextoClaro $lblWelTit.Location = New-Object System.Drawing.Point(16, 12); $lblWelTit.AutoSize = $true $pnlWelcome.Controls.Add($lblWelTit) $lblWelSub = New-Object System.Windows.Forms.Label $lblWelSub.Text = "Ferramenta completa de otimizacao, limpeza e configuracao para Windows 10/11.`nDesenvolvida por Victor Schiavinato para uso profissional e pessoal." $lblWelSub.Font = New-Object System.Drawing.Font("Segoe UI", 9) $lblWelSub.ForeColor = $corTextoEscuro $lblWelSub.Location = New-Object System.Drawing.Point(16, 42); $lblWelSub.Size = New-Object System.Drawing.Size(730, 48) $pnlWelcome.Controls.Add($lblWelSub) $pnlHomeScroll.Controls.Add($pnlWelcome) # ── Cards de funcionalidades ────────────────────────────── $funcoes = @( @{ Titulo = "[+] Instalar Programas" Cor = $corDestaque Desc = "Instale mais de 30 programas essenciais com um clique, organizados por categoria:`n" + " - Navegadores: Chrome, Firefox, Brave`n" + " - Utilitarios: 7-Zip, Notepad++, Everything, PowerToys`n" + " - Desenvolvimento: VS Code, Git, Python, Node.js`n" + " - Acesso remoto: TeamViewer, AnyDesk, RustDesk, PuTTY`n" + " - Seguranca: Bitwarden, Malwarebytes, KeePassXC`n" + " - E muito mais! Tudo via Winget, de forma silenciosa." } @{ Titulo = "[-] Remover Bloatware" Cor = $corVermelho Desc = "Remove aplicativos desnecessarios pre-instalados pela Microsoft:`n" + " - Microsoft Copilot, Clipchamp, Xbox e Game Bar`n" + " - Jogos: Solitaire, Candy Crush, Farmville`n" + " - Widgets, Mixed Reality Portal, Paint 3D, 3D Viewer`n" + " - Teams (pessoal), Skype legacy, OneDrive`n" + " - Sistema classificado por risco: [OK] Seguro / [MEDIO] Cuidado / [ALTO] Impacto maior" } @{ Titulo = "[*] Tweaks e Servicos" Cor = $corAmarelo Desc = "46 otimizacoes organizadas em 4 categorias com filtro:`n" + " - Performance: efeitos visuais, plano de energia maximo, hibernacao, NTFS 8.3`n" + " - Privacidade: telemetria, publicidade, Bing, localizacao, hosts DNS`n" + " - Interface: extensoes de arquivo, menu classico, barra esquerda, snap assist`n" + " - Servicos: desativa 15+ servicos inuteis (Xbox, Fax, Geolocation, etc.)" } @{ Titulo = "[S] Sistema" Cor = $corDestaque Desc = "Ferramentas de manutencao e diagnostico em um so lugar:`n" + " - Hardware Detalhado: CPU, RAM (slots/tipo/freq), GPU, SSD/HD com uso por particao`n" + " - Configurar DNS: 20 servidores (Google, Cloudflare, AdGuard anti-AD, Quad9...)`n" + " - SFC /scannow e DISM RestoreHealth para reparar o sistema`n" + " - Resetar TCP/IP, Flush DNS, Reiniciar Explorer`n" + " - Exportar relatorio de hardware em .TXT para a Area de Trabalho" } @{ Titulo = "[M] Microsoft — Ativacao" Cor = [System.Drawing.Color]::FromArgb(0,164,239) Desc = "Ativacao do Windows e Office via Microsoft Activation Scripts (MAS - massgrave.dev):`n" + " - Windows: metodo HWID — ativacao digital permanente, sem internet apos ativar`n" + " - Office: metodo Ohook — Office 2016/2019/2021/2024 e Microsoft 365 permanente`n" + " - Menu completo MAS para troubleshooting e troca de edicao`n" + " - Projeto open source, GPL-3.0 (github.com/massgravel/Microsoft-Activation-Scripts)" } ) $yCard = 130 foreach ($f in $funcoes) { $pnlCard = New-Object System.Windows.Forms.Panel $pnlCard.Location = New-Object System.Drawing.Point(16, $yCard) $pnlCard.Size = New-Object System.Drawing.Size(760, 132) $pnlCard.BackColor = $corPainel $acCard = New-Object System.Windows.Forms.Panel $acCard.Location = New-Object System.Drawing.Point(0, 0); $acCard.Size = New-Object System.Drawing.Size(4, 132); $acCard.BackColor = $f.Cor $pnlCard.Controls.Add($acCard) $lblCardTit = New-Object System.Windows.Forms.Label $lblCardTit.Text = $f.Titulo $lblCardTit.Font = New-Object System.Drawing.Font("Segoe UI", 10, [System.Drawing.FontStyle]::Bold) $lblCardTit.ForeColor = $f.Cor $lblCardTit.Location = New-Object System.Drawing.Point(14, 8); $lblCardTit.AutoSize = $true $pnlCard.Controls.Add($lblCardTit) $lblCardDesc = New-Object System.Windows.Forms.Label $lblCardDesc.Text = $f.Desc $lblCardDesc.Font = New-Object System.Drawing.Font("Segoe UI", 8.5) $lblCardDesc.ForeColor = $corTextoEscuro $lblCardDesc.Location = New-Object System.Drawing.Point(14, 30) $lblCardDesc.Size = New-Object System.Drawing.Size(736, 96) $pnlCard.Controls.Add($lblCardDesc) $pnlHomeScroll.Controls.Add($pnlCard) $yCard += 142 } # Nota de rodape da home $lblHomeNota = New-Object System.Windows.Forms.Label $lblHomeNota.Text = "Use o menu lateral para navegar entre as funcoes. Todas as operacoes sao executadas como Administrador." $lblHomeNota.Font = New-Object System.Drawing.Font("Segoe UI", 8) $lblHomeNota.ForeColor = $corTextoEscuro $lblHomeNota.Location = New-Object System.Drawing.Point(16, ($yCard + 8)) $lblHomeNota.AutoSize = $true $pnlHomeScroll.Controls.Add($lblHomeNota) $pHome.Controls.Add($pnlHomeScroll) # ═══════════════════════════════════════════════════════════ # ABA 1 — INSTALAR # ═══════════════════════════════════════════════════════════ $pInst = $tabPanels[1] # ── Toolbar superior ────────────────────────────────────── $pnlInstTop = New-Object System.Windows.Forms.Panel $pnlInstTop.Dock = "Top"; $pnlInstTop.Height = 44; $pnlInstTop.BackColor = $corPainel $lblBusca = New-Object System.Windows.Forms.Label $lblBusca.Text = "Buscar:"; $lblBusca.Location = New-Object System.Drawing.Point(8,14) $lblBusca.AutoSize = $true; $lblBusca.ForeColor = $corTextoEscuro $txtBusca = New-Object System.Windows.Forms.TextBox $txtBusca.Location = New-Object System.Drawing.Point(60,10); $txtBusca.Size = New-Object System.Drawing.Size(190,24) $txtBusca.BackColor = $corBorda; $txtBusca.ForeColor = $corTextoClaro; $txtBusca.BorderStyle = "FixedSingle" $btnDeselInst = New-Object System.Windows.Forms.Button $btnDeselInst.Text = "Limpar Selecao"; $btnDeselInst.Location = New-Object System.Drawing.Point(258,8); $btnDeselInst.Size = New-Object System.Drawing.Size(120,28) $btnDeselInst.BackColor = $corBorda; $btnDeselInst.ForeColor = $corTextoClaro; $btnDeselInst.FlatStyle = "Flat"; $btnDeselInst.FlatAppearance.BorderSize = 0 $script:lblContador = New-Object System.Windows.Forms.Label $script:lblContador.Text = "0 selecionados"; $script:lblContador.Location = New-Object System.Drawing.Point(386,14) $script:lblContador.AutoSize = $true; $script:lblContador.ForeColor = $corAmarelo $script:lblContador.Font = New-Object System.Drawing.Font("Segoe UI",9,[System.Drawing.FontStyle]::Bold) $pnlInstTop.Controls.AddRange(@($lblBusca,$txtBusca,$btnDeselInst,$script:lblContador)) # ── Scroll principal ────────────────────────────────────── $pnlInstScroll = New-Object System.Windows.Forms.Panel $pnlInstScroll.Dock = "Fill" $pnlInstScroll.BackColor = $corFundo $pnlInstScroll.AutoScroll = $true $script:instGrupos = @{} # Cores por categoria $catCores = @{ "Navegadores" = [System.Drawing.Color]::FromArgb(0, 122, 204) "Midia" = [System.Drawing.Color]::FromArgb(168, 85, 247) "Utilitarios" = [System.Drawing.Color]::FromArgb(35, 197, 120) "Dev" = [System.Drawing.Color]::FromArgb(255,189, 46) "Remoto" = [System.Drawing.Color]::FromArgb(0, 164, 239) "Seguranca" = [System.Drawing.Color]::FromArgb(248, 81, 73) "Criacao" = [System.Drawing.Color]::FromArgb(236, 72, 153) "Comunicacao" = [System.Drawing.Color]::FromArgb(52, 211, 153) } function Atualizar-ContadorInst { $total = 0 foreach ($cat in $script:instGrupos.Keys) { $clb = $script:instGrupos[$cat].CLB for ($i = 0; $i -lt $clb.Items.Count; $i++) { if ($clb.GetItemChecked($i)) { $total++ } } } $script:lblContador.Text = if ($total -gt 0) { "$total selecionado(s)" } else { "0 selecionados" } $script:lblContador.ForeColor = if ($total -gt 0) { $corVerde } else { $corAmarelo } } function Construir-Blocos { param([string]$filtro = "") $pnlInstScroll.Controls.Clear() $script:instGrupos = @{} $ordem = @("Navegadores","Utilitarios","Dev","Remoto","Seguranca","Midia","Criacao","Comunicacao") $porCat = @{} foreach ($p in $programas) { if (-not $porCat.ContainsKey($p.Cat)) { $porCat[$p.Cat] = [System.Collections.ArrayList]@() } $porCat[$p.Cat].Add($p) | Out-Null } $largura = 368 $col = 0 $yPos = 10 $alturaCol0 = 0 foreach ($cat in $ordem) { if (-not $porCat.ContainsKey($cat)) { continue } $itens = if ($filtro) { @($porCat[$cat] | Where-Object { $_.Nome -like "*$filtro*" }) } else { @($porCat[$cat]) } if ($itens.Count -eq 0) { continue } $corCat = if ($catCores.ContainsKey($cat)) { $catCores[$cat] } else { $corDestaque } $alturaCLB = $itens.Count * 22 $alturaBloco = 3 + 28 + $alturaCLB + 6 # barra + header + lista + padding $xPos = if ($col -eq 0) { 10 } else { 390 } $pnlBloco = New-Object System.Windows.Forms.Panel $pnlBloco.Location = New-Object System.Drawing.Point($xPos, $yPos) $pnlBloco.Size = New-Object System.Drawing.Size($largura, $alturaBloco) $pnlBloco.BackColor = $corPainel # Barra colorida no topo $barTopo = New-Object System.Windows.Forms.Panel $barTopo.Location = New-Object System.Drawing.Point(0,0) $barTopo.Size = New-Object System.Drawing.Size($largura, 3) $barTopo.BackColor = $corCat $pnlBloco.Controls.Add($barTopo) # Label da categoria (SEM checkbox) $lblCat = New-Object System.Windows.Forms.Label $lblCat.Text = $cat $lblCat.Font = New-Object System.Drawing.Font("Segoe UI",9,[System.Drawing.FontStyle]::Bold) $lblCat.ForeColor = $corCat $lblCat.BackColor = $corPainel $lblCat.Location = New-Object System.Drawing.Point(10, 6) $lblCat.AutoSize = $true $pnlBloco.Controls.Add($lblCat) # Botão "Sel. todos" discreto ao lado direito $btnSelCat = New-Object System.Windows.Forms.Button $btnSelCat.Text = "sel. todos" $btnSelCat.Font = New-Object System.Drawing.Font("Segoe UI",7) $btnSelCat.ForeColor = $corTextoEscuro $btnSelCat.BackColor = $corPainel $btnSelCat.FlatStyle = "Flat" $btnSelCat.FlatAppearance.BorderSize = 0 $btnSelCat.FlatAppearance.MouseOverBackColor = $corBorda $btnSelCat.Location = New-Object System.Drawing.Point(300, 8) $btnSelCat.Size = New-Object System.Drawing.Size(62, 16) $btnSelCat.Cursor = [System.Windows.Forms.Cursors]::Hand $pnlBloco.Controls.Add($btnSelCat) # CheckedListBox dos programas $clb = New-Object System.Windows.Forms.CheckedListBox $clb.Location = New-Object System.Drawing.Point(6, 31) $clb.Size = New-Object System.Drawing.Size(356, $alturaCLB) $clb.BackColor = $corPainel $clb.ForeColor = $corTextoClaro $clb.BorderStyle = "None" $clb.CheckOnClick = $true $clb.Font = New-Object System.Drawing.Font("Segoe UI",9) $clb.IntegralHeight = $false $clb.Tag = $cat foreach ($p in $itens) { $clb.Items.Add($p.Nome) | Out-Null } $pnlBloco.Controls.Add($clb) $script:instGrupos[$cat] = @{ CLB=$clb; Programas=$itens } # Sel. todos via botão (sem timer, sem event recursivo) $clbRef = $clb $btnSelCat.add_Click({ for ($i = 0; $i -lt $clbRef.Items.Count; $i++) { $clbRef.SetItemChecked($i, $true) } Atualizar-ContadorInst }) # Atualizar contador ao marcar/desmarcar (ItemCheck) $clb.add_ItemCheck({ Atualizar-ContadorInst }) $pnlInstScroll.Controls.Add($pnlBloco) # Controle de posição em 2 colunas if ($col -eq 0) { $alturaCol0 = $alturaBloco $col = 1 } else { $maxH = [Math]::Max($alturaCol0, $alturaBloco) $yPos += $maxH + 10 $col = 0 $alturaCol0 = 0 } } # Se terminou em coluna ímpar, avançar Y if ($col -eq 1) { $yPos += $alturaCol0 + 10 } Atualizar-ContadorInst } Construir-Blocos $txtBusca.add_TextChanged({ Construir-Blocos -filtro $txtBusca.Text }) $btnDeselInst.add_Click({ foreach ($cat in $script:instGrupos.Keys) { $clb = $script:instGrupos[$cat].CLB for ($i = 0; $i -lt $clb.Items.Count; $i++) { $clb.SetItemChecked($i, $false) } } Atualizar-ContadorInst }) # ── Botão Instalar ──────────────────────────────────────── $btnInst = New-Object System.Windows.Forms.Button $btnInst.Text = " Instalar Selecionados" $btnInst.Dock = "Bottom"; $btnInst.Height = 44 $btnInst.BackColor = $corDestaque; $btnInst.ForeColor = $corTextoClaro $btnInst.FlatStyle = "Flat"; $btnInst.FlatAppearance.BorderSize = 0 $btnInst.Font = New-Object System.Drawing.Font("Segoe UI",11,[System.Drawing.FontStyle]::Bold) $script:btnInst = $btnInst $btnInst.add_Click({ $lista = @() foreach ($cat in $script:instGrupos.Keys) { $g = $script:instGrupos[$cat] for ($i = 0; $i -lt $g.CLB.Items.Count; $i++) { if ($g.CLB.GetItemChecked($i)) { $nome = $g.CLB.Items[$i] $prog = $programas | Where-Object { $_.Nome -eq $nome } | Select-Object -First 1 if ($prog) { $lista += $prog } } } } if ($lista.Count -eq 0) { [System.Windows.Forms.MessageBox]::Show("Selecione ao menos um programa.","Atencao","OK","Warning") | Out-Null return } $total = $lista.Count $script:btnInst.Enabled = $false $script:btnInst.Text = "Instalando... (0/$total)" Rodar-Async -Vars @{lista=$lista;totalInst=$total} -Bloco { $n = 0 foreach ($p in $lista) { $n++ Escrever-Log "[$n/$totalInst] Instalando: $($p.Nome)..." try { & winget install --id $p.Winget --silent --accept-package-agreements --accept-source-agreements 2>&1 | Out-Null if ($LASTEXITCODE -eq 0 -or $LASTEXITCODE -eq -1978335189) { Escrever-Log "$($p.Nome) instalado!" "OK" } else { Escrever-Log "Falha: $($p.Nome) (cod $LASTEXITCODE)" "ERRO" } } catch { Escrever-Log "Erro: $_" "ERRO" } } Escrever-Log "=== Instalacao concluida! ($n programas) ===" "OK" } -AoFinalizar { $script:btnInst.Enabled = $true $script:btnInst.Text = " Instalar Selecionados" foreach ($cat in $script:instGrupos.Keys) { $clb = $script:instGrupos[$cat].CLB for ($i = 0; $i -lt $clb.Items.Count; $i++) { $clb.SetItemChecked($i, $false) } } Atualizar-ContadorInst } }) $pInst.Controls.Add($pnlInstScroll) $pInst.Controls.Add($pnlInstTop) $pInst.Controls.Add($btnInst) # ═══════════════════════════════════════════════════════════ # FUNCAO REUTILIZAVEL — Blocos por categoria (Bloatware e Tweaks) # ═══════════════════════════════════════════════════════════ function Criar-AbaBlocos { param( [System.Windows.Forms.Panel]$PainelAba, [array]$Itens, [hashtable]$CatCores, [string[]]$OrdemCats, [string]$TextoBotao, [System.Drawing.Color]$CorBotao, [scriptblock]$AcaoBotao ) # ── Toolbar ─────────────────────────────────────────── $pnlTop = New-Object System.Windows.Forms.Panel $pnlTop.Dock = "Top"; $pnlTop.Height = 44; $pnlTop.BackColor = $corPainel $btnLimpar = New-Object System.Windows.Forms.Button $btnLimpar.Text = "Limpar Selecao" $btnLimpar.Location = New-Object System.Drawing.Point(8,8); $btnLimpar.Size = New-Object System.Drawing.Size(120,28) $btnLimpar.BackColor = $corBorda; $btnLimpar.ForeColor = $corTextoClaro $btnLimpar.FlatStyle = "Flat"; $btnLimpar.FlatAppearance.BorderSize = 0 $lblCont = New-Object System.Windows.Forms.Label $lblCont.Text = "0 selecionados" $lblCont.Location = New-Object System.Drawing.Point(138,14); $lblCont.AutoSize = $true $lblCont.ForeColor = $corAmarelo $lblCont.Font = New-Object System.Drawing.Font("Segoe UI",9,[System.Drawing.FontStyle]::Bold) $pnlTop.Controls.AddRange(@($btnLimpar,$lblCont)) # ── FlowLayoutPanel para os blocos ──────────────────── $flow = New-Object System.Windows.Forms.FlowLayoutPanel $flow.Dock = "Fill" $flow.BackColor = $corFundo $flow.AutoScroll = $true $flow.FlowDirection = "LeftToRight" $flow.WrapContents = $true $flow.Padding = New-Object System.Windows.Forms.Padding(8, 8, 8, 8) # ── Agrupar itens por categoria ─────────────────────── $porCat = @{} foreach ($it in $Itens) { if (-not $porCat.ContainsKey($it.Cat)) { $porCat[$it.Cat] = [System.Collections.ArrayList]@() } $porCat[$it.Cat].Add($it) | Out-Null } # Dicionario de CLBs: cat -> CLB (para leitura no botao) $mapCLB = [System.Collections.Hashtable]::new() $mapItens = [System.Collections.Hashtable]::new() foreach ($cat in $OrdemCats) { if (-not $porCat.ContainsKey($cat)) { continue } $itensBloco = @($porCat[$cat]) if ($itensBloco.Count -eq 0) { continue } $corCat = if ($CatCores.ContainsKey($cat)) { $CatCores[$cat] } else { $corDestaque } $alturaCLB = $itensBloco.Count * 22 $altBloco = 3 + 30 + $alturaCLB + 8 $largBloco = 370 # Painel do bloco $pnlB = New-Object System.Windows.Forms.Panel $pnlB.Size = New-Object System.Drawing.Size($largBloco, $altBloco) $pnlB.BackColor = $corPainel $pnlB.Margin = New-Object System.Windows.Forms.Padding(4) $bar = New-Object System.Windows.Forms.Panel $bar.Location = New-Object System.Drawing.Point(0,0) $bar.Size = New-Object System.Drawing.Size($largBloco, 3) $bar.BackColor= $corCat $pnlB.Controls.Add($bar) $lblTit = New-Object System.Windows.Forms.Label $lblTit.Text = $cat $lblTit.Font = New-Object System.Drawing.Font("Segoe UI",9,[System.Drawing.FontStyle]::Bold) $lblTit.ForeColor = $corCat; $lblTit.BackColor = $corPainel $lblTit.Location = New-Object System.Drawing.Point(10,7); $lblTit.AutoSize = $true $pnlB.Controls.Add($lblTit) $btnSel = New-Object System.Windows.Forms.Button $btnSel.Text = "sel. todos" $btnSel.Font = New-Object System.Drawing.Font("Segoe UI",7) $btnSel.ForeColor = $corTextoEscuro; $btnSel.BackColor = $corPainel $btnSel.FlatStyle = "Flat"; $btnSel.FlatAppearance.BorderSize = 0 $btnSel.FlatAppearance.MouseOverBackColor = $corBorda $btnSel.Location = New-Object System.Drawing.Point(300, 9) $btnSel.Size = New-Object System.Drawing.Size(64, 16) $btnSel.Cursor = [System.Windows.Forms.Cursors]::Hand $pnlB.Controls.Add($btnSel) $clb = New-Object System.Windows.Forms.CheckedListBox $clb.Location = New-Object System.Drawing.Point(6, 33) $clb.Size = New-Object System.Drawing.Size(358, $alturaCLB) $clb.BackColor = $corPainel; $clb.ForeColor = $corTextoClaro $clb.BorderStyle = "None"; $clb.CheckOnClick = $true $clb.Font = New-Object System.Drawing.Font("Segoe UI",9) $clb.IntegralHeight = $false foreach ($it in $itensBloco) { $clb.Items.Add($it.Nome) | Out-Null } $pnlB.Controls.Add($clb) $mapCLB[$cat] = $clb $mapItens[$cat] = $itensBloco # sel. todos — capturar clb por valor com GetNewClosure $clbCapt = $clb $btnSel.add_Click({ for ($i=0;$i -lt $clbCapt.Items.Count;$i++) { $clbCapt.SetItemChecked($i,$true) } }.GetNewClosure()) $flow.Controls.Add($pnlB) } # ── Botão de ação ───────────────────────────────────── $btnAcao = New-Object System.Windows.Forms.Button $btnAcao.Text = $TextoBotao; $btnAcao.Dock = "Bottom"; $btnAcao.Height = 44 $btnAcao.BackColor = $CorBotao $btnAcao.ForeColor = if ($CorBotao.R -lt 200 -or $CorBotao.G -gt 150) { $corFundo } else { $corTextoClaro } $btnAcao.FlatStyle = "Flat"; $btnAcao.FlatAppearance.BorderSize = 0 $btnAcao.Font = New-Object System.Drawing.Font("Segoe UI",11,[System.Drawing.FontStyle]::Bold) # Capturar mapas por valor para os handlers $mapCLBCapt = $mapCLB $mapItensCapt = $mapItens $lblContCapt = $lblCont $acaoCapt = $AcaoBotao $corVerdeCapt = $corVerde $corAmarCapt = $corAmarelo $btnLimpar.add_Click({ foreach ($c in $mapCLBCapt.Values) { for ($i=0;$i -lt $c.Items.Count;$i++) { $c.SetItemChecked($i,$false) } } $lblContCapt.Text = "0 selecionados"; $lblContCapt.ForeColor = $corAmarCapt }.GetNewClosure()) $btnAcao.add_Click({ $lista = [System.Collections.ArrayList]@() foreach ($cat in $mapCLBCapt.Keys) { $c = $mapCLBCapt[$cat] $itns = $mapItensCapt[$cat] for ($i=0;$i -lt $c.Items.Count;$i++) { if ($c.GetItemChecked($i)) { $lista.Add($itns[$i].Dados) | Out-Null } } } if ($lista.Count -eq 0) { [System.Windows.Forms.MessageBox]::Show("Selecione ao menos um item.","Atencao","OK","Warning") | Out-Null return } & $acaoCapt $lista }.GetNewClosure()) $PainelAba.Controls.Add($flow) $PainelAba.Controls.Add($pnlTop) $PainelAba.Controls.Add($btnAcao) return @{ MapCLB=$mapCLB; MapItens=$mapItens; BtnAcao=$btnAcao; LblCont=$lblCont } } # ═══════════════════════════════════════════════════════════ # ABA 2 — BLOATWARE (blocos por risco) # ═══════════════════════════════════════════════════════════ $pDeb = $tabPanels[2] $bloatItens = $bloatware | ForEach-Object { $cat = switch($_.Risco) { "Baixo" { "OK - Seguro Remover" } "Medio" { "Medio - Remover com Cuidado" } "Alto" { "Agressivo - Alto Impacto" } } [PSCustomObject]@{ Nome=$_.Nome; Cat=$cat; Dados=$_ } } $bloatCores = @{ "OK - Seguro Remover" = $corVerde "Medio - Remover com Cuidado" = $corAmarelo "Agressivo - Alto Impacto" = $corVermelho } $bloatOrdem = @("OK - Seguro Remover","Medio - Remover com Cuidado","Agressivo - Alto Impacto") $script:btnRem = $null $debResult = Criar-AbaBlocos -PainelAba $pDeb -Itens $bloatItens -CatCores $bloatCores -OrdemCats $bloatOrdem ` -TextoBotao " Remover Selecionados" -CorBotao $corVermelho -AcaoBotao { param($lista) $total = $lista.Count $conf = [System.Windows.Forms.MessageBox]::Show( "Remover $total item(ns) selecionado(s)?`nEssa acao e dificil de desfazer.", "Confirmar Remocao","YesNo","Warning") if ($conf -ne "Yes") { return } $script:btnRem.Enabled = $false; $script:btnRem.Text = "Removendo..." Rodar-Async -Vars @{lista=$lista} -Bloco { foreach ($b in $lista) { Escrever-Log "Removendo: $($b.Nome)..." try { if ($b.Pkg -eq "OneDrive") { Get-Process "OneDrive" -EA SilentlyContinue | Stop-Process -Force @("$env:LOCALAPPDATA\Microsoft\OneDrive\OneDriveSetup.exe","$env:SYSTEMROOT\SysWOW64\OneDriveSetup.exe") | Where-Object { Test-Path $_ } | ForEach-Object { Start-Process $_ -ArgumentList "/uninstall" -Wait -NoNewWindow } Escrever-Log "OneDrive removido!" "OK"; continue } Get-AppxPackage -Name "*$($b.Pkg)*" -AllUsers -EA SilentlyContinue | Remove-AppxPackage -AllUsers -EA SilentlyContinue Get-AppxProvisionedPackage -Online -EA SilentlyContinue | Where-Object { $_.PackageName -like "*$($b.Pkg)*" } | Remove-AppxProvisionedPackage -Online -EA SilentlyContinue Escrever-Log "$($b.Nome) removido!" "OK" } catch { Escrever-Log "Aviso ($($b.Nome)): $_" "AVISO" } } Escrever-Log "=== Debloat concluido! ===" "OK" } -AoFinalizar { $script:btnRem.Enabled=$true; $script:btnRem.Text=" Remover Selecionados" } } $script:btnRem = $debResult.BtnAcao # ═══════════════════════════════════════════════════════════ # ABA 3 — TWEAKS + SERVICOS (blocos por categoria) # ═══════════════════════════════════════════════════════════ $pTwk = $tabPanels[3] $tweakItens = $tweaks | ForEach-Object { [PSCustomObject]@{ Nome=$_.Nome; Cat=$_.Cat; Dados=$_ } } $tweakCores = @{ "Performance" = [System.Drawing.Color]::FromArgb(0, 122, 204) "Privacidade" = [System.Drawing.Color]::FromArgb(168, 85, 247) "Interface" = [System.Drawing.Color]::FromArgb(35, 197, 120) "Servicos" = [System.Drawing.Color]::FromArgb(255, 189, 46) } $tweakOrdem = @("Performance","Privacidade","Interface","Servicos") $script:btnApl = $null $twkResult = Criar-AbaBlocos -PainelAba $pTwk -Itens $tweakItens -CatCores $tweakCores -OrdemCats $tweakOrdem ` -TextoBotao " Aplicar Selecionados" -CorBotao $corAmarelo -AcaoBotao { param($lista) $script:btnApl.Enabled = $false; $script:btnApl.Text = "Aplicando..." $listaAcoes = $lista | ForEach-Object { $_.Acao } $fnTweak = ${function:Aplicar-Tweak-Item}.ToString() Rodar-Async -Vars @{listaAcoes=$listaAcoes;fnTweak=$fnTweak} -Bloco { Invoke-Expression "function RegSet { $fnRegSet }" Invoke-Expression "function Svc-Disable { $fnSvcDis }" Invoke-Expression "function Aplicar-Tweak-Item { $fnTweak }" foreach ($a in $listaAcoes) { Aplicar-Tweak-Item -Acao $a } Escrever-Log "=== Tweaks aplicados! ===" "OK" } -AoFinalizar { $script:btnApl.Enabled=$true; $script:btnApl.Text=" Aplicar Selecionados" $r=[System.Windows.Forms.MessageBox]::Show("Concluido! Reiniciar Explorer agora?","Concluido","YesNo","Information") if($r -eq "Yes"){Stop-Process -Name "explorer" -Force -EA SilentlyContinue;Start-Sleep 1;Start-Process "explorer"} } } $script:btnApl = $twkResult.BtnAcao # ═══════════════════════════════════════════════════════════ # ABA 3 — SISTEMA # ═══════════════════════════════════════════════════════════ $pSis = $tabPanels[4] $pnlSisScroll = New-Object System.Windows.Forms.Panel $pnlSisScroll.Dock="Fill";$pnlSisScroll.BackColor=$corFundo;$pnlSisScroll.AutoScroll=$true $sisAcoes = @( @{Txt="Hardware Detalhado"; Desc="CPU, RAM, slots, placa-mae, SSD/HD — tudo detalhado"; Cor=$corVerde; Cmd="hwinfo" } @{Txt="Configurar DNS"; Desc="Define DNS nos adaptadores: Google, Cloudflare, anti-AD e mais"; Cor=$corVerde; Cmd="dnsconf" } @{Txt="Limpeza de Disco"; Desc="Executa cleanmgr com todas as opcoes"; Cor=$corDestaque; Cmd="cleanmgr" } @{Txt="SFC /scannow"; Desc="Verifica e repara arquivos do sistema"; Cor=$corAmarelo; Cmd="sfc" } @{Txt="DISM RestoreHealth"; Desc="Repara imagem do Windows (pode demorar)"; Cor=$corAmarelo; Cmd="dism" } @{Txt="Resetar TCP/IP"; Desc="Reseta Winsock, DNS e pilha de rede"; Cor=$corDestaque; Cmd="tcp" } @{Txt="Flush DNS"; Desc="Limpa cache DNS do sistema"; Cor=$corBorda; Cmd="dns" } @{Txt="Reiniciar Explorer"; Desc="Reinicia o Explorer sem reiniciar o PC"; Cor=$corBorda; Cmd="exp" } @{Txt="Gerenc. de Tarefas"; Desc="Abre o Gerenciador de Tarefas"; Cor=$corBorda; Cmd="taskmgr" } @{Txt="Gerenc. de Disco"; Desc="Abre o Gerenciamento de Disco"; Cor=$corBorda; Cmd="diskmgmt"} @{Txt="Editor de Registro"; Desc="Abre o Regedit"; Cor=$corBorda; Cmd="regedit" } @{Txt="Windows Update"; Desc="Abre as configuracoes do Windows Update"; Cor=$corBorda; Cmd="wupd" } @{Txt="Informacoes (msinfo)";Desc="Abre msinfo32 com dados completos do sistema"; Cor=$corBorda; Cmd="info" } @{Txt="Reiniciar PC"; Desc="Reinicia o computador imediatamente"; Cor=$corVermelho; Cmd="reboot" } ) $y = 10 foreach ($a in $sisAcoes) { $pnl = New-Object System.Windows.Forms.Panel $pnl.Location=New-Object System.Drawing.Point(10,$y);$pnl.Size=New-Object System.Drawing.Size(720,52);$pnl.BackColor=$corPainel $btn = New-Object System.Windows.Forms.Button $btn.Text=$a.Txt;$btn.Location=New-Object System.Drawing.Point(0,0);$btn.Size=New-Object System.Drawing.Size(185,52) $btn.BackColor=$a.Cor;$btn.ForeColor=if($a.Cor -eq $corAmarelo){$corFundo}else{$corTextoClaro} $btn.FlatStyle="Flat";$btn.FlatAppearance.BorderSize=0;$btn.Font=New-Object System.Drawing.Font("Segoe UI",9,[System.Drawing.FontStyle]::Bold);$btn.Tag=$a.Cmd $lbl = New-Object System.Windows.Forms.Label $lbl.Text=$a.Desc;$lbl.Location=New-Object System.Drawing.Point(195,16);$lbl.Size=New-Object System.Drawing.Size(515,24);$lbl.ForeColor=$corTextoEscuro $btn.add_Click({ switch($this.Tag){ "hwinfo" { Mostrar-HardwareInfo } "dnsconf" { Mostrar-ConfigurarDNS } "cleanmgr" { Start-Process "cleanmgr" -ArgumentList "/sagerun:1";Escrever-Log "Limpeza de Disco iniciada..." } "sfc" { Start-Process "cmd" -ArgumentList "/k sfc /scannow" -Verb RunAs } "dism" { Start-Process "cmd" -ArgumentList "/k DISM /Online /Cleanup-Image /RestoreHealth" -Verb RunAs } "tcp" { &netsh winsock reset|Out-Null;&netsh int ip reset|Out-Null;&ipconfig /flushdns|Out-Null;Escrever-Log "TCP/IP resetado!" "OK" } "dns" { &ipconfig /flushdns|Out-Null;Escrever-Log "Cache DNS limpo!" "OK" } "exp" { Stop-Process -Name "explorer" -Force -EA SilentlyContinue;Start-Sleep 1;Start-Process "explorer";Escrever-Log "Explorer reiniciado!" "OK" } "taskmgr" { Start-Process "taskmgr" } "diskmgmt" { Start-Process "diskmgmt.msc" } "regedit" { Start-Process "regedit" -Verb RunAs } "wupd" { Start-Process "ms-settings:windowsupdate" } "info" { Start-Process "msinfo32" } "reboot" { $r=[System.Windows.Forms.MessageBox]::Show("Reiniciar agora?","Confirmar","YesNo","Warning");if($r -eq "Yes"){Restart-Computer -Force} } } }) $pnl.Controls.AddRange(@($btn,$lbl));$pnlSisScroll.Controls.Add($pnl);$y+=62 } $pSis.Controls.Add($pnlSisScroll) # ═══════════════════════════════════════════════════════════ # FUNCAO: JANELA DE CONFIGURACAO DE DNS # ═══════════════════════════════════════════════════════════ function Mostrar-ConfigurarDNS { Escrever-Log "Abrindo configurador de DNS..." # ── Tabela de servidores DNS ─────────────────────────── $dnsList = @( # Nome | Primario | Secundario | Categoria | Descricao [PSCustomObject]@{ Nome="Google Public DNS"; Pri="8.8.8.8"; Sec="8.8.4.4"; Cat="Geral"; Desc="Rapido e confiavel. Nao bloqueia nada." } [PSCustomObject]@{ Nome="Cloudflare DNS"; Pri="1.1.1.1"; Sec="1.0.0.1"; Cat="Geral"; Desc="Mais rapido do mundo (Cloudflare). Privacidade sem logs." } [PSCustomObject]@{ Nome="Cloudflare + WARP"; Pri="1.1.1.2"; Sec="1.0.0.2"; Cat="Seguranca"; Desc="Cloudflare — bloqueia malware." } [PSCustomObject]@{ Nome="Cloudflare Familia"; Pri="1.1.1.3"; Sec="1.0.0.3"; Cat="Familia"; Desc="Cloudflare — bloqueia malware e conteudo adulto." } [PSCustomObject]@{ Nome="OpenDNS Home"; Pri="208.67.222.222"; Sec="208.67.220.220"; Cat="Seguranca"; Desc="Cisco OpenDNS — bloqueia phishing e malware." } [PSCustomObject]@{ Nome="OpenDNS FamilyShield"; Pri="208.67.222.123"; Sec="208.67.220.123"; Cat="Familia"; Desc="Cisco — bloqueia conteudo adulto automaticamente." } [PSCustomObject]@{ Nome="Quad9 (Seguro)"; Pri="9.9.9.9"; Sec="149.112.112.112"; Cat="Seguranca"; Desc="Bloqueia dominios maliciosos. Sem rastreamento." } [PSCustomObject]@{ Nome="Quad9 + EDNS"; Pri="9.9.9.11"; Sec="149.112.112.11"; Cat="Seguranca"; Desc="Quad9 com suporte a EDNS Client Subnet." } [PSCustomObject]@{ Nome="AdGuard DNS"; Pri="94.140.14.14"; Sec="94.140.15.15"; Cat="Anti-Anuncio";Desc="Bloqueia anuncios, trackers e malware em toda a rede." } [PSCustomObject]@{ Nome="AdGuard Familia"; Pri="94.140.14.15"; Sec="94.140.15.16"; Cat="Familia"; Desc="AdGuard + bloqueio de conteudo adulto." } [PSCustomObject]@{ Nome="NextDNS"; Pri="45.90.28.0"; Sec="45.90.30.0"; Cat="Anti-Anuncio";Desc="DNS configuravel. Bloqueia ADs, trackers e mais." } [PSCustomObject]@{ Nome="Control D (Anuncios)"; Pri="76.76.2.2"; Sec="76.76.10.2"; Cat="Anti-Anuncio";Desc="ControlD — bloqueia anuncios e trackers." } [PSCustomObject]@{ Nome="DNS.Watch"; Pri="84.200.69.80"; Sec="84.200.70.40"; Cat="Privacidade"; Desc="Sem logs, sem filtragem, neutro e privado." } [PSCustomObject]@{ Nome="Comodo Secure DNS"; Pri="8.26.56.26"; Sec="8.20.247.20"; Cat="Seguranca"; Desc="Comodo — bloqueia malware e phishing." } [PSCustomObject]@{ Nome="Level3 DNS"; Pri="209.244.0.3"; Sec="209.244.0.4"; Cat="Geral"; Desc="DNS corporativo rapido. Sem filtragem." } [PSCustomObject]@{ Nome="Verisign Public DNS"; Pri="64.6.64.6"; Sec="64.6.65.6"; Cat="Geral"; Desc="Verisign — estavel, privado, sem redirecionamentos." } [PSCustomObject]@{ Nome="CleanBrowsing (Adultos)"; Pri="185.228.168.168"; Sec="185.228.169.168"; Cat="Familia"; Desc="Bloqueia conteudo adulto e sites suspeitos." } [PSCustomObject]@{ Nome="CleanBrowsing (Seguranca)"; Pri="185.228.168.9"; Sec="185.228.169.9"; Cat="Seguranca"; Desc="Bloqueia malware, phishing e botnets." } [PSCustomObject]@{ Nome="Alternativo DNS (Anti-AD)"; Pri="76.76.19.19"; Sec="76.223.122.150"; Cat="Anti-Anuncio";Desc="Bloqueia anuncios sem necessidade de extensao." } [PSCustomObject]@{ Nome="AUTOMATICO (DHCP)"; Pri=""; Sec=""; Cat="Sistema"; Desc="Remove DNS fixo. Volta a usar o DNS do roteador/DHCP." } ) $frmDNS = New-Object System.Windows.Forms.Form $frmDNS.Text = "VicTool — Configurar DNS" $frmDNS.Size = New-Object System.Drawing.Size(900, 680) $frmDNS.StartPosition = "CenterScreen" $frmDNS.BackColor = $corFundo $frmDNS.ForeColor = $corTexto $frmDNS.Font = New-Object System.Drawing.Font("Segoe UI", 9) $frmDNS.Icon = Criar-Icone # Header $pnlDNSHdr = New-Object System.Windows.Forms.Panel $pnlDNSHdr.Dock = "Top"; $pnlDNSHdr.Height = 56; $pnlDNSHdr.BackColor = $corPainel $pnlAccDNS = New-Object System.Windows.Forms.Panel $pnlAccDNS.Dock = "Top"; $pnlAccDNS.Height = 3; $pnlAccDNS.BackColor = $corVerde $lblDNSTit = New-Object System.Windows.Forms.Label $lblDNSTit.Text = "Configurar DNS"; $lblDNSTit.Font = New-Object System.Drawing.Font("Segoe UI",15,[System.Drawing.FontStyle]::Bold) $lblDNSTit.ForeColor = $corVerde; $lblDNSTit.Location = New-Object System.Drawing.Point(16,10); $lblDNSTit.AutoSize = $true $lblDNSSub = New-Object System.Windows.Forms.Label $lblDNSSub.Text = "Selecione um servidor DNS e o adaptador de rede. A mudanca e aplicada imediatamente." $lblDNSSub.ForeColor = $corTextoEscuro; $lblDNSSub.Location = New-Object System.Drawing.Point(18,36); $lblDNSSub.AutoSize = $true $pnlDNSHdr.Controls.AddRange(@($lblDNSTit,$lblDNSSub)) $frmDNS.Controls.Add($pnlAccDNS) $frmDNS.Controls.Add($pnlDNSHdr) # Layout: lista DNS (esquerda) | detalhe + adaptadores (direita) $pnlDNSBody = New-Object System.Windows.Forms.Panel $pnlDNSBody.Location = New-Object System.Drawing.Point(0, 59) $pnlDNSBody.Size = New-Object System.Drawing.Size(900, 580) $pnlDNSBody.Anchor = "Top,Left,Bottom,Right" $pnlDNSBody.BackColor= $corFundo $frmDNS.Controls.Add($pnlDNSBody) # ── Lista de DNS (esquerda) ──────────────────────────── $pnlDNSLeft = New-Object System.Windows.Forms.Panel $pnlDNSLeft.Location = New-Object System.Drawing.Point(0, 0) $pnlDNSLeft.Size = New-Object System.Drawing.Size(310, 580) $pnlDNSLeft.Anchor = "Top,Left,Bottom" $pnlDNSLeft.BackColor = $corPainel $pnlDNSBody.Controls.Add($pnlDNSLeft) $sepDNS = New-Object System.Windows.Forms.Panel $sepDNS.Location = New-Object System.Drawing.Point(310,0); $sepDNS.Size = New-Object System.Drawing.Size(1,580) $sepDNS.Anchor = "Top,Left,Bottom"; $sepDNS.BackColor = $corBorda $pnlDNSBody.Controls.Add($sepDNS) # Filtro por categoria $pnlDNSFiltro = New-Object System.Windows.Forms.Panel $pnlDNSFiltro.Location = New-Object System.Drawing.Point(0, 0) $pnlDNSFiltro.Size = New-Object System.Drawing.Size(310, 38) $pnlDNSFiltro.Anchor = "Top,Left,Right" $pnlDNSFiltro.BackColor = $corFundo $lblDNSCat = New-Object System.Windows.Forms.Label $lblDNSCat.Text = "Filtrar:"; $lblDNSCat.Location = New-Object System.Drawing.Point(8,11); $lblDNSCat.AutoSize = $true; $lblDNSCat.ForeColor = $corTextoEscuro $cmbDNSCat = New-Object System.Windows.Forms.ComboBox $cmbDNSCat.Location = New-Object System.Drawing.Point(54,7); $cmbDNSCat.Size = New-Object System.Drawing.Size(245,24) $cmbDNSCat.BackColor = $corBorda; $cmbDNSCat.ForeColor = $corTextoClaro $cmbDNSCat.FlatStyle = "Flat"; $cmbDNSCat.DropDownStyle = "DropDownList" @("Todos","Geral","Seguranca","Anti-Anuncio","Familia","Privacidade","Sistema") | ForEach-Object { $cmbDNSCat.Items.Add($_) | Out-Null } $cmbDNSCat.SelectedIndex = 0 $pnlDNSFiltro.Controls.AddRange(@($lblDNSCat,$cmbDNSCat)) $pnlDNSLeft.Controls.Add($pnlDNSFiltro) # ListBox abaixo do filtro, com posicao fixa $lbDNS = New-Object System.Windows.Forms.ListBox $lbDNS.Location = New-Object System.Drawing.Point(0, 38) $lbDNS.Size = New-Object System.Drawing.Size(310, 542) $lbDNS.Anchor = "Top,Left,Bottom" $lbDNS.BackColor = $corPainel; $lbDNS.ForeColor = $corTextoClaro $lbDNS.BorderStyle = "None"; $lbDNS.Font = New-Object System.Drawing.Font("Segoe UI",9) $lbDNS.ItemHeight = 22 $pnlDNSLeft.Controls.Add($lbDNS) # Mapa índice visível -> entrada na $dnsList $script:dnsMap = @{} function RefreshDNSList { param([string]$cat = "Todos") $lbDNS.Items.Clear() $script:dnsMap = @{} $j = 0 for ($i = 0; $i -lt $dnsList.Count; $i++) { $d = $dnsList[$i] if ($cat -eq "Todos" -or $d.Cat -eq $cat) { $lbDNS.Items.Add(" [$($d.Cat.PadRight(11))] $($d.Nome)") | Out-Null $script:dnsMap[$j] = $i $j++ } } if ($lbDNS.Items.Count -gt 0) { $lbDNS.SelectedIndex = 0 } } RefreshDNSList $cmbDNSCat.add_SelectedIndexChanged({ RefreshDNSList -cat $cmbDNSCat.SelectedItem }) # ── Painel direito: detalhe + adaptadores ────────────── $pnlDNSRight = New-Object System.Windows.Forms.Panel $pnlDNSRight.Location = New-Object System.Drawing.Point(311, 0) $pnlDNSRight.Size = New-Object System.Drawing.Size(589, 580) $pnlDNSRight.Anchor = "Top,Left,Bottom,Right" $pnlDNSRight.BackColor = $corFundo $pnlDNSBody.Controls.Add($pnlDNSRight) # Card de detalhe do DNS selecionado $pnlDNSDetalhe = New-Object System.Windows.Forms.Panel $pnlDNSDetalhe.Location = New-Object System.Drawing.Point(10, 10) $pnlDNSDetalhe.Size = New-Object System.Drawing.Size(569, 130) $pnlDNSDetalhe.BackColor = $corPainel $pnlDNSRight.Controls.Add($pnlDNSDetalhe) $acDet = New-Object System.Windows.Forms.Panel $acDet.Location = New-Object System.Drawing.Point(0,0); $acDet.Size = New-Object System.Drawing.Size(4,130); $acDet.BackColor = $corVerde $pnlDNSDetalhe.Controls.Add($acDet) $lblDetNome = New-Object System.Windows.Forms.Label $lblDetNome.Text = "Selecione um DNS na lista"; $lblDetNome.Font = New-Object System.Drawing.Font("Segoe UI",12,[System.Drawing.FontStyle]::Bold) $lblDetNome.ForeColor = $corTextoClaro; $lblDetNome.Location = New-Object System.Drawing.Point(14,10); $lblDetNome.Size = New-Object System.Drawing.Size(545,24) $lblDetDesc = New-Object System.Windows.Forms.Label $lblDetDesc.Text = ""; $lblDetDesc.ForeColor = $corTextoEscuro $lblDetDesc.Location = New-Object System.Drawing.Point(14,36); $lblDetDesc.Size = New-Object System.Drawing.Size(545,36) $lblDetPri = New-Object System.Windows.Forms.Label $lblDetPri.Text = ""; $lblDetPri.Font = New-Object System.Drawing.Font("Consolas",10,[System.Drawing.FontStyle]::Bold) $lblDetPri.ForeColor = $corVerde; $lblDetPri.Location = New-Object System.Drawing.Point(14,76); $lblDetPri.AutoSize = $true $lblDetSec = New-Object System.Windows.Forms.Label $lblDetSec.Text = ""; $lblDetSec.Font = New-Object System.Drawing.Font("Consolas",10) $lblDetSec.ForeColor = $corAmarelo; $lblDetSec.Location = New-Object System.Drawing.Point(14,98); $lblDetSec.AutoSize = $true $pnlDNSDetalhe.Controls.AddRange(@($lblDetNome,$lblDetDesc,$lblDetPri,$lblDetSec)) # Atualizar detalhe ao selecionar $lbDNS.add_SelectedIndexChanged({ if ($lbDNS.SelectedIndex -lt 0) { return } $realIdx = $script:dnsMap[$lbDNS.SelectedIndex] $d = $dnsList[$realIdx] $lblDetNome.Text = $d.Nome $lblDetDesc.Text = $d.Desc if ($d.Pri -eq "") { $lblDetPri.Text = "Primario : Automatico (DHCP)" $lblDetSec.Text = "Secundario: Automatico (DHCP)" $acDet.BackColor = $corTextoEscuro } else { $lblDetPri.Text = "Primario : $($d.Pri)" $lblDetSec.Text = "Secundario: $($d.Sec)" $catCor = switch($d.Cat){ "Anti-Anuncio"{ [System.Drawing.Color]::FromArgb(255,100,50) } "Familia" { [System.Drawing.Color]::FromArgb(236,72,153) } "Seguranca" { $corAmarelo } "Privacidade" { [System.Drawing.Color]::FromArgb(168,85,247) } default { $corVerde } } $acDet.BackColor = $catCor } }) # Titulo: adaptadores $lblAdapTit = New-Object System.Windows.Forms.Label $lblAdapTit.Text = "Adaptadores de Rede Disponiveis" $lblAdapTit.Font = New-Object System.Drawing.Font("Segoe UI",10,[System.Drawing.FontStyle]::Bold) $lblAdapTit.ForeColor = $corTextoEscuro; $lblAdapTit.Location = New-Object System.Drawing.Point(10,150); $lblAdapTit.AutoSize = $true $pnlDNSRight.Controls.Add($lblAdapTit) # Lista de adaptadores com checkbox $clbAdap = New-Object System.Windows.Forms.CheckedListBox $clbAdap.Location = New-Object System.Drawing.Point(10, 174) $clbAdap.Size = New-Object System.Drawing.Size(569, 200) $clbAdap.Anchor = "Top,Left,Right" $clbAdap.BackColor = $corPainel; $clbAdap.ForeColor = $corTextoClaro $clbAdap.BorderStyle = "None"; $clbAdap.CheckOnClick = $true $clbAdap.Font = New-Object System.Drawing.Font("Consolas",8.5) $pnlDNSRight.Controls.Add($clbAdap) # Carregar adaptadores ativos $adaptadores = Get-NetAdapter | Where-Object { $_.Status -eq "Up" } | Sort-Object Name $adapterMap = @{} $ai = 0 foreach ($adap in $adaptadores) { $dnsAtual = (Get-DnsClientServerAddress -InterfaceIndex $adap.InterfaceIndex -AddressFamily IPv4 -ErrorAction SilentlyContinue).ServerAddresses -join ", " if (-not $dnsAtual) { $dnsAtual = "DHCP/Automatico" } $clbAdap.Items.Add(" $($adap.Name.PadRight(30)) | DNS atual: $dnsAtual") | Out-Null $adapterMap[$ai] = $adap $ai++ } # Botao selecionar todos os adaptadores $btnSelAdap = New-Object System.Windows.Forms.Button $btnSelAdap.Text = "Selec. Todos os Adaptadores" $btnSelAdap.Location = New-Object System.Drawing.Point(10, 378); $btnSelAdap.Size = New-Object System.Drawing.Size(220,28) $btnSelAdap.BackColor = $corBorda; $btnSelAdap.ForeColor = $corTextoClaro $btnSelAdap.FlatStyle = "Flat"; $btnSelAdap.FlatAppearance.BorderSize = 0 $btnSelAdap.add_Click({ for($i=0;$i -lt $clbAdap.Items.Count;$i++){$clbAdap.SetItemChecked($i,$true)} }) $pnlDNSRight.Controls.Add($btnSelAdap) # Status label $lblDNSStatus = New-Object System.Windows.Forms.Label $lblDNSStatus.Text = "" $lblDNSStatus.Location = New-Object System.Drawing.Point(10, 415); $lblDNSStatus.Size = New-Object System.Drawing.Size(569,40) $lblDNSStatus.ForeColor = $corVerde; $lblDNSStatus.Font = New-Object System.Drawing.Font("Segoe UI",9,[System.Drawing.FontStyle]::Bold) $pnlDNSRight.Controls.Add($lblDNSStatus) # Botao APLICAR $btnDNSAplicar = New-Object System.Windows.Forms.Button $btnDNSAplicar.Text = "Aplicar DNS Selecionado" $btnDNSAplicar.Location = New-Object System.Drawing.Point(10, 460); $btnDNSAplicar.Size = New-Object System.Drawing.Size(280,50) $btnDNSAplicar.BackColor = $corVerde; $btnDNSAplicar.ForeColor = $corFundo $btnDNSAplicar.FlatStyle = "Flat"; $btnDNSAplicar.FlatAppearance.BorderSize = 0 $btnDNSAplicar.Font = New-Object System.Drawing.Font("Segoe UI",12,[System.Drawing.FontStyle]::Bold) $btnDNSAplicar.Cursor = [System.Windows.Forms.Cursors]::Hand $pnlDNSRight.Controls.Add($btnDNSAplicar) # Botao RESTAURAR DHCP $btnDNSDHCP = New-Object System.Windows.Forms.Button $btnDNSDHCP.Text = "Restaurar DHCP Automatico" $btnDNSDHCP.Location = New-Object System.Drawing.Point(300, 460); $btnDNSDHCP.Size = New-Object System.Drawing.Size(279,50) $btnDNSDHCP.BackColor = $corBorda; $btnDNSDHCP.ForeColor = $corTextoClaro $btnDNSDHCP.FlatStyle = "Flat"; $btnDNSDHCP.FlatAppearance.BorderSize = 0 $btnDNSDHCP.Font = New-Object System.Drawing.Font("Segoe UI",11,[System.Drawing.FontStyle]::Bold) $btnDNSDHCP.Cursor = [System.Windows.Forms.Cursors]::Hand $pnlDNSRight.Controls.Add($btnDNSDHCP) # Nota $lblDNSNota = New-Object System.Windows.Forms.Label $lblDNSNota.Text = "A mudanca de DNS e aplicada imediatamente. Para IPv6, configure manualmente se necessario." $lblDNSNota.ForeColor = $corTextoEscuro; $lblDNSNota.Font = New-Object System.Drawing.Font("Segoe UI",8) $lblDNSNota.Location = New-Object System.Drawing.Point(10,520); $lblDNSNota.Size = New-Object System.Drawing.Size(569,20) $pnlDNSRight.Controls.Add($lblDNSNota) # ── Acao: Aplicar DNS ────────────────────────────────── $btnDNSAplicar.add_Click({ if ($lbDNS.SelectedIndex -lt 0) { [System.Windows.Forms.MessageBox]::Show("Selecione um servidor DNS na lista.","Atencao","OK","Warning") | Out-Null return } $checkedAdap = @($clbAdap.CheckedIndices) if ($checkedAdap.Count -eq 0) { [System.Windows.Forms.MessageBox]::Show("Selecione ao menos um adaptador de rede.","Atencao","OK","Warning") | Out-Null return } $realIdx = $script:dnsMap[$lbDNS.SelectedIndex] $dSel = $dnsList[$realIdx] if ($dSel.Pri -eq "") { # Modo DHCP — delegar para o botao DHCP foreach ($ci in $checkedAdap) { $adap = $adapterMap[$ci] try { Set-DnsClientServerAddress -InterfaceIndex $adap.InterfaceIndex -ResetServerAddresses -ErrorAction Stop & netsh interface ip set dns name="`"$($adap.Name)`"" source=dhcp | Out-Null Escrever-Log "DNS de '$($adap.Name)' restaurado para DHCP!" "OK" } catch { Escrever-Log "Erro em '$($adap.Name)': $_" "ERRO" } } $lblDNSStatus.Text = "DNS restaurado para DHCP em $($checkedAdap.Count) adaptador(es)." $lblDNSStatus.ForeColor = $corAmarelo } else { $conf = [System.Windows.Forms.MessageBox]::Show( "Aplicar '$($dSel.Nome)' ($($dSel.Pri) / $($dSel.Sec)) em $($checkedAdap.Count) adaptador(es)?", "Confirmar", "YesNo", "Question") if ($conf -ne "Yes") { return } $ok = 0; $err = 0 foreach ($ci in $checkedAdap) { $adap = $adapterMap[$ci] try { Set-DnsClientServerAddress -InterfaceIndex $adap.InterfaceIndex ` -ServerAddresses @($dSel.Pri, $dSel.Sec) -ErrorAction Stop Escrever-Log "DNS '$($dSel.Nome)' aplicado em '$($adap.Name)' ($($dSel.Pri) / $($dSel.Sec))" "OK" $ok++ } catch { # Fallback via netsh try { & netsh interface ip set dns name="`"$($adap.Name)`"" static $dSel.Pri primary | Out-Null & netsh interface ip add dns name="`"$($adap.Name)`"" addr=$dSel.Sec index=2 | Out-Null Escrever-Log "DNS '$($dSel.Nome)' aplicado via netsh em '$($adap.Name)'" "OK" $ok++ } catch { Escrever-Log "Erro em '$($adap.Name)': $_" "ERRO"; $err++ } } } $lblDNSStatus.Text = "Aplicado em $ok adaptador(es)$(if($err -gt 0){" | $err erro(s)"})" $lblDNSStatus.ForeColor = if($err -gt 0){$corVermelho}else{$corVerde} } # Flush DNS apos mudanca & ipconfig /flushdns | Out-Null Escrever-Log "Cache DNS limpo apos mudanca." "OK" }) # ── Acao: Restaurar DHCP ─────────────────────────────── $btnDNSDHCP.add_Click({ $checkedAdap = @($clbAdap.CheckedIndices) if ($checkedAdap.Count -eq 0) { [System.Windows.Forms.MessageBox]::Show("Selecione ao menos um adaptador.","Atencao","OK","Warning") | Out-Null return } $ok = 0 foreach ($ci in $checkedAdap) { $adap = $adapterMap[$ci] try { Set-DnsClientServerAddress -InterfaceIndex $adap.InterfaceIndex -ResetServerAddresses -ErrorAction Stop & netsh interface ip set dns name="`"$($adap.Name)`"" source=dhcp | Out-Null Escrever-Log "DNS de '$($adap.Name)' restaurado para DHCP automatico!" "OK" $ok++ } catch { Escrever-Log "Erro ao restaurar '$($adap.Name)': $_" "ERRO" } } & ipconfig /flushdns | Out-Null $lblDNSStatus.Text = "DHCP restaurado em $ok adaptador(es). Cache DNS limpo." $lblDNSStatus.ForeColor = $corAmarelo }) $frmDNS.ShowDialog() | Out-Null Escrever-Log "Janela de DNS fechada." "INFO" } # ═══════════════════════════════════════════════════════════ # FUNCAO: JANELA DE HARDWARE DETALHADO # ═══════════════════════════════════════════════════════════ function Mostrar-HardwareInfo { Escrever-Log "Coletando informacoes de hardware..." $frmHW = New-Object System.Windows.Forms.Form $frmHW.Text = "VicTool - Hardware Detalhado" $frmHW.Size = New-Object System.Drawing.Size(780, 680) $frmHW.StartPosition = "CenterScreen" $frmHW.BackColor = $corFundo $frmHW.ForeColor = $corTexto $frmHW.Font = New-Object System.Drawing.Font("Segoe UI", 9) $frmHW.Icon = Criar-Icone # Header da janela HW $pnlHWHeader = New-Object System.Windows.Forms.Panel $pnlHWHeader.Dock = "Top"; $pnlHWHeader.Height = 46; $pnlHWHeader.BackColor = $corPainel $lblHWTit = New-Object System.Windows.Forms.Label $lblHWTit.Text = "Hardware Detalhado"; $lblHWTit.Font = New-Object System.Drawing.Font("Segoe UI",15,[System.Drawing.FontStyle]::Bold) $lblHWTit.ForeColor = $corDestaque; $lblHWTit.Location = New-Object System.Drawing.Point(16,10); $lblHWTit.AutoSize = $true $pnlHWHeader.Controls.Add($lblHWTit) $frmHW.Controls.Add($pnlHWHeader) # Loading label $lblLoading = New-Object System.Windows.Forms.Label $lblLoading.Text = "Coletando informacoes, aguarde..." $lblLoading.Font = New-Object System.Drawing.Font("Segoe UI",10) $lblLoading.ForeColor = $corAmarelo $lblLoading.Location = New-Object System.Drawing.Point(20, 60); $lblLoading.AutoSize = $true $frmHW.Controls.Add($lblLoading) $frmHW.Show() [System.Windows.Forms.Application]::DoEvents() # Coletar dados via WMI try { # --- Dominio / Computador --- $csInfo = Get-CimInstance Win32_ComputerSystem | Select-Object -First 1 $noDominio = $csInfo.PartOfDomain $nomeDominio = if ($noDominio) { $csInfo.Domain } else { "Nao" } $tipoMembro = if ($noDominio) { "Dominio: $($csInfo.Domain)" } else { "Grupo de trabalho: $($csInfo.Workgroup)" } # --- CPU --- $cpu = Get-CimInstance Win32_Processor | Select-Object -First 1 $cpuNome = $cpu.Name.Trim() $cpuCores = $cpu.NumberOfCores $cpuThreads = $cpu.NumberOfLogicalProcessors $cpuClockMHz= $cpu.MaxClockSpeed $cpuClockGHz= [math]::Round($cpuClockMHz / 1000, 2) $cpuSocket = $cpu.SocketDesignation $cpuArch = $cpu.Architecture $archStr = switch($cpuArch){0{"x86"};5{"ARM"};9{"x64"};12{"ARM64"};default{"Desconhecido"}} # --- Placa Mae --- $mb = Get-CimInstance Win32_BaseBoard | Select-Object -First 1 $mbFabric= $mb.Manufacturer.Trim() $mbModel = $mb.Product.Trim() $mbSerial= $mb.SerialNumber.Trim() $bios = Get-CimInstance Win32_BIOS | Select-Object -First 1 $biosVer = "$($bios.Manufacturer) $($bios.SMBIOSBIOSVersion)" # --- RAM --- $ramSlots = Get-CimInstance Win32_PhysicalMemory $ramTotalGB = [math]::Round(($ramSlots | Measure-Object Capacity -Sum).Sum / 1GB, 1) $slotsUsados= $ramSlots.Count $slotsTotais= (Get-CimInstance Win32_PhysicalMemoryArray | Select-Object -First 1).MemoryDevices $ramTipo = ($ramSlots | Select-Object -First 1).MemoryType $tipoStr = switch($ramTipo){20{"DDR"};21{"DDR2"};24{"DDR3"};26{"DDR4"};34{"DDR5"};default{"DDR?"}} if($tipoStr -eq "DDR?"){ $smb = ($ramSlots | Select-Object -First 1).SMBIOSMemoryType $tipoStr = switch($smb){26{"DDR4"};34{"DDR5"};24{"DDR3"};21{"DDR2"};20{"DDR"};default{"Desconhecido"}} } $ramFreqMHz = ($ramSlots | Select-Object -First 1).ConfiguredClockSpeed if(!$ramFreqMHz -or $ramFreqMHz -eq 0){ $ramFreqMHz = ($ramSlots | Select-Object -First 1).Speed } # --- GPU --- $gpus = Get-CimInstance Win32_VideoController $gpuInfo = $gpus | ForEach-Object { $vramGB = if($_.AdapterRAM -gt 0){ [math]::Round($_.AdapterRAM/1GB,1) }else{"N/A"} "$($_.Name.Trim()) - VRAM: $vramGB GB" } # --- Discos --- # Carregar todas as associacoes de uma vez (mais confiavel que filtrar inline) $allDiskToPart = Get-CimInstance Win32_DiskDriveToDiskPartition $allPartToLogic = Get-CimInstance Win32_LogicalDiskToPartition $allLogicDisks = Get-CimInstance Win32_LogicalDisk | Where-Object { $_.DriveType -eq 3 } $allPhysDisk = Get-PhysicalDisk -ErrorAction SilentlyContinue $discos = Get-CimInstance Win32_DiskDrive | ForEach-Object { $disco = $_ $sizeGB = [math]::Round($disco.Size / 1GB, 1) $model = $disco.Model.Trim() $iface = $disco.InterfaceType # Detectar SSD/HDD via MSFT_PhysicalDisk (match por numero do disco) $tipo = "HDD" try { $pd = $allPhysDisk | Where-Object { $_.DeviceId -eq $disco.Index } | Select-Object -First 1 if ($pd) { $tipo = switch ($pd.MediaType) { "SSD" { "SSD" } "HDD" { "HDD" } "SCM" { "SCM" } default { # Fallback: tentar pelo nome $pdByName = $allPhysDisk | Where-Object { $_.FriendlyName -like "*$($model.Substring(0,[Math]::Min(12,$model.Length)))*" } | Select-Object -First 1 if ($pdByName) { $pdByName.MediaType } else { "HDD" } } } } } catch { $tipo = "HDD" } # Mapear Disco -> Particoes fisicas # O Antecedent de Win32_DiskDriveToDiskPartition contem "Disk #N" $partsFisicas = $allDiskToPart | Where-Object { $_.Antecedent.ToString() -match "Disk #$($disco.Index)[^0-9]|Disk #$($disco.Index)""" } $particoesInfo = [System.Collections.ArrayList]@() foreach ($pf in $partsFisicas) { # O Dependent.DeviceID da particao fisica ex: "Disk #0, Partition #0" $partDevID = $pf.Dependent.DeviceID # Procurar no Win32_LogicalDiskToPartition onde Antecedent contem esse DeviceID $logRels = $allPartToLogic | Where-Object { $_.Antecedent.ToString() -like "*$partDevID*" } foreach ($lr in $logRels) { $letra = $lr.Dependent.DeviceID $ldisk = $allLogicDisks | Where-Object { $_.DeviceID -eq $letra } | Select-Object -First 1 if ($ldisk -and $ldisk.Size -gt 0) { $totGB = [math]::Round($ldisk.Size / 1GB, 1) $livGB = [math]::Round($ldisk.FreeSpace / 1GB, 1) $usaGB = [math]::Round(($ldisk.Size - $ldisk.FreeSpace) / 1GB, 1) $usaPct = [math]::Round((($ldisk.Size - $ldisk.FreeSpace) / $ldisk.Size) * 100, 1) $particoesInfo.Add([PSCustomObject]@{ Letra = $letra TotGB = $totGB UsaGB = $usaGB LivGB = $livGB UsaPct = $usaPct }) | Out-Null } } } # Fallback: se nao achou particoes pela associacao, tentar direto pelo volume if ($particoesInfo.Count -eq 0) { foreach ($ld in $allLogicDisks) { if ($ld.Size -gt 0) { $totGB = [math]::Round($ld.Size / 1GB, 1) $livGB = [math]::Round($ld.FreeSpace / 1GB, 1) $usaGB = [math]::Round(($ld.Size - $ld.FreeSpace) / 1GB, 1) $usaPct = [math]::Round((($ld.Size - $ld.FreeSpace) / $ld.Size) * 100, 1) # So adiciona se a capacidade do volume <= capacidade do disco fisico if ($totGB -le $sizeGB) { $particoesInfo.Add([PSCustomObject]@{ Letra = $ld.DeviceID TotGB = $totGB UsaGB = $usaGB LivGB = $livGB UsaPct = $usaPct }) | Out-Null } } } } [PSCustomObject]@{ Model = $model SizeGB = $sizeGB Tipo = $tipo Interface = $iface Particoes = $particoesInfo } } # --- Rede --- $netAdapters = Get-CimInstance Win32_NetworkAdapterConfiguration | Where-Object { $_.IPEnabled } } catch { $lblLoading.Text = "Erro ao coletar dados: $_" return } $lblLoading.Visible = $false # ── Construir layout de cards ────────────────────────── $scroll = New-Object System.Windows.Forms.Panel $scroll.Location = New-Object System.Drawing.Point(0, 46) $scroll.Size = New-Object System.Drawing.Size(780, 530) $scroll.Anchor = "Top,Left,Bottom,Right" $scroll.AutoScroll = $true $scroll.BackColor = $corFundo $frmHW.Controls.Add($scroll) $yCard = 10 function Novo-Card { param([string]$Titulo, [string[]]$Linhas, [System.Drawing.Color]$CorAcento) $linhasValidas = $Linhas | Where-Object { $_ -ne $null -and $_.Trim() -ne "" } $altura = 36 + ($linhasValidas.Count * 22) + 10 $card = New-Object System.Windows.Forms.Panel $card.Location = New-Object System.Drawing.Point(10, $script:yCard) $card.Size = New-Object System.Drawing.Size(740, $altura) $card.BackColor = $corPainel # Barra colorida lateral $acento = New-Object System.Windows.Forms.Panel $acento.Location = New-Object System.Drawing.Point(0, 0) $acento.Size = New-Object System.Drawing.Size(4, $altura) $acento.BackColor = $CorAcento $card.Controls.Add($acento) $lblTit = New-Object System.Windows.Forms.Label $lblTit.Text = $Titulo $lblTit.Font = New-Object System.Drawing.Font("Segoe UI", 10, [System.Drawing.FontStyle]::Bold) $lblTit.ForeColor = $CorAcento $lblTit.Location = New-Object System.Drawing.Point(14, 8) $lblTit.AutoSize = $true $card.Controls.Add($lblTit) $yLinha = 32 foreach ($linha in $linhasValidas) { $partes = $linha -split "\|", 2 $chave = $partes[0].Trim() $valor = if ($partes.Count -gt 1) { $partes[1].Trim() } else { "" } $lblChave = New-Object System.Windows.Forms.Label $lblChave.Text = $chave $lblChave.Font = New-Object System.Drawing.Font("Segoe UI", 9) $lblChave.ForeColor = $corTextoEscuro $lblChave.Location = New-Object System.Drawing.Point(14, $yLinha) $lblChave.Size = New-Object System.Drawing.Size(200, 20) $card.Controls.Add($lblChave) $lblValor = New-Object System.Windows.Forms.Label $lblValor.Text = $valor $lblValor.Font = New-Object System.Drawing.Font("Segoe UI", 9, [System.Drawing.FontStyle]::Bold) $lblValor.ForeColor = $corTextoClaro $lblValor.Location = New-Object System.Drawing.Point(218, $yLinha) $lblValor.Size = New-Object System.Drawing.Size(510, 20) $card.Controls.Add($lblValor) $yLinha += 22 } $scroll.Controls.Add($card) $script:yCard += $altura + 10 } # Card: Sistema Operacional $so = Get-CimInstance Win32_OperatingSystem $uptime = (Get-Date) - $so.LastBootUpTime $uptimeStr = "{0}d {1}h {2}m" -f [int]$uptime.TotalDays, $uptime.Hours, $uptime.Minutes $dominioLinha = if ($noDominio) { "Dominio | $nomeDominio" } else { "Dominio | Nao ingressado ($tipoMembro)" } Novo-Card -Titulo "Sistema Operacional" -CorAcento $corDestaque -Linhas @( "Computador | $env:COMPUTERNAME", $dominioLinha, "Sistema Operacional | $($so.Caption) $($so.OSArchitecture)", "Build | $($so.BuildNumber) ($($so.Version))", "Instalado em | $($so.InstallDate.ToString('dd/MM/yyyy'))", "Ultimo boot | $($so.LastBootUpTime.ToString('dd/MM/yyyy HH:mm')) (uptime: $uptimeStr)", "Diretorio Windows | $($so.WindowsDirectory)" ) # Card: Placa Mae Novo-Card -Titulo "Placa-Mae (Motherboard)" -CorAcento ([System.Drawing.Color]::FromArgb(168,85,247)) -Linhas @( "Fabricante | $mbFabric", "Modelo | $mbModel", "Serial | $mbSerial", "BIOS | $biosVer", "Socket CPU | $cpuSocket" ) # Card: Processador Novo-Card -Titulo "Processador (CPU)" -CorAcento $corVerde -Linhas @( "Modelo | $cpuNome", "Arquitetura | $archStr", "Nucleos / Threads | $cpuCores nucleos / $cpuThreads threads", "Clock Maximo | $cpuClockGHz GHz ($cpuClockMHz MHz)", "Socket | $cpuSocket" ) # Card: Memoria RAM $ramLinhas = @( "Capacidade Total | $ramTotalGB GB", "Tipo | $tipoStr", "Frequencia | $ramFreqMHz MHz", "Slots usados | $slotsUsados de $slotsTotais slots" ) # Detalhar cada modulo $idx = 1 foreach($slot in $ramSlots){ $capGB = [math]::Round($slot.Capacity/1GB,1) $fab = if($slot.Manufacturer.Trim()) {$slot.Manufacturer.Trim()} else {"N/A"} $freq = if($slot.ConfiguredClockSpeed -gt 0){$slot.ConfiguredClockSpeed}else{$slot.Speed} $ramLinhas += "Modulo $idx (${capGB}GB) | Fabricante: $fab | Freq: $freq MHz | Banco: $($slot.DeviceLocator)" $idx++ } Novo-Card -Titulo "Memoria RAM" -CorAcento $corAmarelo -Linhas $ramLinhas # Card: GPU $gpuLinhas = @() foreach($g in $gpus){ $vramGB = if($g.AdapterRAM -gt 0){ [math]::Round($g.AdapterRAM/1GB,1) }else{"N/A"} $res = "$($g.CurrentHorizontalResolution)x$($g.CurrentVerticalResolution)" $gpuLinhas += "Nome | $($g.Name.Trim())" $gpuLinhas += "VRAM | $vramGB GB" $gpuLinhas += "Resolucao | $res" $gpuLinhas += "Driver | $($g.DriverVersion)" $gpuLinhas += "---" } Novo-Card -Titulo "Placa de Video (GPU)" -CorAcento ([System.Drawing.Color]::FromArgb(236,72,153)) -Linhas ($gpuLinhas | Where-Object {$_ -ne "---"}) # Card: Discos (um card por disco, com uso por particao) foreach ($d in $discos) { $tipoLabel = if ($d.Tipo -eq "SSD") { "SSD" } else { "HDD" } $discoLinhas = @( "Modelo | $($d.Model)", "Tipo | $($d.Tipo)", "Interface | $($d.Interface)", "Capacidade | $($d.SizeGB) GB (total fisico)" ) if ($d.Particoes.Count -gt 0) { foreach ($part in $d.Particoes) { if ($part.TotGB -gt 0) { $barLen = 20 $filled = [math]::Round($barLen * ($part.UsaPct / 100)) $bar = ("#" * $filled) + ("-" * ($barLen - $filled)) $discoLinhas += "Particao $($part.Letra) | Total: $($part.TotGB) GB | Usado: $($part.UsaGB) GB ($($part.UsaPct)%) | Livre: $($part.LivGB) GB [$bar]" } else { $discoLinhas += "Particao $($part.Letra) | (sem volume formatado)" } } } else { $discoLinhas += "Particoes | N/A" } Novo-Card -Titulo "Armazenamento — $($d.Model) [$tipoLabel]" -CorAcento $corVerde -Linhas $discoLinhas } # Card: Rede $netLinhas = @() foreach($n in $netAdapters){ $ips = ($n.IPAddress | Where-Object {$_ -match "\."}) -join ", " $netLinhas += "Adaptador | $($n.Description)" $netLinhas += "IP | $ips" $netLinhas += "Gateway | $(($n.DefaultIPGateway | Select-Object -First 1))" $netLinhas += "DNS | $(($n.DNSServerSearchOrder | Select-Object -First 2) -join ', ')" $netLinhas += "MAC | $($n.MACAddress)" $netLinhas += "---" } Novo-Card -Titulo "Rede" -CorAcento $corDestaque -Linhas ($netLinhas | Where-Object {$_ -ne "---"}) # ── Montar o texto do relatorio agora (escopo local, sem funcao) ── $relRam = @() $ri = 1 foreach ($slot in $ramSlots) { $rCapGB = [math]::Round($slot.Capacity / 1GB, 1) $rFab = if ($slot.Manufacturer -and $slot.Manufacturer.Trim()) { $slot.Manufacturer.Trim() } else { "N/A" } $rFreq = if ($slot.ConfiguredClockSpeed -gt 0) { $slot.ConfiguredClockSpeed } else { $slot.Speed } $relRam += " Modulo $ri : ${rCapGB} GB | Fab: $rFab | Freq: $rFreq MHz | Banco: $($slot.DeviceLocator)" $ri++ } $relUptime = (Get-Date) - $so.LastBootUpTime $relUptimeStr = "{0}d {1}h {2}m" -f [int]$relUptime.TotalDays, $relUptime.Hours, $relUptime.Minutes $relLinhas = @("================================================================") $relLinhas += " VicTool - Relatorio de Hardware" $relLinhas += " Gerado em : $(Get-Date -Format 'dd/MM/yyyy HH:mm:ss')" $relLinhas += " Maquina : $env:COMPUTERNAME" $relLinhas += " Usuario : $env:USERNAME" $relLinhas += "================================================================" $relLinhas += "" $relLinhas += "[ SISTEMA OPERACIONAL ]" $relLinhas += " Computador : $env:COMPUTERNAME" $relLinhas += " Dominio : $(if ($noDominio) { $nomeDominio + ' (membro do dominio)' } else { 'Nao ingressado (' + $tipoMembro + ')' })" $relLinhas += " Sistema : $($so.Caption) $($so.OSArchitecture)" $relLinhas += " Build : $($so.BuildNumber) ($($so.Version))" $relLinhas += " Instalado em : $($so.InstallDate.ToString('dd/MM/yyyy'))" $relLinhas += " Ultimo boot : $($so.LastBootUpTime.ToString('dd/MM/yyyy HH:mm')) (Uptime: $relUptimeStr)" $relLinhas += " Dir. Windows : $($so.WindowsDirectory)" $relLinhas += "" $relLinhas += "[ PLACA-MAE ]" $relLinhas += " Fabricante : $mbFabric" $relLinhas += " Modelo : $mbModel" $relLinhas += " Serial : $mbSerial" $relLinhas += " BIOS : $biosVer" $relLinhas += " Socket CPU : $cpuSocket" $relLinhas += "" $relLinhas += "[ PROCESSADOR (CPU) ]" $relLinhas += " Modelo : $cpuNome" $relLinhas += " Arquitetura : $archStr" $relLinhas += " Nucleos : $cpuCores nucleos / $cpuThreads threads" $relLinhas += " Clock Maximo : $cpuClockGHz GHz ($cpuClockMHz MHz)" $relLinhas += " Socket : $cpuSocket" $relLinhas += "" $relLinhas += "[ MEMORIA RAM ]" $relLinhas += " Total : $ramTotalGB GB" $relLinhas += " Tipo : $tipoStr" $relLinhas += " Frequencia : $ramFreqMHz MHz" $relLinhas += " Slots : $slotsUsados usados de $slotsTotais no total" $relLinhas += " Modulos:" $relLinhas += $relRam $relLinhas += "" $relLinhas += "[ PLACA DE VIDEO (GPU) ]" foreach ($g in $gpus) { $gVram = if ($g.AdapterRAM -gt 0) { [math]::Round($g.AdapterRAM / 1GB, 1) } else { "N/A" } $gRes = "$($g.CurrentHorizontalResolution)x$($g.CurrentVerticalResolution)" $relLinhas += " Nome : $($g.Name.Trim())" $relLinhas += " VRAM : $gVram GB" $relLinhas += " Resolucao : $gRes" $relLinhas += " Driver : $($g.DriverVersion)" $relLinhas += "" } $relLinhas += "[ ARMAZENAMENTO ]" foreach ($d in $discos) { $relLinhas += " Disco : $($d.Model)" $relLinhas += " Tipo : $($d.Tipo)" $relLinhas += " Interface : $($d.Interface)" $relLinhas += " Capacidade : $($d.SizeGB) GB (total fisico)" if ($d.Particoes.Count -gt 0) { foreach ($part in $d.Particoes) { if ($part.TotGB -gt 0) { $relLinhas += " Particao $($part.Letra) : Total $($part.TotGB) GB | Usado $($part.UsaGB) GB ($($part.UsaPct)%) | Livre $($part.LivGB) GB" } else { $relLinhas += " Particao $($part.Letra) : (sem volume formatado)" } } } else { $relLinhas += " Particoes : N/A" } $relLinhas += "" } $relLinhas += "[ REDE ]" foreach ($n in $netAdapters) { $nIps = ($n.IPAddress | Where-Object { $_ -match "\." }) -join ", " $relLinhas += " Adaptador : $($n.Description)" $relLinhas += " IP : $nIps" $relLinhas += " Gateway : $(($n.DefaultIPGateway | Select-Object -First 1))" $relLinhas += " DNS : $(($n.DNSServerSearchOrder | Select-Object -First 2) -join ', ')" $relLinhas += " MAC : $($n.MACAddress)" $relLinhas += "" } $relLinhas += "================================================================" $relLinhas += " Gerado por VicTool | by Victor Schiavinato" $relLinhas += "================================================================" # Guardar no escopo script para os click handlers acessarem $script:hwRelatorio = $relLinhas -join "`r`n" $script:hwNomeMaquina = $env:COMPUTERNAME # Painel inferior com dois botoes $pnlBotoes = New-Object System.Windows.Forms.Panel $pnlBotoes.Location = New-Object System.Drawing.Point(0, 586) $pnlBotoes.Size = New-Object System.Drawing.Size(780, 50) $pnlBotoes.Anchor = "Bottom,Left,Right" $pnlBotoes.BackColor = $corPainel $btnCopiar = New-Object System.Windows.Forms.Button $btnCopiar.Text = "Copiar para Area de Transferencia" $btnCopiar.Location = New-Object System.Drawing.Point(8, 8) $btnCopiar.Size = New-Object System.Drawing.Size(260, 34) $btnCopiar.BackColor = $corBorda $btnCopiar.ForeColor = $corTextoClaro $btnCopiar.FlatStyle = "Flat" $btnCopiar.FlatAppearance.BorderSize = 0 $btnCopiar.Font = New-Object System.Drawing.Font("Segoe UI", 9, [System.Drawing.FontStyle]::Bold) $btnCopiar.add_Click({ [System.Windows.Forms.Clipboard]::SetText($script:hwRelatorio) [System.Windows.Forms.MessageBox]::Show("Relatorio copiado para a area de transferencia!", "Copiado", "OK", "Information") | Out-Null }) $btnExportar = New-Object System.Windows.Forms.Button $btnExportar.Text = "Exportar .TXT para Area de Trabalho" $btnExportar.Location = New-Object System.Drawing.Point(278, 8) $btnExportar.Size = New-Object System.Drawing.Size(280, 34) $btnExportar.BackColor = $corVerde $btnExportar.ForeColor = $corFundo $btnExportar.FlatStyle = "Flat" $btnExportar.FlatAppearance.BorderSize = 0 $btnExportar.Font = New-Object System.Drawing.Font("Segoe UI", 9, [System.Drawing.FontStyle]::Bold) $btnExportar.add_Click({ try { $dataHora = Get-Date -Format "yyyy-MM-dd_HH-mm" $nomeArquivo = "Hardware_$($script:hwNomeMaquina)_${dataHora}.txt" $desktop = [System.Environment]::GetFolderPath("Desktop") $caminhoFinal = Join-Path $desktop $nomeArquivo $script:hwRelatorio | Out-File -FilePath $caminhoFinal -Encoding UTF8 -Force Escrever-Log "Exportado: $caminhoFinal" "OK" $resp = [System.Windows.Forms.MessageBox]::Show( "Arquivo salvo com sucesso!`n`n$caminhoFinal`n`nDeseja abrir agora?", "Exportado!", "YesNo", "Information") if ($resp -eq "Yes") { Start-Process "notepad.exe" -ArgumentList "`"$caminhoFinal`"" } } catch { [System.Windows.Forms.MessageBox]::Show("Erro ao exportar:`n$_", "Erro", "OK", "Error") | Out-Null Escrever-Log "Erro ao exportar: $_" "ERRO" } }) $pnlBotoes.Controls.AddRange(@($btnCopiar, $btnExportar)) $frmHW.Controls.Add($pnlBotoes) Escrever-Log "Hardware coletado com sucesso!" "OK" } # ═══════════════════════════════════════════════════════════ # ABA 4 — MICROSOFT (MAS) # ═══════════════════════════════════════════════════════════ $pMs = $tabPanels[5] $lblMsTit = New-Object System.Windows.Forms.Label $lblMsTit.Text="Ativacao Microsoft";$lblMsTit.Font=New-Object System.Drawing.Font("Segoe UI",16,[System.Drawing.FontStyle]::Bold) $lblMsTit.ForeColor=[System.Drawing.Color]::FromArgb(0,164,239);$lblMsTit.Location=New-Object System.Drawing.Point(20,20);$lblMsTit.AutoSize=$true $lblMsSub = New-Object System.Windows.Forms.Label $lblMsSub.Text="Usando Microsoft Activation Scripts (MAS) — massgrave.dev | Open Source, GPL-3.0" $lblMsSub.ForeColor=$corTextoEscuro;$lblMsSub.Location=New-Object System.Drawing.Point(22,52);$lblMsSub.AutoSize=$true $sepMs = New-Object System.Windows.Forms.Panel $sepMs.Location=New-Object System.Drawing.Point(20,75);$sepMs.Size=New-Object System.Drawing.Size(700,1);$sepMs.BackColor=$corBorda # Card Windows $pnlWin = New-Object System.Windows.Forms.Panel $pnlWin.Location=New-Object System.Drawing.Point(20,90);$pnlWin.Size=New-Object System.Drawing.Size(340,210);$pnlWin.BackColor=$corPainel $acWin = New-Object System.Windows.Forms.Panel $acWin.Location=New-Object System.Drawing.Point(0,0);$acWin.Size=New-Object System.Drawing.Size(4,210);$acWin.BackColor=[System.Drawing.Color]::FromArgb(0,120,215) $pnlWin.Controls.Add($acWin) $lblWinTit = New-Object System.Windows.Forms.Label $lblWinTit.Text="Windows";$lblWinTit.Font=New-Object System.Drawing.Font("Segoe UI",14,[System.Drawing.FontStyle]::Bold) $lblWinTit.ForeColor=$corTextoClaro;$lblWinTit.Location=New-Object System.Drawing.Point(16,14);$lblWinTit.AutoSize=$true $lblWinM = New-Object System.Windows.Forms.Label $lblWinM.Text="Metodo: HWID (Licenca Digital Permanente)";$lblWinM.ForeColor=$corVerde $lblWinM.Font=New-Object System.Drawing.Font("Segoe UI",9);$lblWinM.Location=New-Object System.Drawing.Point(16,44);$lblWinM.AutoSize=$true $lblWinD = New-Object System.Windows.Forms.Label $lblWinD.Text="Ativa Windows permanentemente via HWID.`nNao requer internet apos ativacao.`nCompativel com Windows 10 e 11." $lblWinD.ForeColor=$corTextoEscuro;$lblWinD.Location=New-Object System.Drawing.Point(16,68);$lblWinD.Size=New-Object System.Drawing.Size(308,56) $btnAtivarWin = New-Object System.Windows.Forms.Button $btnAtivarWin.Text="Ativar Windows (HWID)";$btnAtivarWin.Location=New-Object System.Drawing.Point(16,146) $btnAtivarWin.Size=New-Object System.Drawing.Size(308,46);$btnAtivarWin.BackColor=[System.Drawing.Color]::FromArgb(0,120,215) $btnAtivarWin.ForeColor=$corTextoClaro;$btnAtivarWin.FlatStyle="Flat";$btnAtivarWin.FlatAppearance.BorderSize=0 $btnAtivarWin.Font=New-Object System.Drawing.Font("Segoe UI",11,[System.Drawing.FontStyle]::Bold);$btnAtivarWin.Cursor=[System.Windows.Forms.Cursors]::Hand $btnAtivarWin.add_Click({ $c=[System.Windows.Forms.MessageBox]::Show("Abrir MAS para ativar Windows (HWID)?`nNo menu que abrir, pressione [1].","Ativar Windows","YesNo","Question") if($c -ne "Yes"){return} Escrever-Log "Abrindo MAS para ativacao do Windows..." Start-Process "powershell.exe" -ArgumentList "-NoProfile -ExecutionPolicy Bypass -Command `"irm https://get.activated.win | iex`"" -Verb RunAs Escrever-Log "Terminal MAS aberto. Pressione [1] para HWID." "OK" }) $pnlWin.Controls.AddRange(@($lblWinTit,$lblWinM,$lblWinD,$btnAtivarWin)) # Card Office $pnlOff = New-Object System.Windows.Forms.Panel $pnlOff.Location=New-Object System.Drawing.Point(380,90);$pnlOff.Size=New-Object System.Drawing.Size(340,210);$pnlOff.BackColor=$corPainel $acOff = New-Object System.Windows.Forms.Panel $acOff.Location=New-Object System.Drawing.Point(0,0);$acOff.Size=New-Object System.Drawing.Size(4,210);$acOff.BackColor=[System.Drawing.Color]::FromArgb(214,67,5) $pnlOff.Controls.Add($acOff) $lblOffTit = New-Object System.Windows.Forms.Label $lblOffTit.Text="Office";$lblOffTit.Font=New-Object System.Drawing.Font("Segoe UI",14,[System.Drawing.FontStyle]::Bold) $lblOffTit.ForeColor=$corTextoClaro;$lblOffTit.Location=New-Object System.Drawing.Point(16,14);$lblOffTit.AutoSize=$true $lblOffM = New-Object System.Windows.Forms.Label $lblOffM.Text="Metodo: Ohook (Ativacao Permanente)";$lblOffM.ForeColor=$corVerde $lblOffM.Font=New-Object System.Drawing.Font("Segoe UI",9);$lblOffM.Location=New-Object System.Drawing.Point(16,44);$lblOffM.AutoSize=$true $lblOffD = New-Object System.Windows.Forms.Label $lblOffD.Text="Ativa Office 2016/2019/2021/2024`ne Microsoft 365 permanentemente.`nSuporte a todos os produtos Office." $lblOffD.ForeColor=$corTextoEscuro;$lblOffD.Location=New-Object System.Drawing.Point(16,68);$lblOffD.Size=New-Object System.Drawing.Size(308,56) $btnAtivarOff = New-Object System.Windows.Forms.Button $btnAtivarOff.Text="Ativar Office (Ohook)";$btnAtivarOff.Location=New-Object System.Drawing.Point(16,146) $btnAtivarOff.Size=New-Object System.Drawing.Size(308,46);$btnAtivarOff.BackColor=[System.Drawing.Color]::FromArgb(214,67,5) $btnAtivarOff.ForeColor=$corTextoClaro;$btnAtivarOff.FlatStyle="Flat";$btnAtivarOff.FlatAppearance.BorderSize=0 $btnAtivarOff.Font=New-Object System.Drawing.Font("Segoe UI",11,[System.Drawing.FontStyle]::Bold);$btnAtivarOff.Cursor=[System.Windows.Forms.Cursors]::Hand $btnAtivarOff.add_Click({ $c=[System.Windows.Forms.MessageBox]::Show("Abrir MAS para ativar Office (Ohook)?`nNo menu que abrir, pressione [2].","Ativar Office","YesNo","Question") if($c -ne "Yes"){return} Escrever-Log "Abrindo MAS para ativacao do Office..." Start-Process "powershell.exe" -ArgumentList "-NoProfile -ExecutionPolicy Bypass -Command `"irm https://get.activated.win | iex`"" -Verb RunAs Escrever-Log "Terminal MAS aberto. Pressione [2] para Ohook." "OK" }) $pnlOff.Controls.AddRange(@($lblOffTit,$lblOffM,$lblOffD,$btnAtivarOff)) # Card AIO $pnlAIO = New-Object System.Windows.Forms.Panel $pnlAIO.Location=New-Object System.Drawing.Point(20,322);$pnlAIO.Size=New-Object System.Drawing.Size(700,80);$pnlAIO.BackColor=[System.Drawing.Color]::FromArgb(18,30,18) $lblAIOT = New-Object System.Windows.Forms.Label $lblAIOT.Text="Menu Completo MAS (All-In-One)";$lblAIOT.Font=New-Object System.Drawing.Font("Segoe UI",11,[System.Drawing.FontStyle]::Bold) $lblAIOT.ForeColor=$corTextoClaro;$lblAIOT.Location=New-Object System.Drawing.Point(16,12);$lblAIOT.AutoSize=$true $lblAIOD = New-Object System.Windows.Forms.Label $lblAIOD.Text="Menu interativo completo: ativacao, troubleshooting, troca de edicao e mais.";$lblAIOD.ForeColor=$corTextoEscuro $lblAIOD.Location=New-Object System.Drawing.Point(16,36);$lblAIOD.Size=New-Object System.Drawing.Size(450,24) $btnAIO = New-Object System.Windows.Forms.Button $btnAIO.Text="Abrir MAS Completo";$btnAIO.Location=New-Object System.Drawing.Point(530,16);$btnAIO.Size=New-Object System.Drawing.Size(158,46) $btnAIO.BackColor=[System.Drawing.Color]::FromArgb(30,100,30);$btnAIO.ForeColor=$corTextoClaro;$btnAIO.FlatStyle="Flat";$btnAIO.FlatAppearance.BorderSize=0 $btnAIO.Font=New-Object System.Drawing.Font("Segoe UI",9,[System.Drawing.FontStyle]::Bold);$btnAIO.Cursor=[System.Windows.Forms.Cursors]::Hand $btnAIO.add_Click({Start-Process "powershell.exe" -ArgumentList "-NoProfile -ExecutionPolicy Bypass -Command `"irm https://get.activated.win | iex`"" -Verb RunAs;Escrever-Log "MAS All-In-One aberto." "OK"}) $pnlAIO.Controls.AddRange(@($lblAIOT,$lblAIOD,$btnAIO)) $lblNota2 = New-Object System.Windows.Forms.Label $lblNota2.Text="Windows: pressione [1] HWID | Office: pressione [2] Ohook | Fonte: massgrave.dev (GPL-3.0)" $lblNota2.ForeColor=$corAmarelo;$lblNota2.Font=New-Object System.Drawing.Font("Segoe UI",9);$lblNota2.Location=New-Object System.Drawing.Point(20,420);$lblNota2.AutoSize=$true $pMs.Controls.AddRange(@($lblMsTit,$lblMsSub,$sepMs,$pnlWin,$pnlOff,$pnlAIO,$lblNota2)) # ═══════════════════════════════════════════════════════════ # LOG LATERAL # ═══════════════════════════════════════════════════════════ $lblLogTit = New-Object System.Windows.Forms.Label $lblLogTit.Text="LOG";$lblLogTit.Font=New-Object System.Drawing.Font("Segoe UI",8,[System.Drawing.FontStyle]::Bold) $lblLogTit.ForeColor=$corTextoEscuro;$lblLogTit.Location=New-Object System.Drawing.Point(0,4);$lblLogTit.AutoSize=$true $script:txtLog = New-Object System.Windows.Forms.RichTextBox $script:txtLog.Location=New-Object System.Drawing.Point(0,22);$script:txtLog.Size=New-Object System.Drawing.Size(240,622) $script:txtLog.BackColor=$corPainel;$script:txtLog.ForeColor=$corVerde;$script:txtLog.Font=New-Object System.Drawing.Font("Consolas",8) $script:txtLog.ReadOnly=$true;$script:txtLog.BorderStyle="None";$script:txtLog.ScrollBars="Vertical";$script:txtLog.Anchor="Top,Left,Bottom,Right" $btnLimLog = New-Object System.Windows.Forms.Button $btnLimLog.Text="Limpar Log";$btnLimLog.Location=New-Object System.Drawing.Point(0,648);$btnLimLog.Size=New-Object System.Drawing.Size(240,28) $btnLimLog.BackColor=$corBorda;$btnLimLog.ForeColor=$corTextoEscuro;$btnLimLog.FlatStyle="Flat";$btnLimLog.FlatAppearance.BorderSize=0 $btnLimLog.add_Click({$script:txtLog.Clear()}) $pnlLog.Controls.AddRange(@($lblLogTit,$script:txtLog,$btnLimLog)) # ─── Footer ──────────────────────────────────────────────── $pnlFoot = New-Object System.Windows.Forms.Panel $pnlFoot.Dock="Bottom";$pnlFoot.Height=26;$pnlFoot.BackColor=$corPainel $lblFoot = New-Object System.Windows.Forms.Label $lblFoot.Text="VicTool v1.4 | Ferramenta desenvolvida por Victor Schiavinato | Executando como Administrador" $lblFoot.ForeColor=$corTextoEscuro;$lblFoot.Font=New-Object System.Drawing.Font("Segoe UI",8);$lblFoot.Location=New-Object System.Drawing.Point(10,6);$lblFoot.AutoSize=$true $pnlFoot.Controls.Add($lblFoot) $script:form.Controls.Add($pnlFoot) # ─── Iniciar ─────────────────────────────────────────────── $script:form.add_Shown({ Selecionar-Tab -idx 0 Escrever-Log "VicTool v1.4 iniciado!" Escrever-Log "SO: $([System.Environment]::OSVersion.VersionString)" Escrever-Log "Usuario: $env:USERNAME @ $env:COMPUTERNAME" Escrever-Log "Pronto para uso." }) [System.Windows.Forms.Application]::Run($script:form)