# ============================================================ # 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]"; } @{ Label="Ajustes"; Icon="[A]"; } @{ Label="Rede"; Icon="[R]"; } @{ Label="Usuarios"; Icon="[U]"; } ) $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 Solicitar-SenhaMicrosoft { $frmSenha = New-Object System.Windows.Forms.Form $frmSenha.Text = "Acesso Restrito" $frmSenha.Size = New-Object System.Drawing.Size(360, 180) $frmSenha.StartPosition = "CenterParent" $frmSenha.FormBorderStyle = "FixedDialog" $frmSenha.MaximizeBox = $false $frmSenha.MinimizeBox = $false $frmSenha.ShowInTaskbar = $false $frmSenha.BackColor = $corPainel $frmSenha.ForeColor = $corTexto $frmSenha.Font = New-Object System.Drawing.Font("Segoe UI", 9) $frmSenha.Tag = $false $lblSenha = New-Object System.Windows.Forms.Label $lblSenha.Text = "Digite a senha para acessar o menu Microsoft:" $lblSenha.Location = New-Object System.Drawing.Point(16, 16) $lblSenha.Size = New-Object System.Drawing.Size(315, 22) $lblSenha.ForeColor = $corTextoClaro $txtSenha = New-Object System.Windows.Forms.TextBox $txtSenha.Location = New-Object System.Drawing.Point(16, 44) $txtSenha.Size = New-Object System.Drawing.Size(315, 25) $txtSenha.UseSystemPasswordChar = $true $txtSenha.BackColor = $corBorda $txtSenha.ForeColor = $corTextoClaro $txtSenha.BorderStyle = "FixedSingle" $btnEntrar = New-Object System.Windows.Forms.Button $btnEntrar.Text = "Entrar" $btnEntrar.Location = New-Object System.Drawing.Point(141, 88) $btnEntrar.Size = New-Object System.Drawing.Size(90, 30) $btnEntrar.BackColor = $corDestaque $btnEntrar.ForeColor = $corTextoClaro $btnEntrar.FlatStyle = "Flat" $btnEntrar.FlatAppearance.BorderSize = 0 $btnCancelar = New-Object System.Windows.Forms.Button $btnCancelar.Text = "Cancelar" $btnCancelar.Location = New-Object System.Drawing.Point(241, 88) $btnCancelar.Size = New-Object System.Drawing.Size(90, 30) $btnCancelar.BackColor = $corBorda $btnCancelar.ForeColor = $corTextoClaro $btnCancelar.FlatStyle = "Flat" $btnCancelar.FlatAppearance.BorderSize = 0 $btnEntrar.add_Click({ if ($txtSenha.Text -eq "171511") { $frmSenha.Tag = $true $frmSenha.DialogResult = [System.Windows.Forms.DialogResult]::OK $frmSenha.Close() } else { [System.Windows.Forms.MessageBox]::Show( "Senha incorreta.", "Acesso negado", "OK", "Error" ) | Out-Null $txtSenha.Clear() $txtSenha.Focus() } }) $btnCancelar.add_Click({ $frmSenha.Tag = $false $frmSenha.DialogResult = [System.Windows.Forms.DialogResult]::Cancel $frmSenha.Close() }) $frmSenha.AcceptButton = $btnEntrar $frmSenha.CancelButton = $btnCancelar $frmSenha.Controls.AddRange(@($lblSenha, $txtSenha, $btnEntrar, $btnCancelar)) $frmSenha.add_Shown({ $txtSenha.Focus() }) [void]$frmSenha.ShowDialog($script:form) return [bool]$frmSenha.Tag } function Selecionar-Tab { param([int]$idx) # A aba Microsoft usa o indice 5. # Solicita a senha sempre que houver tentativa de acesso. if ($idx -eq 5) { if (-not (Solicitar-SenhaMicrosoft)) { return } } $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) $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 { # Mostrar erro no titulo da janela e logar $frmHW.Text = "VicTool - Erro ao coletar hardware: $_" Escrever-Log "Erro ao coletar hardware: $_" "ERRO" return } # ── 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, 584) $scroll.Anchor = "Top,Left,Bottom,Right" $scroll.AutoScroll = $true $scroll.BackColor = $corFundo $frmHW.Controls.Add($scroll) $script: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 + Downloads Office) # ═══════════════════════════════════════════════════════════ $pMs = $tabPanels[5] $pnlMsScroll = New-Object System.Windows.Forms.Panel $pnlMsScroll.Dock = "Fill"; $pnlMsScroll.BackColor = $corFundo; $pnlMsScroll.AutoScroll = $true $pMs.Controls.Add($pnlMsScroll) # ── Título ──────────────────────────────────────────────── $lblMsTit = New-Object System.Windows.Forms.Label $lblMsTit.Text = "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,18); $lblMsTit.AutoSize = $true $pnlMsScroll.Controls.Add($lblMsTit) $lblMsSub = New-Object System.Windows.Forms.Label $lblMsSub.Text = "Ativacao e Download de produtos Microsoft" $lblMsSub.ForeColor = $corTextoEscuro; $lblMsSub.Location = New-Object System.Drawing.Point(22,50); $lblMsSub.AutoSize = $true $pnlMsScroll.Controls.Add($lblMsSub) $sepMs1 = New-Object System.Windows.Forms.Panel $sepMs1.Location = New-Object System.Drawing.Point(20,72); $sepMs1.Size = New-Object System.Drawing.Size(730,1); $sepMs1.BackColor = $corBorda $pnlMsScroll.Controls.Add($sepMs1) # ── Seção: Ativação ─────────────────────────────────────── $lblSecAtiv = New-Object System.Windows.Forms.Label $lblSecAtiv.Text = "ATIVACAO (Microsoft Activation Scripts — massgrave.dev)" $lblSecAtiv.Font = New-Object System.Drawing.Font("Segoe UI",7,[System.Drawing.FontStyle]::Bold) $lblSecAtiv.ForeColor = $corTextoEscuro; $lblSecAtiv.Location = New-Object System.Drawing.Point(20,82); $lblSecAtiv.AutoSize = $true $pnlMsScroll.Controls.Add($lblSecAtiv) # Card Windows $pnlWin = New-Object System.Windows.Forms.Panel $pnlWin.Location = New-Object System.Drawing.Point(20,98); $pnlWin.Size = New-Object System.Drawing.Size(355,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 $pnlWin.Controls.Add($lblWinTit) $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 $pnlWin.Controls.Add($lblWinM) $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(323,56) $pnlWin.Controls.Add($lblWinD) $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(323,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)) $pnlMsScroll.Controls.Add($pnlWin) # Card Office Ativação $pnlOff = New-Object System.Windows.Forms.Panel $pnlOff.Location = New-Object System.Drawing.Point(395,98); $pnlOff.Size = New-Object System.Drawing.Size(355,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 (Ativar)"; $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 $pnlOff.Controls.Add($lblOffTit) $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 $pnlOff.Controls.Add($lblOffM) $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(323,56) $pnlOff.Controls.Add($lblOffD) $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(323,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)) $pnlMsScroll.Controls.Add($pnlOff) # Card AIO $pnlAIO = New-Object System.Windows.Forms.Panel $pnlAIO.Location = New-Object System.Drawing.Point(20,326); $pnlAIO.Size = New-Object System.Drawing.Size(730,72); $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",10,[System.Drawing.FontStyle]::Bold) $lblAIOT.ForeColor = $corTextoClaro; $lblAIOT.Location = New-Object System.Drawing.Point(16,10); $lblAIOT.AutoSize = $true $pnlAIO.Controls.Add($lblAIOT) $lblAIOD = New-Object System.Windows.Forms.Label $lblAIOD.Text = "Menu interativo: ativacao, troubleshooting, troca de edicao e mais."; $lblAIOD.ForeColor = $corTextoEscuro $lblAIOD.Location = New-Object System.Drawing.Point(16,32); $lblAIOD.AutoSize = $true $pnlAIO.Controls.Add($lblAIOD) $btnAIO = New-Object System.Windows.Forms.Button $btnAIO.Text = "Abrir MAS Completo"; $btnAIO.Location = New-Object System.Drawing.Point(560,14); $btnAIO.Size = New-Object System.Drawing.Size(158,44) $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)) $pnlMsScroll.Controls.Add($pnlAIO) $lblNotaMAS = New-Object System.Windows.Forms.Label $lblNotaMAS.Text = "Windows: pressione [1] HWID | Office: pressione [2] Ohook | Fonte: massgrave.dev (GPL-3.0)" $lblNotaMAS.ForeColor = $corAmarelo; $lblNotaMAS.Font = New-Object System.Drawing.Font("Segoe UI",8) $lblNotaMAS.Location = New-Object System.Drawing.Point(20,406); $lblNotaMAS.AutoSize = $true $pnlMsScroll.Controls.Add($lblNotaMAS) # ── Separador: Download Office ──────────────────────────── $sepDl = New-Object System.Windows.Forms.Panel $sepDl.Location = New-Object System.Drawing.Point(20,432); $sepDl.Size = New-Object System.Drawing.Size(730,1); $sepDl.BackColor = $corBorda $pnlMsScroll.Controls.Add($sepDl) $lblSecDl = New-Object System.Windows.Forms.Label $lblSecDl.Text = "DOWNLOAD OFFICE (instalador oficial Microsoft)" $lblSecDl.Font = New-Object System.Drawing.Font("Segoe UI",7,[System.Drawing.FontStyle]::Bold) $lblSecDl.ForeColor = $corTextoEscuro; $lblSecDl.Location = New-Object System.Drawing.Point(20,442); $lblSecDl.AutoSize = $true $pnlMsScroll.Controls.Add($lblSecDl) # Função para criar card de download de Office function Novo-CardDownloadOffice { param([int]$X, [int]$Y, [string]$Titulo, [string]$Versao, [string]$Desc, [string]$URL, [System.Drawing.Color]$Cor) $card = New-Object System.Windows.Forms.Panel $card.Location = New-Object System.Drawing.Point($X,$Y); $card.Size = New-Object System.Drawing.Size(234,200); $card.BackColor = $corPainel $ac = New-Object System.Windows.Forms.Panel $ac.Location = New-Object System.Drawing.Point(0,0); $ac.Size = New-Object System.Drawing.Size(234,4); $ac.BackColor = $Cor $card.Controls.Add($ac) $lblVer = New-Object System.Windows.Forms.Label $lblVer.Text = $Versao; $lblVer.Font = New-Object System.Drawing.Font("Segoe UI",7,[System.Drawing.FontStyle]::Bold) $lblVer.ForeColor = $Cor; $lblVer.Location = New-Object System.Drawing.Point(12,12); $lblVer.AutoSize = $true $card.Controls.Add($lblVer) $lblTit = New-Object System.Windows.Forms.Label $lblTit.Text = $Titulo; $lblTit.Font = New-Object System.Drawing.Font("Segoe UI",11,[System.Drawing.FontStyle]::Bold) $lblTit.ForeColor = $corTextoClaro; $lblTit.Location = New-Object System.Drawing.Point(12,30); $lblTit.AutoSize = $true $card.Controls.Add($lblTit) $lblDesc = New-Object System.Windows.Forms.Label $lblDesc.Text = $Desc; $lblDesc.Font = New-Object System.Drawing.Font("Segoe UI",8) $lblDesc.ForeColor = $corTextoEscuro; $lblDesc.Location = New-Object System.Drawing.Point(12,58); $lblDesc.Size = New-Object System.Drawing.Size(210,60) $card.Controls.Add($lblDesc) $lblPlat = New-Object System.Windows.Forms.Label $lblPlat.Text = "x64 | PT-BR | Oficial Microsoft" $lblPlat.Font = New-Object System.Drawing.Font("Segoe UI",7); $lblPlat.ForeColor = $corTextoEscuro $lblPlat.Location = New-Object System.Drawing.Point(12,122); $lblPlat.AutoSize = $true $card.Controls.Add($lblPlat) $btnDl = New-Object System.Windows.Forms.Button $btnDl.Text = "Baixar Agora"; $btnDl.Location = New-Object System.Drawing.Point(12,144); $btnDl.Size = New-Object System.Drawing.Size(210,44) $btnDl.BackColor = $Cor; $btnDl.ForeColor = $corFundo $btnDl.FlatStyle = "Flat"; $btnDl.FlatAppearance.BorderSize = 0 $btnDl.Font = New-Object System.Drawing.Font("Segoe UI",10,[System.Drawing.FontStyle]::Bold); $btnDl.Cursor = [System.Windows.Forms.Cursors]::Hand $urlCapt = $URL; $tituloCapt = $Titulo $btnDl.add_Click({ Escrever-Log "Iniciando download: $tituloCapt..." Start-Process $urlCapt Escrever-Log "Download iniciado no navegador. Aguarde o instalador baixar." "OK" }.GetNewClosure()) $card.Controls.Add($btnDl) return $card } $card365 = Novo-CardDownloadOffice -X 20 -Y 460 -Titulo "Microsoft 365" -Versao "MICROSOFT 365 APPS" ` -Desc "Assinatura com atualizacoes continuas. Word, Excel, PowerPoint, Outlook e mais." ` -URL "https://c2rsetup.officeapps.live.com/c2r/download.aspx?ProductreleaseID=O365ProPlusRetail&platform=x64&language=pt-br&version=O16GA" ` -Cor ([System.Drawing.Color]::FromArgb(0,120,215)) $card2024 = Novo-CardDownloadOffice -X 264 -Y 460 -Titulo "Office 2024" -Versao "OFFICE 2024 PRO PLUS" ` -Desc "Versao perpetu mais recente. Sem assinatura. Licenca unica." ` -URL "https://c2rsetup.officeapps.live.com/c2r/download.aspx?ProductreleaseID=ProPlus2024Retail&platform=x64&language=pt-br&version=O16GA" ` -Cor ([System.Drawing.Color]::FromArgb(35,197,120)) $card2021 = Novo-CardDownloadOffice -X 508 -Y 460 -Titulo "Office 2021" -Versao "OFFICE 2021 PRO PLUS" ` -Desc "Versao perp etua estavel. Sem assinatura. Compativel com Windows 10/11." ` -URL "https://c2rsetup.officeapps.live.com/c2r/download.aspx?ProductreleaseID=ProPlus2021Retail&platform=x64&language=pt-br&version=O16GA" ` -Cor ([System.Drawing.Color]::FromArgb(255,189,46)) $pnlMsScroll.Controls.AddRange(@($card365,$card2024,$card2021)) $lblDlNota = New-Object System.Windows.Forms.Label $lblDlNota.Text = "Os downloads sao iniciados via navegador direto dos servidores oficiais Microsoft (c2rsetup.officeapps.live.com)" $lblDlNota.ForeColor = $corTextoEscuro; $lblDlNota.Font = New-Object System.Drawing.Font("Segoe UI",8) $lblDlNota.Location = New-Object System.Drawing.Point(20,672); $lblDlNota.AutoSize = $true $pnlMsScroll.Controls.Add($lblDlNota) # ═══════════════════════════════════════════════════════════ # ABA 6 — AJUSTES # ═══════════════════════════════════════════════════════════ $pAjustes = $tabPanels[6] $pnlAjScroll = New-Object System.Windows.Forms.Panel $pnlAjScroll.Dock = "Fill"; $pnlAjScroll.BackColor = $corFundo; $pnlAjScroll.AutoScroll = $true # Função auxiliar para criar um card de ajuste function Novo-CardAjuste { param( [int]$Y, [string]$Titulo, [string]$Descricao, [string]$TextoBotaoAtivar, [string]$TextoBotaoDesfazer, [System.Drawing.Color]$Cor, [scriptblock]$AcaoAtivar, [scriptblock]$AcaoDesfazer ) $card = New-Object System.Windows.Forms.Panel $card.Location = New-Object System.Drawing.Point(16, $Y) $card.Size = New-Object System.Drawing.Size(740, 160) $card.BackColor = $corPainel $bar = New-Object System.Windows.Forms.Panel $bar.Location = New-Object System.Drawing.Point(0,0); $bar.Size = New-Object System.Drawing.Size(4,160); $bar.BackColor = $Cor $card.Controls.Add($bar) $lblTit = New-Object System.Windows.Forms.Label $lblTit.Text = $Titulo; $lblTit.Font = New-Object System.Drawing.Font("Segoe UI",11,[System.Drawing.FontStyle]::Bold) $lblTit.ForeColor = $Cor; $lblTit.Location = New-Object System.Drawing.Point(16,12); $lblTit.AutoSize = $true $card.Controls.Add($lblTit) $lblDesc = New-Object System.Windows.Forms.Label $lblDesc.Text = $Descricao; $lblDesc.Font = New-Object System.Drawing.Font("Segoe UI",9) $lblDesc.ForeColor = $corTextoEscuro; $lblDesc.Location = New-Object System.Drawing.Point(16,38) $lblDesc.Size = New-Object System.Drawing.Size(720,52) $card.Controls.Add($lblDesc) $btnAtivar = New-Object System.Windows.Forms.Button $btnAtivar.Text = $TextoBotaoAtivar $btnAtivar.Location = New-Object System.Drawing.Point(16, 102); $btnAtivar.Size = New-Object System.Drawing.Size(260,42) $btnAtivar.BackColor = $Cor; $btnAtivar.ForeColor = $corFundo $btnAtivar.FlatStyle = "Flat"; $btnAtivar.FlatAppearance.BorderSize = 0 $btnAtivar.Font = New-Object System.Drawing.Font("Segoe UI",10,[System.Drawing.FontStyle]::Bold) $btnAtivar.Cursor = [System.Windows.Forms.Cursors]::Hand $btnAtivar.add_Click($AcaoAtivar) $card.Controls.Add($btnAtivar) $btnDesfazer = New-Object System.Windows.Forms.Button $btnDesfazer.Text = $TextoBotaoDesfazer $btnDesfazer.Location = New-Object System.Drawing.Point(290, 102); $btnDesfazer.Size = New-Object System.Drawing.Size(220,42) $btnDesfazer.BackColor = $corBorda; $btnDesfazer.ForeColor = $corTextoEscuro $btnDesfazer.FlatStyle = "Flat"; $btnDesfazer.FlatAppearance.BorderSize = 0 $btnDesfazer.Font = New-Object System.Drawing.Font("Segoe UI",9) $btnDesfazer.Cursor = [System.Windows.Forms.Cursors]::Hand $btnDesfazer.add_Click($AcaoDesfazer) $card.Controls.Add($btnDesfazer) return $card } # ── Card 1: Visualizador de Fotos Classico ──────────────── $cardFotos = Novo-CardAjuste -Y 16 -Cor $corDestaque ` -Titulo "Visualizador de Fotos Classico (Windows Photo Viewer)" ` -Descricao "Reativa o antigo Windows Photo Viewer como visualizador padrao de imagens no Windows 10/11.`nO novo app 'Fotos' continua instalado — este ajuste apenas restaura o visualizador classico como opcao padrao (mais rapido e leve)." ` -TextoBotaoAtivar "Ativar Visualizador Classico" ` -TextoBotaoDesfazer "Reverter para App Fotos" ` -AcaoAtivar { try { # Registrar Windows Photo Viewer no registro $progId = "HKLM:\SOFTWARE\Microsoft\Windows Photo Viewer\Capabilities\FileAssociations" if (-not (Test-Path $progId)) { New-Item -Path $progId -Force | Out-Null } @(".jpg",".jpeg",".png",".bmp",".gif",".tiff",".tif",".ico",".wdp",".jfif") | ForEach-Object { Set-ItemProperty -Path $progId -Name $_ -Value "PhotoViewer.FileAssoc.Tiff" -Type String -ErrorAction SilentlyContinue } # Registrar handler de aplicativo $appPath = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options" # Adicionar via registro de Classes $classes = @( "HKCR:\Applications\photoviewer.dll\shell\open\command", "HKCR:\Applications\photoviewer.dll\shell\open\DropTarget" ) # Metodo mais confiavel: importar via reg add $regCmds = @( 'reg add "HKCR\Applications\photoviewer.dll\shell\open" /v "MuiVerb" /t REG_SZ /d "@photoviewer.dll,-3043" /f', 'reg add "HKCR\Applications\photoviewer.dll\shell\open\command" /ve /t REG_EXPAND_SZ /d "%SystemRoot%\System32\rundll32.exe \"%ProgramFiles%\Windows Photo Viewer\PhotoViewer.dll\", ImageView_Fullscreen %1" /f', 'reg add "HKCR\Applications\photoviewer.dll\shell\open\DropTarget" /v "Clsid" /t REG_SZ /d "{FFE2A43C-56B9-4bf5-9A79-CC6D4285608A}" /f', 'reg add "HKCR\.jpg\OpenWithProgids" /v "PhotoViewer.FileAssoc.Jpeg" /t REG_NONE /f', 'reg add "HKCR\.jpeg\OpenWithProgids" /v "PhotoViewer.FileAssoc.Jpeg" /t REG_NONE /f', 'reg add "HKCR\.png\OpenWithProgids" /v "PhotoViewer.FileAssoc.Png" /t REG_NONE /f', 'reg add "HKCR\.bmp\OpenWithProgids" /v "PhotoViewer.FileAssoc.Bmp" /t REG_NONE /f', 'reg add "HKCR\.gif\OpenWithProgids" /v "PhotoViewer.FileAssoc.Gif" /t REG_NONE /f', 'reg add "HKCR\.tiff\OpenWithProgids" /v "PhotoViewer.FileAssoc.Tiff" /t REG_NONE /f', 'reg add "HKCR\.tif\OpenWithProgids" /v "PhotoViewer.FileAssoc.Tiff" /t REG_NONE /f' ) foreach ($cmd in $regCmds) { & cmd.exe /c $cmd 2>$null | Out-Null } Escrever-Log "Visualizador de Fotos Classico ativado!" "OK" Escrever-Log "Clique com botao direito em uma imagem > Abrir com > Escolher outro aplicativo > Windows Photo Viewer" "INFO" [System.Windows.Forms.MessageBox]::Show( "Visualizador Classico ativado com sucesso!`n`nPara usar:`nClique direito em uma imagem > 'Abrir com' > 'Escolher outro aplicativo' > selecione 'Windows Photo Viewer'`n`nSe desejar, marque 'Sempre usar este aplicativo' para definir como padrao.", "Ativado!", "OK", "Information") | Out-Null } catch { Escrever-Log "Erro ao ativar visualizador: $_" "ERRO" } } ` -AcaoDesfazer { try { $regCmds = @( 'reg delete "HKCR\Applications\photoviewer.dll\shell\open\command" /f', 'reg delete "HKCR\Applications\photoviewer.dll\shell\open\DropTarget" /f', 'reg delete "HKCR\.jpg\OpenWithProgids" /v "PhotoViewer.FileAssoc.Jpeg" /f', 'reg delete "HKCR\.jpeg\OpenWithProgids" /v "PhotoViewer.FileAssoc.Jpeg" /f', 'reg delete "HKCR\.png\OpenWithProgids" /v "PhotoViewer.FileAssoc.Png" /f', 'reg delete "HKCR\.bmp\OpenWithProgids" /v "PhotoViewer.FileAssoc.Bmp" /f', 'reg delete "HKCR\.gif\OpenWithProgids" /v "PhotoViewer.FileAssoc.Gif" /f', 'reg delete "HKCR\.tiff\OpenWithProgids" /v "PhotoViewer.FileAssoc.Tiff" /f', 'reg delete "HKCR\.tif\OpenWithProgids" /v "PhotoViewer.FileAssoc.Tiff" /f' ) foreach ($cmd in $regCmds) { & cmd.exe /c $cmd 2>$null | Out-Null } Escrever-Log "Visualizador classico removido. App Fotos e o padrao." "OK" [System.Windows.Forms.MessageBox]::Show("Revertido! O app Fotos voltara a ser o padrao.","Revertido","OK","Information") | Out-Null } catch { Escrever-Log "Erro ao reverter: $_" "ERRO" } } # ── Card 2: Menu de Contexto Windows 10 ────────────────── $cardMenu = Novo-CardAjuste -Y 192 -Cor $corAmarelo ` -Titulo "Menu de Contexto Estilo Windows 10 (Botao Direito Completo)" ` -Descricao "Remove o novo menu simplificado do Windows 11 e restaura o menu de contexto completo do Windows 10 ao clicar com o botao direito.`nElimina a necessidade de clicar em 'Mostrar mais opcoes' para acessar o menu completo." ` -TextoBotaoAtivar "Ativar Menu Win10" ` -TextoBotaoDesfazer "Restaurar Menu Win11" ` -AcaoAtivar { try { $regPath = "HKCU:\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" if (-not (Test-Path $regPath)) { New-Item -Path $regPath -Force | Out-Null } Set-ItemProperty -Path $regPath -Name "(Default)" -Value "" -Type String # Reiniciar Explorer para aplicar imediatamente Stop-Process -Name "explorer" -Force -ErrorAction SilentlyContinue Start-Sleep -Milliseconds 800 Start-Process "explorer" Escrever-Log "Menu de contexto estilo Windows 10 ativado!" "OK" [System.Windows.Forms.MessageBox]::Show( "Menu de contexto do Windows 10 ativado!`nO Explorer foi reiniciado para aplicar a mudanca.", "Ativado!", "OK", "Information") | Out-Null } catch { Escrever-Log "Erro ao ativar menu Win10: $_" "ERRO" } } ` -AcaoDesfazer { try { $regPath = "HKCU:\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}" if (Test-Path $regPath) { Remove-Item -Path $regPath -Recurse -Force -ErrorAction SilentlyContinue } Stop-Process -Name "explorer" -Force -ErrorAction SilentlyContinue Start-Sleep -Milliseconds 800 Start-Process "explorer" Escrever-Log "Menu de contexto do Windows 11 restaurado!" "OK" [System.Windows.Forms.MessageBox]::Show( "Menu padrao do Windows 11 restaurado!`nO Explorer foi reiniciado para aplicar a mudanca.", "Restaurado", "OK", "Information") | Out-Null } catch { Escrever-Log "Erro ao restaurar menu Win11: $_" "ERRO" } } $pnlAjScroll.Controls.Add($cardFotos) $pnlAjScroll.Controls.Add($cardMenu) # ── Card 3: Print Management ────────────────────────────── $cardPrint = Novo-CardAjuste -Y 368 -Cor $corVerde ` -Titulo "Habilitar Print Management (Gerenciamento de Impressao)" ` -Descricao "Instala o console de Gerenciamento de Impressao (printmanagement.msc) no Windows Pro/Enterprise.`nUtil para gerenciar impressoras, drivers e filas de impressao em rede. Requer conexao com a internet para download via DISM." ` -TextoBotaoAtivar "Instalar Print Management" ` -TextoBotaoDesfazer "Remover Print Management" ` -AcaoAtivar { $conf = [System.Windows.Forms.MessageBox]::Show( "Isso vai instalar o Print Management via DISM.`nRequer internet e pode demorar alguns minutos.`n`nContinuar?", "Instalar Print Management", "YesNo", "Question") if ($conf -ne "Yes") { return } Escrever-Log "Instalando Print Management via DISM..." Start-Process "cmd.exe" -ArgumentList "/k dism /Online /add-Capability /CapabilityName:Print.Management.Console~~~~0.0.1.0" -Verb RunAs Escrever-Log "DISM iniciado em terminal separado. Aguarde a conclusao." "OK" [System.Windows.Forms.MessageBox]::Show( "O DISM foi iniciado em um terminal separado.`n`nAguarde a conclusao (pode demorar alguns minutos).`nApós terminar, o printmanagement.msc estara disponivel em Ferramentas Administrativas.", "Instalando...", "OK", "Information") | Out-Null } ` -AcaoDesfazer { $conf = [System.Windows.Forms.MessageBox]::Show( "Remover o Print Management do sistema?", "Remover Print Management", "YesNo", "Warning") if ($conf -ne "Yes") { return } Escrever-Log "Removendo Print Management via DISM..." Start-Process "cmd.exe" -ArgumentList "/k dism /Online /Remove-Capability /CapabilityName:Print.Management.Console~~~~0.0.1.0" -Verb RunAs Escrever-Log "DISM de remocao iniciado em terminal separado." "OK" } $pnlAjScroll.Controls.Add($cardPrint) # ── Card 4: Hyper-V ─────────────────────────────────────── $cardHyperV = New-Object System.Windows.Forms.Panel $cardHyperV.Location = New-Object System.Drawing.Point(16, 544) $cardHyperV.Size = New-Object System.Drawing.Size(740, 220) $cardHyperV.BackColor = $corPainel $pnlAjScroll.Controls.Add($cardHyperV) $acHV = New-Object System.Windows.Forms.Panel $acHV.Location = New-Object System.Drawing.Point(0,0); $acHV.Size = New-Object System.Drawing.Size(4,220) $acHV.BackColor = [System.Drawing.Color]::FromArgb(168,85,247) $cardHyperV.Controls.Add($acHV) $lblHVTit = New-Object System.Windows.Forms.Label $lblHVTit.Text = "Hyper-V (Hypervisor Windows)"; $lblHVTit.Font = New-Object System.Drawing.Font("Segoe UI",11,[System.Drawing.FontStyle]::Bold) $lblHVTit.ForeColor = [System.Drawing.Color]::FromArgb(168,85,247) $lblHVTit.Location = New-Object System.Drawing.Point(16,12); $lblHVTit.AutoSize = $true $cardHyperV.Controls.Add($lblHVTit) $lblHVDesc = New-Object System.Windows.Forms.Label $lblHVDesc.Text = "Instala o Hyper-V (virtualizacao nativa do Windows Pro/Enterprise).`nRequer virtualizacao habilitada na BIOS (VT-x/AMD-V). O botao 'Verificar Status' checa tudo antes de instalar." $lblHVDesc.Font = New-Object System.Drawing.Font("Segoe UI",9); $lblHVDesc.ForeColor = $corTextoEscuro $lblHVDesc.Location = New-Object System.Drawing.Point(16,38); $lblHVDesc.Size = New-Object System.Drawing.Size(716,40) $cardHyperV.Controls.Add($lblHVDesc) # Label de status (atualizado dinamicamente) $lblHVStatus = New-Object System.Windows.Forms.Label $lblHVStatus.Text = "Clique em 'Verificar Status' para checar o ambiente."; $lblHVStatus.Font = New-Object System.Drawing.Font("Consolas",8) $lblHVStatus.ForeColor = $corTextoEscuro; $lblHVStatus.Location = New-Object System.Drawing.Point(16,82); $lblHVStatus.Size = New-Object System.Drawing.Size(716,50) $cardHyperV.Controls.Add($lblHVStatus) # Botão Verificar Status $btnHVCheck = New-Object System.Windows.Forms.Button $btnHVCheck.Text = "Verificar Status"; $btnHVCheck.Location = New-Object System.Drawing.Point(16,140); $btnHVCheck.Size = New-Object System.Drawing.Size(170,42) $btnHVCheck.BackColor = $corBorda; $btnHVCheck.ForeColor = $corTextoClaro $btnHVCheck.FlatStyle = "Flat"; $btnHVCheck.FlatAppearance.BorderSize = 0 $btnHVCheck.Font = New-Object System.Drawing.Font("Segoe UI",9,[System.Drawing.FontStyle]::Bold); $btnHVCheck.Cursor = [System.Windows.Forms.Cursors]::Hand $cardHyperV.Controls.Add($btnHVCheck) # Botão Instalar $btnHVInstall = New-Object System.Windows.Forms.Button $btnHVInstall.Text = "Instalar Hyper-V"; $btnHVInstall.Location = New-Object System.Drawing.Point(196,140); $btnHVInstall.Size = New-Object System.Drawing.Size(170,42) $btnHVInstall.BackColor = [System.Drawing.Color]::FromArgb(168,85,247); $btnHVInstall.ForeColor = $corTextoClaro $btnHVInstall.FlatStyle = "Flat"; $btnHVInstall.FlatAppearance.BorderSize = 0 $btnHVInstall.Font = New-Object System.Drawing.Font("Segoe UI",9,[System.Drawing.FontStyle]::Bold); $btnHVInstall.Cursor = [System.Windows.Forms.Cursors]::Hand $cardHyperV.Controls.Add($btnHVInstall) # Botão Remover $btnHVRemove = New-Object System.Windows.Forms.Button $btnHVRemove.Text = "Remover Hyper-V"; $btnHVRemove.Location = New-Object System.Drawing.Point(376,140); $btnHVRemove.Size = New-Object System.Drawing.Size(170,42) $btnHVRemove.BackColor = $corBorda; $btnHVRemove.ForeColor = $corTextoEscuro $btnHVRemove.FlatStyle = "Flat"; $btnHVRemove.FlatAppearance.BorderSize = 0 $btnHVRemove.Font = New-Object System.Drawing.Font("Segoe UI",9); $btnHVRemove.Cursor = [System.Windows.Forms.Cursors]::Hand $cardHyperV.Controls.Add($btnHVRemove) # ── Lógica dos botões ──────────────────────────────────── $btnHVCheck.add_Click({ Escrever-Log "Verificando status do Hyper-V e virtualizacao..." $lblHVStatus.ForeColor = $corTextoEscuro $lblHVStatus.Text = "Verificando..." try { # Verificar se a CPU suporta virtualização $cpu = Get-CimInstance Win32_Processor | Select-Object -First 1 $vmEnabled = $cpu.VirtualizationFirmwareEnabled # Verificar se Hyper-V está instalado $hvFeature = Get-WindowsOptionalFeature -Online -FeatureName "Microsoft-Hyper-V-All" -EA SilentlyContinue $hvState = if ($hvFeature) { $hvFeature.State } else { "Desconhecido" } # Verificar se o serviço VMMS está rodando (Hyper-V Virtual Machine Management) $vmms = Get-Service -Name "vmms" -EA SilentlyContinue $vmmsStatus = if ($vmms) { $vmms.Status } else { "Nao instalado" } # Verificar se SecureBoot/SLAT (Second Level Address Translation) $slatInfo = (Get-CimInstance Win32_Processor).SecondLevelAddressTranslationExtensions # Montar texto de status $linhas = @() $linhas += "Virtualizacao na CPU (VT-x/AMD-V): $(if($vmEnabled){'HABILITADA ✓'}else{'DESABILITADA ✗ — Habilite na BIOS antes de instalar'})" $linhas += "SLAT (Traducao de Endereco Nivel 2): $(if($slatInfo){'Suportado ✓'}else{'Nao suportado ✗'})" $linhas += "Hyper-V Feature: $(if($hvState -eq 'Enabled'){'INSTALADO e ATIVO ✓'}elseif($hvState -eq 'Disabled'){'Instalado mas DESATIVADO'}else{'NAO INSTALADO'})" $linhas += "Servico VMMS: $vmmsStatus" $lblHVStatus.Text = $linhas -join "`r`n" if ($vmEnabled -and $hvState -eq "Enabled") { $lblHVStatus.ForeColor = $corVerde Escrever-Log "Hyper-V ativo e virtualizacao habilitada!" "OK" } elseif (-not $vmEnabled) { $lblHVStatus.ForeColor = $corVermelho Escrever-Log "Virtualizacao DESABILITADA na BIOS!" "AVISO" [System.Windows.Forms.MessageBox]::Show( "ATENCAO: A virtualizacao esta DESABILITADA na BIOS!`n`nPara instalar o Hyper-V voce precisa primeiro:`n1. Reiniciar o computador`n2. Entrar na BIOS/UEFI (normalmente Del, F2 ou F10 durante o boot)`n3. Encontrar 'Intel VT-x', 'AMD-V' ou 'Virtualization Technology'`n4. Habilitar a opcao e salvar`n5. Reiniciar e tentar instalar novamente", "Virtualizacao Desabilitada", "OK", "Warning") | Out-Null } elseif ($hvState -ne "Enabled") { $lblHVStatus.ForeColor = $corAmarelo Escrever-Log "Virtualizacao OK mas Hyper-V nao instalado." "INFO" } } catch { $lblHVStatus.Text = "Erro ao verificar: $_"; $lblHVStatus.ForeColor = $corVermelho Escrever-Log "Erro ao verificar Hyper-V: $_" "ERRO" } }) $btnHVInstall.add_Click({ # Verificar virtualização antes de instalar try { $cpu = Get-CimInstance Win32_Processor | Select-Object -First 1 if (-not $cpu.VirtualizationFirmwareEnabled) { [System.Windows.Forms.MessageBox]::Show( "ATENCAO: A virtualizacao esta DESABILITADA na BIOS!`n`nVoce precisa habilitar VT-x / AMD-V na BIOS antes de instalar o Hyper-V.`n`nClique em 'Verificar Status' para mais detalhes.", "Virtualizacao Desabilitada", "OK", "Warning") | Out-Null Escrever-Log "Instalacao bloqueada: virtualizacao desabilitada na BIOS!" "AVISO" return } # Verificar se ja está instalado $hvFeature = Get-WindowsOptionalFeature -Online -FeatureName "Microsoft-Hyper-V-All" -EA SilentlyContinue if ($hvFeature -and $hvFeature.State -eq "Enabled") { [System.Windows.Forms.MessageBox]::Show("O Hyper-V ja esta instalado e ativo!","Hyper-V","OK","Information") | Out-Null return } } catch {} $conf = [System.Windows.Forms.MessageBox]::Show( "Instalar o Hyper-V?`n`nIsso ira habilitar:`n- Microsoft-Hyper-V (Hypervisor)`n- Microsoft-Hyper-V-Tools-All (Gerenciador)`n- Microsoft-Hyper-V-Management-PowerShell`n`nO computador sera reiniciado para concluir a instalacao.", "Instalar Hyper-V", "YesNo", "Question") if ($conf -ne "Yes") { return } Escrever-Log "Instalando Hyper-V via DISM..." # Instalar todos os componentes do Hyper-V e reiniciar automaticamente Start-Process "powershell.exe" -ArgumentList @( "-NoProfile", "-ExecutionPolicy", "Bypass", "-Command", "Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All -All -NoRestart; " + "dism /online /enable-feature /featurename:Microsoft-Hyper-V-Management-PowerShell /all /norestart; " + "Write-Host ''; Write-Host 'Hyper-V instalado! Pressione qualquer tecla para REINICIAR...' -ForegroundColor Green; " + "[void][System.Console]::ReadKey(`$true); Restart-Computer -Force" ) -Verb RunAs Escrever-Log "Instalacao do Hyper-V iniciada. O PC sera reiniciado apos concluir." "OK" }) $btnHVRemove.add_Click({ $conf = [System.Windows.Forms.MessageBox]::Show( "Remover o Hyper-V do sistema?`nO computador sera reiniciado para concluir.", "Remover Hyper-V", "YesNo", "Warning") if ($conf -ne "Yes") { return } Escrever-Log "Removendo Hyper-V..." Start-Process "powershell.exe" -ArgumentList @( "-NoProfile", "-ExecutionPolicy", "Bypass", "-Command", "Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All -NoRestart; " + "Write-Host ''; Write-Host 'Hyper-V removido! Pressione qualquer tecla para REINICIAR...' -ForegroundColor Yellow; " + "[void][System.Console]::ReadKey(`$true); Restart-Computer -Force" ) -Verb RunAs Escrever-Log "Remocao do Hyper-V iniciada. O PC sera reiniciado apos concluir." "OK" }) $pAjustes.Controls.Add($pnlAjScroll) # ═══════════════════════════════════════════════════════════ # ABA 7 — REDE # ═══════════════════════════════════════════════════════════ $pRede = $tabPanels[7] # Layout: painel esquerdo (ferramentas) + painel direito (output) $pnlRedeLeft = New-Object System.Windows.Forms.Panel $pnlRedeLeft.Location = New-Object System.Drawing.Point(0,0) $pnlRedeLeft.Size = New-Object System.Drawing.Size(310, 650) $pnlRedeLeft.Anchor = "Top,Left,Bottom" $pnlRedeLeft.BackColor= $corPainel $pRede.Controls.Add($pnlRedeLeft) $sepRede = New-Object System.Windows.Forms.Panel $sepRede.Location = New-Object System.Drawing.Point(310,0); $sepRede.Size = New-Object System.Drawing.Size(1,650) $sepRede.Anchor = "Top,Left,Bottom"; $sepRede.BackColor = $corBorda $pRede.Controls.Add($sepRede) # Output (direita) $pnlRedeRight = New-Object System.Windows.Forms.Panel $pnlRedeRight.Location = New-Object System.Drawing.Point(311,0) $pnlRedeRight.Size = New-Object System.Drawing.Size(480, 650) $pnlRedeRight.Anchor = "Top,Left,Bottom,Right" $pnlRedeRight.BackColor = $corFundo $pRede.Controls.Add($pnlRedeRight) $lblRedeOut = New-Object System.Windows.Forms.Label $lblRedeOut.Text = "RESULTADO"; $lblRedeOut.Font = New-Object System.Drawing.Font("Segoe UI",8,[System.Drawing.FontStyle]::Bold) $lblRedeOut.ForeColor = $corTextoEscuro; $lblRedeOut.Location = New-Object System.Drawing.Point(4,4); $lblRedeOut.AutoSize = $true $pnlRedeRight.Controls.Add($lblRedeOut) $txtRedeOut = New-Object System.Windows.Forms.RichTextBox $txtRedeOut.Location = New-Object System.Drawing.Point(4, 22) $txtRedeOut.Size = New-Object System.Drawing.Size(472, 590) $txtRedeOut.Anchor = "Top,Left,Bottom,Right" $txtRedeOut.BackColor = $corPainel; $txtRedeOut.ForeColor = $corVerde $txtRedeOut.Font = New-Object System.Drawing.Font("Consolas", 8.5) $txtRedeOut.ReadOnly = $true; $txtRedeOut.BorderStyle = "None"; $txtRedeOut.ScrollBars = "Vertical" $pnlRedeRight.Controls.Add($txtRedeOut) $btnLimRedeOut = New-Object System.Windows.Forms.Button $btnLimRedeOut.Text = "Limpar"; $btnLimRedeOut.Location = New-Object System.Drawing.Point(4,616) $btnLimRedeOut.Size = New-Object System.Drawing.Size(472,28); $btnLimRedeOut.BackColor = $corBorda $btnLimRedeOut.ForeColor = $corTextoEscuro; $btnLimRedeOut.FlatStyle = "Flat"; $btnLimRedeOut.FlatAppearance.BorderSize = 0 $btnLimRedeOut.add_Click({ $txtRedeOut.Clear() }) $pnlRedeRight.Controls.Add($btnLimRedeOut) function Exibir-RedeOut { param([string]$texto, [string]$titulo = "") $txtRedeOut.Clear() if ($titulo) { $txtRedeOut.AppendText("=== $titulo ===`r`n`r`n") } $txtRedeOut.AppendText($texto) $txtRedeOut.SelectionStart = 0; $txtRedeOut.ScrollToCaret() } # ── Botões do painel esquerdo ───────────────────────────── function Novo-BtnRede { param([string]$txt, [int]$y, [System.Drawing.Color]$cor = $corBorda) $b = New-Object System.Windows.Forms.Button $b.Text = $txt; $b.Location = New-Object System.Drawing.Point(8,$y); $b.Size = New-Object System.Drawing.Size(294,36) $b.BackColor = $cor; $b.ForeColor = if($cor -eq $corBorda){$corTextoClaro}else{$corFundo} $b.FlatStyle = "Flat"; $b.FlatAppearance.BorderSize = 0 $b.Font = New-Object System.Drawing.Font("Segoe UI",9,[System.Drawing.FontStyle]::Bold) $b.Cursor = [System.Windows.Forms.Cursors]::Hand $pnlRedeLeft.Controls.Add($b) return $b } $lblRedeInfo = New-Object System.Windows.Forms.Label $lblRedeInfo.Text = "INFORMACOES"; $lblRedeInfo.Font = New-Object System.Drawing.Font("Segoe UI",7,[System.Drawing.FontStyle]::Bold) $lblRedeInfo.ForeColor = $corTextoEscuro; $lblRedeInfo.Location = New-Object System.Drawing.Point(8,10); $lblRedeInfo.AutoSize = $true $pnlRedeLeft.Controls.Add($lblRedeInfo) $btnIPInfo = Novo-BtnRede -txt "IP / MAC / Gateway / DNS" -y 28 -cor $corDestaque $btnIPInfo.add_Click({ $adapters = Get-NetIPConfiguration | Where-Object { $_.IPv4Address } $sb = [System.Text.StringBuilder]::new() foreach ($a in $adapters) { $sb.AppendLine("Adaptador : $($a.InterfaceAlias)") | Out-Null $sb.AppendLine("IP : $($a.IPv4Address.IPAddress)") | Out-Null $sb.AppendLine("Mascara : $($a.IPv4Address.PrefixLength) bits") | Out-Null $sb.AppendLine("Gateway : $($a.IPv4DefaultGateway.NextHop)") | Out-Null $dns = ($a.DNSServer | Where-Object {$_.AddressFamily -eq 2}).ServerAddresses -join ", " $sb.AppendLine("DNS : $dns") | Out-Null $mac = (Get-NetAdapter -InterfaceIndex $a.InterfaceIndex -EA SilentlyContinue).MacAddress $sb.AppendLine("MAC : $mac") | Out-Null $sb.AppendLine("") | Out-Null } Exibir-RedeOut -titulo "IP / MAC / Gateway / DNS" -texto $sb.ToString() Escrever-Log "Info de rede coletada." "OK" }) $btnIPPublico = Novo-BtnRede -txt "Ver IP Publico (externo)" -y 70 $btnIPPublico.add_Click({ Escrever-Log "Consultando IP publico..." try { $ip = (Invoke-RestMethod -Uri "https://api.ipify.org" -TimeoutSec 10 -ErrorAction Stop) Exibir-RedeOut -titulo "IP Publico" -texto "IP Publico: $ip" Escrever-Log "IP publico: $ip" "OK" } catch { Exibir-RedeOut -titulo "Erro" -texto "Nao foi possivel consultar o IP publico.`nVerifique a conexao com a internet." } }) $btnCompart = Novo-BtnRede -txt "Compartilhamentos Ativos" -y 112 $btnCompart.add_Click({ $shares = net share 2>&1 | Out-String Exibir-RedeOut -titulo "Compartilhamentos Ativos (net share)" -texto $shares Escrever-Log "Compartilhamentos listados." "OK" }) $btnConexoes = Novo-BtnRede -txt "Conexoes Ativas (netstat)" -y 154 $btnConexoes.add_Click({ Escrever-Log "Coletando conexoes ativas..." $ns = netstat -ano 2>&1 | Out-String Exibir-RedeOut -titulo "Conexoes Ativas (netstat -ano)" -texto $ns Escrever-Log "Conexoes listadas." "OK" }) $lblRedeFerr = New-Object System.Windows.Forms.Label $lblRedeFerr.Text = "FERRAMENTAS"; $lblRedeFerr.Font = New-Object System.Drawing.Font("Segoe UI",7,[System.Drawing.FontStyle]::Bold) $lblRedeFerr.ForeColor = $corTextoEscuro; $lblRedeFerr.Location = New-Object System.Drawing.Point(8,202); $lblRedeFerr.AutoSize = $true $pnlRedeLeft.Controls.Add($lblRedeFerr) # Campo host/IP para Ping e Tracert $txtHost = New-Object System.Windows.Forms.TextBox $txtHost.Location = New-Object System.Drawing.Point(8,220); $txtHost.Size = New-Object System.Drawing.Size(294,24) $txtHost.BackColor = $corBorda; $txtHost.ForeColor = $corTextoClaro; $txtHost.BorderStyle = "FixedSingle" $txtHost.Text = "8.8.8.8"; $txtHost.Font = New-Object System.Drawing.Font("Consolas",9) $pnlRedeLeft.Controls.Add($txtHost) $btnPing = Novo-BtnRede -txt "Ping" -y 250 -cor $corVerde $btnPing.add_Click({ $hostAlvo = $txtHost.Text.Trim() if (-not $hostAlvo) { return } Escrever-Log "Ping para $hostAlvo..." Rodar-Async -Vars @{h=$hostAlvo} -Bloco { $res = ping $h -n 4 2>&1 | Out-String $script:txtRedeOut_result = $res $script:txtRedeOut_titulo = "Ping -> $h" } -AoFinalizar { Exibir-RedeOut -titulo $script:txtRedeOut_titulo -texto $script:txtRedeOut_result Escrever-Log "Ping concluido." "OK" } }) $btnTracert = Novo-BtnRede -txt "Tracert (rota)" -y 292 $btnTracert.add_Click({ $hostAlvo = $txtHost.Text.Trim() if (-not $hostAlvo) { return } Escrever-Log "Tracert para $hostAlvo (pode demorar)..." $txtRedeOut.Clear(); $txtRedeOut.AppendText("=== Tracert -> $hostAlvo ===`r`n`r`nExecutando, aguarde...`r`n") Rodar-Async -Vars @{h=$hostAlvo} -Bloco { $res = tracert -d $h 2>&1 | Out-String $script:txtRedeOut_result = $res $script:txtRedeOut_titulo = "Tracert -> $h" } -AoFinalizar { Exibir-RedeOut -titulo $script:txtRedeOut_titulo -texto $script:txtRedeOut_result Escrever-Log "Tracert concluido." "OK" } }) $btnNslookup = Novo-BtnRede -txt "NSLookup (resolver DNS)" -y 334 $btnNslookup.add_Click({ $hostAlvo = $txtHost.Text.Trim() if (-not $hostAlvo) { return } Escrever-Log "NSLookup para $hostAlvo..." $res = nslookup $hostAlvo 2>&1 | Out-String Exibir-RedeOut -titulo "NSLookup -> $hostAlvo" -texto $res Escrever-Log "NSLookup concluido." "OK" }) $btnPortas = Novo-BtnRede -txt "Testar Porta Aberta" -y 376 $btnPortas.add_Click({ $hostAlvo = $txtHost.Text.Trim() $form2 = New-Object System.Windows.Forms.Form $form2.Text = "Testar Porta"; $form2.Size = New-Object System.Drawing.Size(320,130) $form2.StartPosition = "CenterScreen"; $form2.BackColor = $corPainel; $form2.ForeColor = $corTextoClaro $lblP = New-Object System.Windows.Forms.Label; $lblP.Text = "Porta (ex: 80, 443, 3389):"; $lblP.Location = New-Object System.Drawing.Point(10,12); $lblP.AutoSize = $true $txtP = New-Object System.Windows.Forms.TextBox; $txtP.Location = New-Object System.Drawing.Point(10,34); $txtP.Size = New-Object System.Drawing.Size(280,24); $txtP.BackColor=$corBorda;$txtP.ForeColor=$corTextoClaro $btnOKP = New-Object System.Windows.Forms.Button; $btnOKP.Text = "Testar"; $btnOKP.Location = New-Object System.Drawing.Point(10,66); $btnOKP.Size = New-Object System.Drawing.Size(280,28) $btnOKP.BackColor=$corDestaque;$btnOKP.ForeColor=$corTextoClaro;$btnOKP.FlatStyle="Flat";$btnOKP.FlatAppearance.BorderSize=0 $btnOKP.add_Click({ $form2.Tag = $txtP.Text; $form2.Close() }) $form2.Controls.AddRange(@($lblP,$txtP,$btnOKP)); $form2.ShowDialog() | Out-Null $portaNum = $form2.Tag if (-not $portaNum) { return } Escrever-Log "Testando ${hostAlvo}:$portaNum..." try { $tcp = New-Object System.Net.Sockets.TcpClient $conn = $tcp.BeginConnect($hostAlvo, [int]$portaNum, $null, $null) $wait = $conn.AsyncWaitHandle.WaitOne(3000, $false) if ($wait -and $tcp.Connected) { $tcp.EndConnect($conn) | Out-Null Exibir-RedeOut -titulo "Porta $portaNum em $hostAlvo" -texto "ABERTA - Conexao bem-sucedida na porta $portaNum de $hostAlvo" Escrever-Log "Porta $portaNum em ${hostAlvo}: ABERTA" "OK" } else { Exibir-RedeOut -titulo "Porta $portaNum em $hostAlvo" -texto "FECHADA ou FILTRADA - Nao foi possivel conectar na porta $portaNum de $hostAlvo" Escrever-Log "Porta $portaNum em ${hostAlvo}: FECHADA" "AVISO" } $tcp.Close() } catch { Exibir-RedeOut -titulo "Erro" -texto "Erro ao testar: $_" } }) $lblRedeAcoes = New-Object System.Windows.Forms.Label $lblRedeAcoes.Text = "ACOES"; $lblRedeAcoes.Font = New-Object System.Drawing.Font("Segoe UI",7,[System.Drawing.FontStyle]::Bold) $lblRedeAcoes.ForeColor = $corTextoEscuro; $lblRedeAcoes.Location = New-Object System.Drawing.Point(8,424); $lblRedeAcoes.AutoSize = $true $pnlRedeLeft.Controls.Add($lblRedeAcoes) $btnFlushDNS = Novo-BtnRede -txt "Flush DNS" -y 442 $btnFlushDNS.add_Click({ & ipconfig /flushdns | Out-Null; Exibir-RedeOut -titulo "Flush DNS" -texto "Cache DNS limpo com sucesso."; Escrever-Log "DNS limpo!" "OK" }) $btnRenovarIP = Novo-BtnRede -txt "Renovar IP (release + renew)" -y 484 $btnRenovarIP.add_Click({ Escrever-Log "Renovando IP..." $r = (& ipconfig /release 2>&1 | Out-String) + "`r`n" + (& ipconfig /renew 2>&1 | Out-String) Exibir-RedeOut -titulo "Renovar IP" -texto $r Escrever-Log "IP renovado!" "OK" }) $btnResetTCP = Novo-BtnRede -txt "Reset TCP/IP + Winsock" -y 526 -cor $corAmarelo $btnResetTCP.add_Click({ $conf = [System.Windows.Forms.MessageBox]::Show("Resetar Winsock e pilha TCP/IP?`nRequer reinicializacao para aplicar.","Confirmar","YesNo","Warning") if ($conf -ne "Yes") { return } $r = (& netsh winsock reset 2>&1 | Out-String) + (& netsh int ip reset 2>&1 | Out-String) + (& ipconfig /flushdns 2>&1 | Out-String) Exibir-RedeOut -titulo "Reset TCP/IP + Winsock" -texto $r Escrever-Log "TCP/IP e Winsock resetados! Reinicie o PC." "OK" }) $btnTestarDNS = Novo-BtnRede -txt "Comparar velocidade DNS" -y 568 $btnTestarDNS.add_Click({ Escrever-Log "Testando velocidade dos servidores DNS..." $txtRedeOut.Clear(); $txtRedeOut.AppendText("=== Comparacao de Velocidade DNS ===`r`n`r`nTestando, aguarde...`r`n") Rodar-Async -Vars @{} -Bloco { $servidores = @{ "Google 8.8.8.8" = "8.8.8.8" "Cloudflare 1.1.1.1" = "1.1.1.1" "Quad9 9.9.9.9" = "9.9.9.9" "OpenDNS 208.67.222" = "208.67.222.222" "AdGuard 94.140.14" = "94.140.14.14" } $resultados = @() foreach ($nome in $servidores.Keys) { $ip = $servidores[$nome] $tempos = @() for ($i = 0; $i -lt 3; $i++) { try { $sw = [System.Diagnostics.Stopwatch]::StartNew() $null = [System.Net.Dns]::GetHostEntry("google.com") 2>$null $sw.Stop() $tempos += $sw.ElapsedMilliseconds } catch { $tempos += 9999 } } $media = [math]::Round(($tempos | Measure-Object -Average).Average, 0) $resultados += [PSCustomObject]@{ Nome=$nome; IP=$ip; MediaMs=$media } } $resultados = $resultados | Sort-Object MediaMs $sb = [System.Text.StringBuilder]::new() $sb.AppendLine("Resultado (media de 3 consultas a google.com):`r`n") | Out-Null $pos = 1 foreach ($r in $resultados) { $estrela = if ($pos -eq 1) { " << MAIS RAPIDO" } else { "" } $sb.AppendLine("$pos. $($r.Nome.PadRight(20)) $($r.MediaMs) ms$estrela") | Out-Null $pos++ } $script:txtRedeOut_result = $sb.ToString() $script:txtRedeOut_titulo = "Comparacao de Velocidade DNS" } -AoFinalizar { Exibir-RedeOut -titulo $script:txtRedeOut_titulo -texto $script:txtRedeOut_result Escrever-Log "Teste DNS concluido." "OK" } }) # ═══════════════════════════════════════════════════════════ # ABA 8 — USUARIOS # ═══════════════════════════════════════════════════════════ $pUsers = $tabPanels[8] # Layout: lista de usuarios (esquerda) + acoes (direita) $pnlUsLeft = New-Object System.Windows.Forms.Panel $pnlUsLeft.Location = New-Object System.Drawing.Point(0,0); $pnlUsLeft.Size = New-Object System.Drawing.Size(290,650) $pnlUsLeft.Anchor = "Top,Left,Bottom"; $pnlUsLeft.BackColor = $corPainel $pUsers.Controls.Add($pnlUsLeft) $sepUs = New-Object System.Windows.Forms.Panel $sepUs.Location = New-Object System.Drawing.Point(290,0); $sepUs.Size = New-Object System.Drawing.Size(1,650) $sepUs.Anchor = "Top,Left,Bottom"; $sepUs.BackColor = $corBorda $pUsers.Controls.Add($sepUs) $pnlUsRight = New-Object System.Windows.Forms.Panel $pnlUsRight.Location = New-Object System.Drawing.Point(291,0); $pnlUsRight.Size = New-Object System.Drawing.Size(500,650) $pnlUsRight.Anchor = "Top,Left,Bottom,Right"; $pnlUsRight.BackColor = $corFundo $pUsers.Controls.Add($pnlUsRight) # ── Painel esquerdo: lista de usuários ─────────────────── $lblUsTit = New-Object System.Windows.Forms.Label $lblUsTit.Text = "USUARIOS LOCAIS"; $lblUsTit.Font = New-Object System.Drawing.Font("Segoe UI",7,[System.Drawing.FontStyle]::Bold) $lblUsTit.ForeColor = $corTextoEscuro; $lblUsTit.Location = New-Object System.Drawing.Point(8,8); $lblUsTit.AutoSize = $true $pnlUsLeft.Controls.Add($lblUsTit) $btnRefreshUs = New-Object System.Windows.Forms.Button $btnRefreshUs.Text = "Atualizar"; $btnRefreshUs.Location = New-Object System.Drawing.Point(200,4); $btnRefreshUs.Size = New-Object System.Drawing.Size(82,22) $btnRefreshUs.BackColor=$corBorda;$btnRefreshUs.ForeColor=$corTextoEscuro;$btnRefreshUs.FlatStyle="Flat";$btnRefreshUs.FlatAppearance.BorderSize=0 $btnRefreshUs.Font = New-Object System.Drawing.Font("Segoe UI",7) $pnlUsLeft.Controls.Add($btnRefreshUs) $lvUsers = New-Object System.Windows.Forms.ListView $lvUsers.Location = New-Object System.Drawing.Point(0,28); $lvUsers.Size = New-Object System.Drawing.Size(290,622) $lvUsers.Anchor = "Top,Left,Bottom"; $lvUsers.View = "Details"; $lvUsers.FullRowSelect = $true $lvUsers.BackColor = $corFundo; $lvUsers.ForeColor = $corTextoClaro; $lvUsers.BorderStyle = "None" $lvUsers.Font = New-Object System.Drawing.Font("Segoe UI",9); $lvUsers.GridLines = $false $lvUsers.Columns.Add("Usuario", 130) | Out-Null $lvUsers.Columns.Add("Status", 80) | Out-Null $lvUsers.Columns.Add("Admin", 60) | Out-Null $pnlUsLeft.Controls.Add($lvUsers) function Carregar-Usuarios { $lvUsers.Items.Clear() try { $admins = (Get-LocalGroupMember -Group "Administrators" -EA SilentlyContinue).Name | ForEach-Object { ($_ -split "\\")[-1] } Get-LocalUser | Sort-Object Name | ForEach-Object { $u = $_ $item = New-Object System.Windows.Forms.ListViewItem($u.Name) $status = if ($u.Enabled) { "Ativo" } else { "Inativo" } $isAdmin = if ($admins -contains $u.Name) { "Sim" } else { "Nao" } $item.SubItems.Add($status) | Out-Null $item.SubItems.Add($isAdmin) | Out-Null $item.ForeColor = if ($u.Enabled) { $corTextoClaro } else { $corTextoEscuro } $item.Tag = $u $lvUsers.Items.Add($item) | Out-Null } } catch { Escrever-Log "Erro ao listar usuarios: $_" "ERRO" } } Carregar-Usuarios $btnRefreshUs.add_Click({ Carregar-Usuarios; Escrever-Log "Lista de usuarios atualizada." "OK" }) # ── Painel direito: informações e ações ────────────────── $pnlUsScroll = New-Object System.Windows.Forms.Panel $pnlUsScroll.Dock = "Fill"; $pnlUsScroll.BackColor = $corFundo; $pnlUsScroll.AutoScroll = $true $pnlUsRight.Controls.Add($pnlUsScroll) # Info do usuario selecionado $pnlUsInfo = New-Object System.Windows.Forms.Panel $pnlUsInfo.Location = New-Object System.Drawing.Point(10,10); $pnlUsInfo.Size = New-Object System.Drawing.Size(470,120) $pnlUsInfo.BackColor = $corPainel $pnlUsScroll.Controls.Add($pnlUsInfo) $barUsInfo = New-Object System.Windows.Forms.Panel $barUsInfo.Location = New-Object System.Drawing.Point(0,0); $barUsInfo.Size = New-Object System.Drawing.Size(4,120); $barUsInfo.BackColor = $corDestaque $pnlUsInfo.Controls.Add($barUsInfo) $lblUsInfoNome = New-Object System.Windows.Forms.Label $lblUsInfoNome.Text = "Selecione um usuario na lista"; $lblUsInfoNome.Font = New-Object System.Drawing.Font("Segoe UI",12,[System.Drawing.FontStyle]::Bold) $lblUsInfoNome.ForeColor = $corTextoClaro; $lblUsInfoNome.Location = New-Object System.Drawing.Point(14,10); $lblUsInfoNome.AutoSize = $true $pnlUsInfo.Controls.Add($lblUsInfoNome) $lblUsInfoDetalhe = New-Object System.Windows.Forms.Label $lblUsInfoDetalhe.Text = ""; $lblUsInfoDetalhe.ForeColor = $corTextoEscuro $lblUsInfoDetalhe.Location = New-Object System.Drawing.Point(14,38); $lblUsInfoDetalhe.Size = New-Object System.Drawing.Size(446,72) $pnlUsInfo.Controls.Add($lblUsInfoDetalhe) $lvUsers.add_SelectedIndexChanged({ if ($lvUsers.SelectedItems.Count -eq 0) { return } $u = $lvUsers.SelectedItems[0].Tag if (-not $u) { return } $lblUsInfoNome.Text = $u.Name $admins = (Get-LocalGroupMember -Group "Administrators" -EA SilentlyContinue).Name | ForEach-Object { ($_ -split "\\")[-1] } $isAdmin = $admins -contains $u.Name $ultimo = if ($u.LastLogon -and $u.LastLogon -gt [datetime]"1/1/2000") { $u.LastLogon.ToString("dd/MM/yyyy HH:mm") } else { "Nunca" } $lblUsInfoDetalhe.Text = "Status: $(if($u.Enabled){'Ativo'}else{'Inativo'}) | Administrador: $(if($isAdmin){'Sim'}else{'Nao'})`nDescricao: $($u.Description)`nUltimo Logon: $ultimo`nSenha expira: $(if($u.PasswordExpires){$u.PasswordExpires.ToString('dd/MM/yyyy')}else{'Nunca'})" $barUsInfo.BackColor = if ($u.Enabled) { $corDestaque } else { $corTextoEscuro } }) # ── Seção: Ações sobre usuario selecionado ─────────────── function Obter-UserSelecionado { if ($lvUsers.SelectedItems.Count -eq 0) { [System.Windows.Forms.MessageBox]::Show("Selecione um usuario na lista.","Atencao","OK","Warning") | Out-Null return $null } return $lvUsers.SelectedItems[0].Tag } function Novo-SecaoUsers { param([string]$titulo, [int]$Y, [System.Drawing.Color]$cor) $lbl = New-Object System.Windows.Forms.Label $lbl.Text = $titulo; $lbl.Font = New-Object System.Drawing.Font("Segoe UI",7,[System.Drawing.FontStyle]::Bold) $lbl.ForeColor = $cor; $lbl.Location = New-Object System.Drawing.Point(10,$Y); $lbl.AutoSize = $true $pnlUsScroll.Controls.Add($lbl) } function Novo-BtnUser { param([string]$txt,[int]$x,[int]$y,[int]$w=145,[System.Drawing.Color]$cor=$corBorda) $b = New-Object System.Windows.Forms.Button $b.Text=$txt;$b.Location=New-Object System.Drawing.Point($x,$y);$b.Size=New-Object System.Drawing.Size($w,34) $b.BackColor=$cor;$b.ForeColor=if($cor -ne $corBorda -and $cor.GetBrightness() -lt 0.5){$corTextoClaro}else{$corTextoClaro} $b.FlatStyle="Flat";$b.FlatAppearance.BorderSize=0 $b.Font=New-Object System.Drawing.Font("Segoe UI",8,[System.Drawing.FontStyle]::Bold) $b.Cursor=[System.Windows.Forms.Cursors]::Hand $pnlUsScroll.Controls.Add($b) return $b } Novo-SecaoUsers -titulo "ACOES DO USUARIO SELECIONADO" -Y 142 -cor $corTextoEscuro # Ativar / Desativar $btnAtivarUs = Novo-BtnUser -txt "Ativar Usuario" -x 10 -y 160 -cor $corVerde $btnAtivarUs.add_Click({ $u = Obter-UserSelecionado; if (-not $u) { return } try { Enable-LocalUser -Name $u.Name; Carregar-Usuarios; Escrever-Log "Usuario '$($u.Name)' ativado!" "OK" } catch { Escrever-Log "Erro: $_" "ERRO" } }) $btnDesativarUs = Novo-BtnUser -txt "Desativar Usuario" -x 162 -y 160 -cor $corAmarelo $btnDesativarUs.ForeColor = $corFundo $btnDesativarUs.add_Click({ $u = Obter-UserSelecionado; if (-not $u) { return } $conf = [System.Windows.Forms.MessageBox]::Show("Desativar o usuario '$($u.Name)'?","Confirmar","YesNo","Warning") if ($conf -ne "Yes") { return } try { Disable-LocalUser -Name $u.Name; Carregar-Usuarios; Escrever-Log "Usuario '$($u.Name)' desativado!" "OK" } catch { Escrever-Log "Erro: $_" "ERRO" } }) $btnRemoverUs = Novo-BtnUser -txt "Remover Usuario" -x 314 -y 160 -cor $corVermelho $btnRemoverUs.add_Click({ $u = Obter-UserSelecionado; if (-not $u) { return } $conf = [System.Windows.Forms.MessageBox]::Show("REMOVER o usuario '$($u.Name)'?`nEssa acao nao pode ser desfeita.","Confirmar","YesNo","Warning") if ($conf -ne "Yes") { return } try { Remove-LocalUser -Name $u.Name; Carregar-Usuarios; Escrever-Log "Usuario '$($u.Name)' removido!" "OK" } catch { Escrever-Log "Erro: $_" "ERRO" } }) # Alterar senha $btnSenhaUs = Novo-BtnUser -txt "Alterar Senha" -x 10 -y 202 -w 220 -cor $corDestaque $btnSenhaUs.add_Click({ $u = Obter-UserSelecionado; if (-not $u) { return } # Mini form de senha $fSenha = New-Object System.Windows.Forms.Form $fSenha.Text="Alterar Senha - $($u.Name)";$fSenha.Size=New-Object System.Drawing.Size(340,160) $fSenha.StartPosition="CenterScreen";$fSenha.BackColor=$corPainel;$fSenha.ForeColor=$corTextoClaro $fSenha.FormBorderStyle="FixedDialog";$fSenha.MaximizeBox=$false $lblNS=New-Object System.Windows.Forms.Label;$lblNS.Text="Nova senha:";$lblNS.Location=New-Object System.Drawing.Point(10,14);$lblNS.AutoSize=$true $txtNS=New-Object System.Windows.Forms.TextBox;$txtNS.Location=New-Object System.Drawing.Point(10,34);$txtNS.Size=New-Object System.Drawing.Size(300,24) $txtNS.BackColor=$corBorda;$txtNS.ForeColor=$corTextoClaro;$txtNS.UseSystemPasswordChar=$true $btnOKS=New-Object System.Windows.Forms.Button;$btnOKS.Text="Alterar";$btnOKS.Location=New-Object System.Drawing.Point(10,68) $btnOKS.Size=New-Object System.Drawing.Size(300,30);$btnOKS.BackColor=$corDestaque;$btnOKS.ForeColor=$corTextoClaro $btnOKS.FlatStyle="Flat";$btnOKS.FlatAppearance.BorderSize=0 $btnOKS.add_Click({ $fSenha.Tag=$txtNS.Text; $fSenha.Close() }) $fSenha.Controls.AddRange(@($lblNS,$txtNS,$btnOKS)); $fSenha.ShowDialog()|Out-Null $novaSenha = $fSenha.Tag if (-not $novaSenha) { return } try { $secSenha = ConvertTo-SecureString $novaSenha -AsPlainText -Force Set-LocalUser -Name $u.Name -Password $secSenha Escrever-Log "Senha de '$($u.Name)' alterada com sucesso!" "OK" [System.Windows.Forms.MessageBox]::Show("Senha alterada com sucesso!","OK","OK","Information")|Out-Null } catch { Escrever-Log "Erro ao alterar senha: $_" "ERRO" } }) # Admin $btnAddAdmin = Novo-BtnUser -txt "Tornar Administrador" -x 10 -y 244 -w 220 -cor $corDestaque $btnAddAdmin.add_Click({ $u = Obter-UserSelecionado; if (-not $u) { return } try { Add-LocalGroupMember -Group "Administrators" -Member $u.Name -EA Stop; Carregar-Usuarios; Escrever-Log "'$($u.Name)' adicionado ao grupo Administrators!" "OK" } catch { Escrever-Log "Erro (ja e admin?): $_" "AVISO" } }) $btnRemAdmin = Novo-BtnUser -txt "Remover de Admin" -x 238 -y 244 -w 220 -cor $corBorda $btnRemAdmin.add_Click({ $u = Obter-UserSelecionado; if (-not $u) { return } $conf=[System.Windows.Forms.MessageBox]::Show("Remover '$($u.Name)' do grupo Administradores?","Confirmar","YesNo","Warning") if ($conf -ne "Yes") { return } try { Remove-LocalGroupMember -Group "Administrators" -Member $u.Name -EA Stop; Carregar-Usuarios; Escrever-Log "'$($u.Name)' removido dos Administrators!" "OK" } catch { Escrever-Log "Erro: $_" "ERRO" } }) Novo-SecaoUsers -titulo "CRIAR NOVO USUARIO" -Y 294 -cor $corTextoEscuro # Form de criação $pnlCriar = New-Object System.Windows.Forms.Panel $pnlCriar.Location=New-Object System.Drawing.Point(10,312);$pnlCriar.Size=New-Object System.Drawing.Size(470,180) $pnlCriar.BackColor=$corPainel $pnlUsScroll.Controls.Add($pnlCriar) $acCriar=New-Object System.Windows.Forms.Panel;$acCriar.Location=New-Object System.Drawing.Point(0,0);$acCriar.Size=New-Object System.Drawing.Size(4,180);$acCriar.BackColor=$corVerde $pnlCriar.Controls.Add($acCriar) function LblCriar { param($txt,$x,$y) $l=New-Object System.Windows.Forms.Label;$l.Text=$txt;$l.Location=New-Object System.Drawing.Point($x,$y);$l.AutoSize=$true;$l.ForeColor=$corTextoEscuro;$l.Font=New-Object System.Drawing.Font("Segoe UI",8);$pnlCriar.Controls.Add($l) } function TxtCriar { param($x,$y,$w=180) $t=New-Object System.Windows.Forms.TextBox;$t.Location=New-Object System.Drawing.Point($x,$y);$t.Size=New-Object System.Drawing.Size($w,22);$t.BackColor=$corBorda;$t.ForeColor=$corTextoClaro;$t.BorderStyle="FixedSingle";$pnlCriar.Controls.Add($t);return $t } LblCriar "Nome de usuario:" 14 10; $txtNovoNome = TxtCriar 14 28 200 LblCriar "Senha:" 14 58; $txtNovaSenha = TxtCriar 14 76 200; $txtNovaSenha.UseSystemPasswordChar=$true LblCriar "Descricao:" 230 10; $txtNovaDesc = TxtCriar 230 28 220 LblCriar "Tipo:" 230 58 $cmbTipoUser = New-Object System.Windows.Forms.ComboBox $cmbTipoUser.Location=New-Object System.Drawing.Point(230,76);$cmbTipoUser.Size=New-Object System.Drawing.Size(220,22) $cmbTipoUser.BackColor=$corBorda;$cmbTipoUser.ForeColor=$corTextoClaro;$cmbTipoUser.FlatStyle="Flat";$cmbTipoUser.DropDownStyle="DropDownList" @("Usuario Padrao","Administrador") | ForEach-Object { $cmbTipoUser.Items.Add($_)|Out-Null } $cmbTipoUser.SelectedIndex=0 $pnlCriar.Controls.Add($cmbTipoUser) $chkSenhaExpira = New-Object System.Windows.Forms.CheckBox $chkSenhaExpira.Text="Senha nao expira";$chkSenhaExpira.Location=New-Object System.Drawing.Point(14,108);$chkSenhaExpira.AutoSize=$true $chkSenhaExpira.ForeColor=$corTextoEscuro;$chkSenhaExpira.BackColor=$corPainel;$chkSenhaExpira.Checked=$true $pnlCriar.Controls.Add($chkSenhaExpira) $btnCriarUs = New-Object System.Windows.Forms.Button $btnCriarUs.Text="Criar Usuario";$btnCriarUs.Location=New-Object System.Drawing.Point(14,136);$btnCriarUs.Size=New-Object System.Drawing.Size(436,34) $btnCriarUs.BackColor=$corVerde;$btnCriarUs.ForeColor=$corFundo;$btnCriarUs.FlatStyle="Flat";$btnCriarUs.FlatAppearance.BorderSize=0 $btnCriarUs.Font=New-Object System.Drawing.Font("Segoe UI",10,[System.Drawing.FontStyle]::Bold) $btnCriarUs.Cursor=[System.Windows.Forms.Cursors]::Hand $pnlCriar.Controls.Add($btnCriarUs) $btnCriarUs.add_Click({ $nome = $txtNovoNome.Text.Trim() $senha = $txtNovaSenha.Text if (-not $nome) { [System.Windows.Forms.MessageBox]::Show("Informe o nome do usuario.","Atencao","OK","Warning")|Out-Null; return } try { $params = @{ Name=$nome; Description=$txtNovaDesc.Text } if ($senha) { $params.Password = ConvertTo-SecureString $senha -AsPlainText -Force } else { $params.NoPassword = $true } if ($chkSenhaExpira.Checked) { $params.PasswordNeverExpires = $true } New-LocalUser @params -EA Stop | Out-Null if ($cmbTipoUser.SelectedItem -eq "Administrador") { Add-LocalGroupMember -Group "Administrators" -Member $nome } Carregar-Usuarios $txtNovoNome.Clear(); $txtNovaSenha.Clear(); $txtNovaDesc.Clear() Escrever-Log "Usuario '$nome' criado com sucesso!" "OK" [System.Windows.Forms.MessageBox]::Show("Usuario '$nome' criado com sucesso!","OK","OK","Information")|Out-Null } catch { Escrever-Log "Erro ao criar usuario: $_" "ERRO"; [System.Windows.Forms.MessageBox]::Show("Erro: $_","Erro","OK","Error")|Out-Null } }) # ═══════════════════════════════════════════════════════════ $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)