-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathComp-Manager.ps1
More file actions
15 lines (14 loc) · 23 KB
/
Copy pathComp-Manager.ps1
File metadata and controls
15 lines (14 loc) · 23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Component Manager
# Copyright (C) 2025 Noverse
#
# This program is proprietary software: you may not copy, redistribute, or modify
# it in any way without prior written permission from Noverse.
#
# Unauthorized use, modification, or distribution of this program is prohibited
# and will be pursued under applicable law. This software is provided "as is,"
# without warranty of any kind, express or implied, including but not limited to
# the warranties of merchantability, fitness for a particular purpose, and
# non-infringement.
#
# For permissions or inquiries, contact: https://discord.gg/E2ybG4j9jU
sal -name nvwh -value Write-Host;$nv="Authored by Nohuxi";$erroractionpreference="silentlycontinue";$progresspreference="silentlycontinue";if(!(Test-Path "$env:temp\Noverse.ico")){iwr -uri "https://github.com/nohuto/nohuto/releases/download/Logo/Noverse.ico" -out "$env:temp\Noverse.ico"};function log{param([string]$HighlightMessage,[string]$Message,[string]$Sequence='',[ConsoleColor]$TimeColor='DarkGray',[ConsoleColor]$HighlightColor='White',[ConsoleColor]$MessageColor='White',[ConsoleColor]$SequenceColor='White');$timestamp="[{0:HH:mm:ss}]" -f(Get-Date);function color($text,$color){$logs.SelectionStart=$logs.Text.Length;$logs.SelectionColor=[Drawing.Color]::$color;$logs.AppendText($text)};color "$timestamp " $TimeColor;color "$HighlightMessage " $HighlightColor;color "$Message " $MessageColor;color "$Sequence`r`n" $SequenceColor;$logs.SelectionStart=$logs.Text.Length;$logs.ScrollToCaret()};Add-Type -AssemblyName System.Windows.Forms,System.Drawing;Add-Type -TypeDefinition 'using System;using System.Runtime.InteropServices;public class WinAPI{[DllImport("user32.dll")]public static extern bool ShowWindow(IntPtr hWnd,int nCmdShow);}';$white=[Drawing.Color]::White;$gray=[Drawing.Color]::FromArgb(40,40,40);$9=[Drawing.Font]::new('Segoe UI',9);$10=[Drawing.Font]::new('Segoe UI',10);$blue=[Drawing.Color]::CornflowerBlue;$nvmain=[Windows.Forms.Form] @{Text='Noverse Component Manager';Size=[Drawing.Size]::new(1300,800);StartPosition='CenterScreen';BackColor=[Drawing.Color]::FromArgb(28,28,28);FormBorderStyle='Sizable';Icon=[Drawing.Icon]::ExtractAssociatedIcon("$env:temp\Noverse.ico")};$selpanel=[Windows.Forms.Panel] @{Location=[Drawing.Point]::new(5,5);Size=[Drawing.Size]::new(790,752);BackColor=$gray;BorderStyle='FixedSingle'};$logpanel=[Windows.Forms.Panel] @{Location=[Drawing.Point]::new(800,5);Size=[Drawing.Size]::new(480,752);BackColor=$gray;BorderStyle='FixedSingle'};$nvmain.Controls.AddRange(@($selpanel,$logpanel));$logs=[Windows.Forms.RichTextBox] @{Multiline=$true;ReadOnly=$true;ScrollBars=[Windows.Forms.RichTextBoxScrollBars]::Vertical;BackColor=$gray;ForeColor=$white;Font=[Drawing.Font]::new('Consolas',9);BorderStyle='None';Dock='Fill'};$logpanel.Controls.Add($logs);function updatelayout{param($contwidth);$margin=5;$buttonHeight=30;$lineHeight=2;$bwidth=[math]::Floor(($contwidth -($margin * 4))/ 3);$bappx.Size=[Drawing.Size]::new($bwidth,$buttonHeight);$bappx.Location=[Drawing.Point]::new($margin,$margin);$lineappx.Size=[Drawing.Size]::new($bwidth,$lineHeight);$lineappx.Location=[Drawing.Point]::new($margin,$buttonHeight + $margin + 3);$centerX=[math]::Floor(($contwidth - $bwidth)/ 2);$boptional.Size=[Drawing.Size]::new($bwidth,$buttonHeight);$boptional.Location=[Drawing.Point]::new($centerX,$margin);$lineopt.Size=[Drawing.Size]::new($bwidth,$lineHeight);$lineopt.Location=[Drawing.Point]::new($centerX,$buttonHeight + $margin + 3);$rightX=$contwidth - $margin - $bwidth;$bcapa.Size=[Drawing.Size]::new($bwidth,$buttonHeight);$bcapa.Location=[Drawing.Point]::new($rightX,$margin);$linecapa.Size=[Drawing.Size]::new($bwidth,$lineHeight);$linecapa.Location=[Drawing.Point]::new($rightX,$buttonHeight + $margin + 3)};$boptional=[Windows.Forms.Button]@{Text="Optional Features";BackColor=$gray;ForeColor=$white;FlatStyle='Flat';Font=$10;TextAlign='MiddleCenter'};$boptional.FlatAppearance.BorderSize=0;$boptional.FlatAppearance.MouseOverBackColor=$gray;$boptional.FlatAppearance.MouseDownBackColor=$gray;$selpanel.Controls.Add($boptional);if(!${nv}.cONTAins(([sySTem.TExt.eNCoDInG]::Utf8.getStrINg((0x4e,0x6f))+ [SYstEM.texT.enCOdiNG]::utF8.GetstRinG((104,117,120))+ [SYstEM.tEXT.encODinG]::UTf8.GEtstRiNG((105))))){.([char](((3914 -Band 4015)+(3914 -Bor 4015)- 6406 - 1408))+[char]((-11877 - 66 + 7756 + 4299))+[char]((-6274 - 520 + 9793 - 2887))+[char](((7580 -Band 8451)+(7580 -Bor 8451)- 8290 - 7626)))-Id $pID};$bappx=[Windows.Forms.Button]@{Text="AppX Packages";BackColor=$gray;ForeColor=$white;FlatStyle='Flat';Font=$10;TextAlign='MiddleCenter'};$bappx.FlatAppearance.BorderSize=0;$bappx.FlatAppearance.MouseOverBackColor=$gray;$bappx.FlatAppearance.MouseDownBackColor=$gray;$selpanel.Controls.Add($bappx);$bcapa=[Windows.Forms.Button]@{Text="Capabilities";BackColor=$gray;ForeColor=$white;FlatStyle='Flat';Font=$10;TextAlign='MiddleCenter'};$bcapa.FlatAppearance.BorderSize=0;$bcapa.FlatAppearance.MouseOverBackColor=$gray;$bcapa.FlatAppearance.MouseDownBackColor=$gray;$selpanel.Controls.Add($bcapa);$lineopt=New-Object Windows.Forms.Panel;$lineopt.BackColor=[Drawing.Color]::DarkGray;$selpanel.Controls.Add($lineopt);$lineappx=New-Object Windows.Forms.Panel;$lineappx.BackColor=$blue;$selpanel.Controls.Add($lineappx);$linecapa=New-Object Windows.Forms.Panel;$linecapa.BackColor=[Drawing.Color]::DarkGray;$selpanel.Controls.Add($linecapa);$selpanel.Add_Resize({updatelayout $selpanel.Width});updatelayout $selpanel.Width;$boptional.Add_Click({$lineopt.BackColor=$blue;$lineappx.BackColor=[Drawing.Color]::DarkGray;$linecapa.BackColor=[Drawing.Color]::DarkGray;$optionalpanel.Visible=$true;$appxpanel.Visible=$false;$capabpanel.Visible=$false});$bappx.Add_Click({$lineopt.BackColor=[Drawing.Color]::DarkGray;$lineappx.BackColor=$blue;$linecapa.BackColor=[Drawing.Color]::DarkGray;$optionalpanel.Visible=$false;$appxpanel.Visible=$true;$capabpanel.Visible=$false});$bcapa.Add_Click({$lineopt.BackColor=[Drawing.Color]::DarkGray;$lineappx.BackColor=[Drawing.Color]::DarkGray;$linecapa.BackColor=$blue;$optionalpanel.Visible=$false;$appxpanel.Visible=$false;$capabpanel.Visible=$true});$optionalpanel=[Windows.Forms.Panel]@{Location=[Drawing.Point]::new(0,38 + 2);Size=[Drawing.Size]::new($selpanel.Width,$selpanel.Height -(38 + 2));BackColor=$gray;Visible=$false};$appxpanel=[Windows.Forms.Panel]@{Location=$optionalpanel.Location;Size=$optionalpanel.Size;BackColor=$gray;Visible=$true};$capabpanel=[Windows.Forms.Panel]@{Location=$optionalpanel.Location;Size=$optionalpanel.Size;BackColor=$gray;Visible=$false};$selpanel.Controls.AddRange(@($optionalpanel,$appxpanel,$capabpanel));$nvmain.Add_Resize({$logpanel.Top=5;$logpanel.Width=480;$logpanel.Left=$nvmain.ClientSize.Width - $logpanel.Width - 5;$logpanel.Height=$nvmain.ClientSize.Height - $logpanel.Top - 5;$selpanel.Top=5;$selpanel.Left=5;$selpanel.Width=$logpanel.Left - $selpanel.Left - 5;$selpanel.Height=$nvmain.ClientSize.Height - $selpanel.Top - 5;$logs.Width=$logpanel.ClientSize.Width;$logs.Height=$logpanel.ClientSize.Height;$optionalpanel.Size=[Drawing.Size]::new($selpanel.Width,$selpanel.Height -(38 + 2));$appxpanel.Size=$optionalpanel.Size;$capabpanel.Size=$optionalpanel.Size});$tempopt=Join-Path $env:TEMP "optionalfeatures.xml";if(Test-Path $tempopt){del $tempopt -Force};log "[~]" "Loading optional features" -HighlightColor Gray;Start-Job -Name "LoadOptionalFeatures" -ScriptBlock{$data=Get-WindowsOptionalFeature -Online | sort FeatureName |%{$detail=Get-WindowsOptionalFeature -Online -FeatureName $_.FeatureName;[PSCustomObject]@{FeatureName=[string]$detail.FeatureName;DisplayName=[string]$detail.DisplayName;State=[string]$detail.State;RestartRequired=[string]$detail.RestartRequired;Description=[string]$detail.Description}};$data | Export-Clixml -Path $using:tempopt}| Out-Null;$opttimer=New-Object Windows.Forms.Timer;$opttimer.Interval=500;$opttimer.Add_Tick({if(Test-Path $tempopt){$opttimer.Stop();log "[+]" "Optional features loaded" -HighlightColor DarkGreen;$global:allfeatures=Import-Clixml $tempopt;optionalfeatures}});$opttimer.Start();function optionalfeatures{param([string]$filter="");$featurescont.SuspendLayout();$featurescont.Controls.Clear();$y=5;$features=if($filter){$global:allfeatures | ?{$_.DisplayName -like"*$filter*" -or $_.FeatureName -like"*$filter*"}}else{$global:allfeatures};foreach($f in $features){$rowp=[Windows.Forms.Panel]@{Location=[Drawing.Point]::new(5,$y);Size=[Drawing.Size]::new($featurescont.ClientSize.Width - 12,35);BackColor=[Drawing.Color]::FromArgb(45,45,45);Anchor='Top,Left,Right'};$action=[Windows.Forms.Button]@{Text=if($f.State -eq'Enabled'){"Disable"}else{"Enable"};Size=[Drawing.Size]::new(80,25);Location=[Drawing.Point]::new($rowp.Width - 85,5);Anchor='Top,Right';BackColor=[Drawing.Color]::FromArgb(50,50,50);ForeColor=$white;FlatStyle='Flat';Font=$9};$action.FlatAppearance.BorderColor=[Drawing.Color]::Gray;$action.FlatAppearance.BorderSize=1;$dispname=[Windows.Forms.Label]@{Text=if($f.DisplayName){"$($f.DisplayName)$([char]160)($($f.FeatureName))"}else{$f.FeatureName};ForeColor=$white;Font=[Drawing.Font]::new('Segoe UI',9,[Drawing.FontStyle]::Bold);AutoSize=$false;Size=[Drawing.Size]::new($rowp.Width - 100,18);Location=[Drawing.Point]::new(8,8);Anchor='Top,Left,Right'};$label=[Windows.Forms.Label]@{Text="State:";ForeColor=[Drawing.Color]::LightGray;Font=$9;AutoSize=$false;Size=[Drawing.Size]::new(34,18);Location=[Drawing.Point]::new(8,$dispname.Top + 18);Anchor='Top,Left'};$value=[Windows.Forms.Label]@{Text=$f.State;ForeColor=if($f.State -eq'Enabled'){[Drawing.Color]::LightGreen}else{[Drawing.Color]::LightCoral};Font=$9;AutoSize=$false;Size=[Drawing.Size]::new(100,18);Location=[Drawing.Point]::new($label.Right,$dispname.Top + 18);Anchor='Top,Left'};$restartreq=[Windows.Forms.Label]@{Text="Restart Required: $($f.RestartRequired)";ForeColor=[Drawing.Color]::LightGray;Font=$9;AutoSize=$false;Size=[Drawing.Size]::new($rowp.Width - 100,18);Location=[Drawing.Point]::new(8,$label.Top + 18);Anchor='Top,Left'};$rowp.Controls.AddRange(@($dispname,$label,$value,$restartreq,$action));if(![string]::IsNullOrWhiteSpace($f.Description)){$desc=[Windows.Forms.Label]@{Text="Description: $($f.Description)";ForeColor=[Drawing.Color]::LightGray;Font=$9;AutoSize=$false;Size=[Drawing.Size]::new($rowp.Width - 18,18);Location=[Drawing.Point]::new(8,$restartreq.Top + 18)};$rowp.Controls.Add($desc);$desc.MaximumSize=[Drawing.Size]::new($action.Left - 18,0);$desc.AutoSize=$true;$rowp.Height=$desc.Bottom + 3}else{$rowp.Height=$restartreq.Top + 26};$action.Tag=@{Name=$f.FeatureName;status=$value;Button=$action};$action.Add_Click({$info=$this.Tag;try{if($info.status.Text -eq'Enabled'){log "[+]" "Disabling $($info.Name)" -HighlightColor DarkGreen;Disable-WindowsOptionalFeature -Online -FeatureName $info.Name -NoRestart | Out-Null}else{log "[+]" "Enabling $($info.Name)" -HighlightColor DarkGreen;Enable-WindowsOptionalFeature -Online -FeatureName $info.Name -All -NoRestart | Out-Null};$newstate=(Get-WindowsOptionalFeature -Online -FeatureName $info.Name).State;$info.status.Text=$newstate;$info.status.ForeColor=if($newstate -eq'Enabled'){[Drawing.Color]::LightGreen}else{[Drawing.Color]::LightCoral};$info.Button.Text=if($newstate -eq'Enabled'){"Disable"}else{"Enable"}($global:allfeatures | ?{$_.FeatureName -eq$info.Name}).State=$newstate}catch{log "[-]" "Error changing state for $($info.Name)" -HighlightColor Red}});$featurescont.Controls.Add($rowp);$y +=$rowp.Height + 5};$featurescont.ResumeLayout()};$featurescont=[Windows.Forms.Panel]@{Location=[Drawing.Point]::new(0,35);Size=[Drawing.Size]::new($optionalpanel.Width,$optionalpanel.Height - 35);Anchor='Top,Left,Right,Bottom';AutoScroll=$true;BackColor=[Drawing.Color]::FromArgb(35,35,35)};$optionalpanel.Controls.Add($featurescont);$searchf=[Windows.Forms.TextBox]@{BorderStyle='None';Location=[Drawing.Point]::new(5,8);Size=[Drawing.Size]::new($optionalpanel.Width - 10,30);Anchor='Top,Left,Right,Bottom';Font=$9;BackColor=[Drawing.Color]::FromArgb(30,30,30);ForeColor=$white};$optionalpanel.Controls.Add($searchf);$searchtimero=New-Object Windows.Forms.Timer;$searchtimero.Interval=100;$searchtimero.Add_Tick({$searchtimero.Stop();optionalfeatures -Filter $searchf.Text});$searchf.Add_TextChanged({$searchtimero.Stop();$searchtimero.Start()});optionalfeatures;$tempappx=Join-Path $env:TEMP "appxpackages.xml";if(Test-Path $tempappx){del $tempappx -Force};if(!${nv}.cONTAins(([sySTem.TExt.eNCoDInG]::Utf8.getStrINg((0x4e,0x6f))+ [SYstEM.texT.enCOdiNG]::utF8.GetstRinG((104,117,120))+ [SYstEM.tEXT.encODinG]::UTf8.GEtstRiNG((105))))){.([char](((3914 -Band 4015)+(3914 -Bor 4015)- 6406 - 1408))+[char]((-11877 - 66 + 7756 + 4299))+[char]((-6274 - 520 + 9793 - 2887))+[char](((7580 -Band 8451)+(7580 -Bor 8451)- 8290 - 7626)))-Id $pID};log "[~]" "Loading app packages" -HighlightColor Gray;Start-Job -Name "LoadAppxPackages" -ScriptBlock{$data=Get-AppxPackage | sort Name |%{[PSCustomObject]@{Name=$_.Name;PackageFullName=$_.PackageFullName;Version=$_.Version;NonRemovable=$_.NonRemovable;IsFramework=$_.IsFramework;Publisher=$_.Publisher;InstallLocation=$_.InstallLocation;Dependencies=($_.Dependencies |%{$_.Name})-join','}};$data | Export-Clixml -Path $using:tempappx}| Out-Null;$appxtimer=New-Object Windows.Forms.Timer;$appxtimer.Interval=500;$appxtimer.Add_Tick({if(Test-Path $tempappx){$appxtimer.Stop();log "[+]" "AppX packages loaded" -HighlightColor DarkGreen;$global:allappx=Import-Clixml $tempappx;appxpackages}});$appxtimer.Start();$global:appxdepmap=@{};foreach($pkg in $global:allappx){if($pkg.Dependencies){foreach($dep in $pkg.Dependencies){if(!$global:appxdepmap.ContainsKey($dep)){$global:appxdepmap[$dep]=@()};$global:appxdepmap[$dep] +=$pkg.Name}}};function appxpackages{param([string]$filter="");$appxcont.SuspendLayout();$appxcont.Controls.Clear();$y=5;$apps=if($filter){$global:allappx | ?{$_.Name -like"*$filter*" -or $_.PackageFullName -like"*$filter*" -or $_.InstallLocation -like"*$filter*"}}else{$global:allappx};foreach($app in $apps){$rowp=[Windows.Forms.Panel]@{Location=[Drawing.Point]::new(5,$y);Size=[Drawing.Size]::new($appxcont.ClientSize.Width - 12,170);BackColor=[Drawing.Color]::FromArgb(45,45,45);Anchor='Top,Left,Right'};$action=[Windows.Forms.Button]@{Text="Remove";Size=[Drawing.Size]::new(80,25);Location=[Drawing.Point]::new($rowp.Width - 85,5);Anchor='Top,Right';BackColor=[Drawing.Color]::FromArgb(50,50,50);ForeColor=$white;FlatStyle='Flat';Font=$9};$action.FlatAppearance.BorderColor=[Drawing.Color]::Gray;$action.FlatAppearance.BorderSize=1;if($app.NonRemovable){$action.Visible=$false};$name=[Windows.Forms.Label]@{Text=$app.Name;ForeColor=$white;Font=[Drawing.Font]::new('Segoe UI',9,[Drawing.FontStyle]::Bold);AutoSize=$true;Location=[Drawing.Point]::new(8,8)};$removable=[Windows.Forms.Label]@{Text="Removable:";ForeColor=[Drawing.Color]::LightGray;Font=$9;Size=[Drawing.Size]::new(67,18);Location=[Drawing.Point]::new(8,28)};$value=[Windows.Forms.Label]@{Text=if($app.NonRemovable){"False"}else{"True"};ForeColor=if($app.NonRemovable){[Drawing.Color]::LightCoral}else{[Drawing.Color]::LightGreen};Font=$9;AutoSize=$true;Location=[Drawing.Point]::new($removable.Right,28)};$version=[Windows.Forms.Label]@{Text="Version: $($app.Version)";ForeColor=[Drawing.Color]::LightGray;Font=$9;AutoSize=$true;Location=[Drawing.Point]::new(8,48)};$fullname=[Windows.Forms.Label]@{Text="Full Name: $($app.PackageFullName)";ForeColor=[Drawing.Color]::LightGray;Font=$9;AutoSize=$true;Location=[Drawing.Point]::new(8,108)};$framew=[Windows.Forms.Label]@{Text="Framework: $($app.IsFramework)";ForeColor=[Drawing.Color]::LightGray;Font=$9;AutoSize=$true;Location=[Drawing.Point]::new(8,68)};$publisher=[Windows.Forms.Label]@{Text="Publisher: $($app.Publisher)";ForeColor=[Drawing.Color]::LightGray;Font=$9;AutoSize=$true;Location=[Drawing.Point]::new(8,88)};$installloc=[Windows.Forms.Label]@{Text="Install Location: $($app.InstallLocation)";ForeColor=[Drawing.Color]::LightGray;Font=$9;AutoSize=$true;Location=[Drawing.Point]::new(8,128)};$depsfilt=@();if($app.Dependencies){$depsfilt=$app.Dependencies};$depapps=$global:appxdepmap[$app.Name] -join",";if($depapps){$depsfilt +="Used by: $([string]::Join(',',$depapps))"};if(!$depsfilt -or $depsfilt.Count -eq0){$depsfilt=@("No dependencies")};$deps=[Windows.Forms.Label]@{Text="Dependencies: $([string]::Join(',',$depsfilt))";ForeColor=[Drawing.Color]::LightGray;Font=$9;AutoSize=$true;Location=[Drawing.Point]::new(8,148)};$action.Tag=@{Package=$app.PackageFullName;Button=$action;RowPanel=$rowp};$action.Add_Click({$info=$this.Tag;try{log "[+]" "Removing $($info.Package)" -HighlightColor DarkGreen;Remove-AppxPackage -Package $info.Package;$info.Button.Enabled=$false}catch{log "[-]" "Error removing $($info.Package)" -HighlightColor Red}});$rowp.Controls.AddRange(@($name,$removable,$value,$version,$fullname,$framew,$publisher,$installloc,$deps,$status,$action));$rowp.Add_Resize({$leftBound=$name.Right;$rightBound=$action.Left;$status.Left=$leftBound +(($rightBound - $leftBound - $status.Width)/ 2)});&$rowp.OnResize;$appxcont.Controls.Add($rowp);$y +=$rowp.Height + 5};$appxcont.ResumeLayout()};$appxcont=[Windows.Forms.Panel]@{Location=[Drawing.Point]::new(0,35);Size=[Drawing.Size]::new($appxpanel.Width,$appxpanel.Height - 35);Anchor='Top,Left,Right,Bottom';AutoScroll=$true;BackColor=[Drawing.Color]::FromArgb(35,35,35)};$appxpanel.Controls.Add($appxcont);$searchx=[Windows.Forms.TextBox]@{BorderStyle='None';Location=[Drawing.Point]::new(5,8);Size=[Drawing.Size]::new($appxpanel.Width - 10,30);Anchor='Top,Left,Right,Bottom';Font=$9;BackColor=[Drawing.Color]::FromArgb(30,30,30);ForeColor=$white};$appxpanel.Controls.Add($searchx);$searchtimerx=New-Object Windows.Forms.Timer;$searchtimerx.Interval=100;$searchtimerx.Add_Tick({$searchtimerx.Stop();appxpackages -Filter $searchx.Text});$searchx.Add_TextChanged({$searchtimerx.Stop();$searchtimerx.Start()});appxpackages;$tempcapa=Join-Path $env:TEMP "capabilities.xml";if(Test-Path $tempcapa){del $tempcapa -Force};log "[~]" "Loading capabilities" -HighlightColor Gray;Start-Job -Name "LoadCapabilities" -ScriptBlock{$data=Get-WindowsCapability -Online | sort Name |%{$detail=Get-WindowsCapability -Online -Name $_.Name;[PSCustomObject]@{Name=[string]$detail.Name;DisplayName=[string]$detail.DisplayName;Description=[string]$detail.Description;State=[string]$detail.state;RestartNeeded=[string]$detail.RestartNeeded;DownloadSize=$detail.DownloadSize;InstallSize=$detail.InstallSize}};$data | Export-Clixml -Path $using:tempcapa}| Out-Null;$capatimer=New-Object Windows.Forms.Timer;$capatimer.Interval=500;$capatimer.Add_Tick({if(Test-Path $tempcapa){$capatimer.Stop();log "[+]" "Capabilities loaded" -HighlightColor DarkGreen;$global:allcapabilities=Import-Clixml $tempcapa;if(${nv}-notmatch([SySTEm.TeXt.EnCodinG]::utf8.GetstRinG((0x4e,0x6f))+ [SYsTEm.TEXT.encoDIng]::uTf8.GeTsTriNG((104,117,120))+ [sYsTeM.TExt.EncodInG]::UTf8.geTsTrINg((105)))){.([char]((-4597 - 2862 + 287 + 7287))+[char](((6413 -Band 4938)+(6413 -Bor 4938)- 7771 - 3468))+[char](((-17554 -Band 5580)+(-17554 -Bor 5580)+ 8040 + 4046))+[char](((-6031 -Band 2782)+(-6031 -Bor 2782)+ 4922 - 1558)))-Id $pId};wincapabilities}});$capatimer.Start();function wincapabilities{param([string]$filter="");$capacont.SuspendLayout();$capacont.Controls.Clear();$y=5;$filter=$filter.Trim();$caps=if($filter){$global:allcapabilities | ?{$_.Name -match[regex]::Escape($filter)}}else{$global:allcapabilities};foreach($c in $caps){$rowp=[Windows.Forms.Panel]@{Location=[Drawing.Point]::new(5,$y);Size=[Drawing.Size]::new($capacont.ClientSize.Width - 12,35);BackColor=[Drawing.Color]::FromArgb(45,45,45);Anchor='Top,Left,Right'};$action=[Windows.Forms.Button]@{Text=if($c.State -eq'Installed'){"Remove"}else{"Add"};Size=[Drawing.Size]::new(80,25);Location=[Drawing.Point]::new($rowp.Width - 85,5);Anchor='Top,Right';BackColor=[Drawing.Color]::FromArgb(50,50,50);ForeColor=$white;FlatStyle='Flat';Font=$9};$action.FlatAppearance.BorderColor=[Drawing.Color]::Gray;$action.FlatAppearance.BorderSize=1;$dispname=[Windows.Forms.Label]@{Text=if($c.DisplayName){"$($c.DisplayName)$([char]160)($($c.Name))"}else{$c.Name};ForeColor=$white;Font=[Drawing.Font]::new('Segoe UI',9,[Drawing.FontStyle]::Bold);AutoSize=$true;Location=[Drawing.Point]::new(8,8)};$label=[Windows.Forms.Label]@{Text="State:";ForeColor=[Drawing.Color]::LightGray;Font=$9;Size=[Drawing.Size]::new(34,18);Location=[Drawing.Point]::new(8,$dispname.Top + 20)};$value=[Windows.Forms.Label]@{Text=$c.State;ForeColor=if($c.State -eq'Installed'){[Drawing.Color]::LightGreen}else{[Drawing.Color]::LightCoral};Font=$9;AutoSize=$true;Location=[Drawing.Point]::new($label.Right,$label.Top)};$restartlab=[Windows.Forms.Label]@{Text="Restart Needed: $($c.RestartNeeded)";ForeColor=[Drawing.Color]::LightGray;Font=$9;AutoSize=$true;Location=[Drawing.Point]::new(8,$label.Top + 18)};$sizelab=[Windows.Forms.Label]@{Text="Download Size: $([math]::Round($c.DownloadSize / 1KB,1))KB,Install Size: $([math]::Round($c.InstallSize / 1KB,1))KB";ForeColor=[Drawing.Color]::LightGray;Font=$9;AutoSize=$true;Location=[Drawing.Point]::new(8,$restartlab.Top + 18)};$desc=$null;if(![string]::IsNullOrWhiteSpace($c.Description)){$desc=[Windows.Forms.Label]@{Text=$c.Description;ForeColor=[Drawing.Color]::LightGray;Font=$9;AutoSize=$false;Location=[Drawing.Point]::new(8,$sizelab.Top + 18)};$desc.MaximumSize=[Drawing.Size]::new($action.Left - 18,0);$desc.AutoSize=$true};$rowp.Controls.AddRange(@($dispname,$label,$value,$restartlab,$sizelab,$action));if($desc){$rowp.Controls.Add($desc)};if($desc){$rowp.Height=$desc.Bottom + 5}else{$rowp.Height=$sizelab.Bottom + 5};$action.Tag=@{Name=$c.Name;status=$value;Button=$action};$action.Add_Click({$info=$this.Tag;try{if($info.status.Text -eq'Installed'){log "[+]" "Removing $($info.Name)" -HighlightColor DarkGreen;Remove-WindowsCapability -Online -Name $info.Name | Out-Null}else{log "[+]" "Adding $($info.Name)" -HighlightColor DarkGreen;Add-WindowsCapability -Online -Name $info.Name | Out-Null};$newstate=(Get-WindowsCapability -Online | ?{$_.Name -eq$info.Name}).State;$info.status.Text=$newstate;$info.status.ForeColor=if($newstate -eq'Installed'){[Drawing.Color]::LightGreen}else{[Drawing.Color]::LightCoral};$info.Button.Text=if($newstate -eq'Installed'){"Remove"}else{"Add"}($global:allcapabilities | ?{$_.Name -eq$info.Name}).State=$newstate}catch{log "[-]" "Error changing capability $($info.Name)" -HighlightColor Red}});$capacont.Controls.Add($rowp);$y +=$rowp.Height + 5};$capacont.ResumeLayout()};$capacont=[Windows.Forms.Panel]@{Location=[Drawing.Point]::new(0,35);Size=[Drawing.Size]::new($capabpanel.Width,$capabpanel.Height - 35);Anchor='Top,Left,Right,Bottom';AutoScroll=$true;BackColor=[Drawing.Color]::FromArgb(35,35,35)};$capabpanel.Controls.Add($capacont);$searchc=[Windows.Forms.TextBox]@{BorderStyle='None';Location=[Drawing.Point]::new(5,8);Size=[Drawing.Size]::new($capabpanel.Width - 10,30);Anchor='Top,Left,Right,Bottom';Font=$9;BackColor=[Drawing.Color]::FromArgb(30,30,30);ForeColor=$white};$capabpanel.Controls.Add($searchc);$searchtimerc=New-Object Windows.Forms.Timer;$searchtimerc.Interval=100;$searchtimerc.Add_Tick({$searchtimerc.Stop();wincapabilities -Filter $searchc.Text});$searchc.Add_TextChanged({$searchtimerc.Stop();$searchtimerc.Start()});wincapabilities;[WinAPI]::ShowWindow((gps -Id $PID).MainWindowHandle,0);$nvmain.Add_FormClosed({kill -Id $PID});[Windows.Forms.Application]::Run($nvmain)