2023 09 23 test (#1117)

* move restore point to runspace (#1056)

* Add Guilded into Communication Tab (#1059)

* Add Guilded into Communication Tab

* Remove Choco Package due to there is no Chocolatey packages

* : Add ZeroTier One to utilities menu (#1061)

* Update applications.json (#1063)

Update to add [SuperF4 - Stefan Sundin](https://stefansundin.github.io/superf4/), as mentioned in #374 [Choco - SuperF4](https://community.chocolatey.org/packages/superf4) maintained by Xav83. [WinGet - SuperF4](https://winstall.app/apps/StefanSundin.Superf4) SuperF4 and Winget package published by Stefan Sundin.

* Update inputXML.xaml (#1062)

Updated inputXML.xaml to account for addition of the SuperF4 software.

* Added AIMP music player (#1064)

* Add Ventoy (Chocolatey Only Package) & .NET Core Runtime (Winget & Chocolatey)  (#1066)

* Tidy up SuperF4 line.

* Tidy up SuperF4 line.

Used spaces instead of tabs.

* Add dotnet 7.0.11 Desktop Runtime

* Undone changes to SuperF4 line

* Addition of Ventoy (chocolatey only) package

* Comment Spacing, Indentation, and Capitalization (#1084)

* Comment Spacing, Indentation, and Capitalization

* Comment Grammar and Spacing

Makes grammar in comments better and more consistent
Adds space before comment and centers word in `Write-Host` commands

* More Grammar and Formatting

* Add some comments

* Populate PlaceHolder comments in functions

Files I found that has issues:
Get-WinUtilRegistry.ps1
Install-WinUtilWinget.ps1
Invoke-WinUtilDarkMode.ps1
Remove-WinUtilAPPX.ps1
Test-WinUtilPackageManager.ps1
Update-WinUtilProgramWinget.ps1

Invoke-WPFUpdatessecurity.ps1

* Tweak a few more comments

* Tweak another write-host statement

* Undo Catch statement adjustment

It's outside of the scope of this pull request

* Trim Trailing Whitespace (#1085)

* Trim Trailing Whitespace

* Revert "Trim Trailing Whitespace"

This reverts commit 0ce32aa2c2.

* Trim Trailing Whitespace, take 2

* Bug Fixes

- Edge Removal pullback to local
- Formatting fixes

* testing refactor to ps1

* Update winget-install to 3.0.1 (#1086)

* Update tweaks.json (#1087)

Capitalized first letter of "path" --> "Path" keys

* Update edgeremoval.ps1

* Update edgeremoval.ps1

* Update edgeremoval.ps1

add error handling

* Update functions.Tests.ps1

* fix catch error

* add MSI Afterburner (#1097)

* Add GitHub stats

* Remove Application Experience

* Thorium addition

* remove sample submission

* testing

* Ultimate Performance

* Home GPEDIT

* Fix Winget Install on New System

---------

Co-authored-by: DeveloperDurp <developerdurp@durp.info>
Co-authored-by: Justawildwolf <62820836+blusewill@users.noreply.github.com>
Co-authored-by: Tim Stone <github@tsdev.au>
Co-authored-by: Will Barnard <5012445+mrwillbarnz@users.noreply.github.com>
Co-authored-by: Ian Bassi <ian.bassi@outlook.com>
Co-authored-by: Carter <60557606+Carterpersall@users.noreply.github.com>
Co-authored-by: Yorai Levi <yorai.email@gmail.com>
Co-authored-by: Saikrishnan K <53394202+K-Saikrishnan@users.noreply.github.com>
This commit is contained in:
Chris Titus 2023-10-19 17:12:55 -05:00 committed by GitHub
parent 051b770661
commit d0bde83333
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
66 changed files with 2041 additions and 921 deletions

View File

@ -23,13 +23,13 @@ Get-ChildItem .\functions -Recurse -File | ForEach-Object {
Get-ChildItem .\xaml | ForEach-Object { Get-ChildItem .\xaml | ForEach-Object {
$xaml = (Get-Content $psitem.FullName).replace("'","''") $xaml = (Get-Content $psitem.FullName).replace("'","''")
Write-output "`$$($psitem.BaseName) = '$xaml'" | Out-File ./$scriptname -Append -Encoding ascii Write-output "`$$($psitem.BaseName) = '$xaml'" | Out-File ./$scriptname -Append -Encoding ascii
} }
Get-ChildItem .\config | Where-Object {$psitem.extension -eq ".json"} | ForEach-Object { Get-ChildItem .\config | Where-Object {$psitem.extension -eq ".json"} | ForEach-Object {
$json = (Get-Content $psitem.FullName).replace("'","''") $json = (Get-Content $psitem.FullName).replace("'","''")
Write-output "`$sync.configs.$($psitem.BaseName) = '$json' `| convertfrom-json" | Out-File ./$scriptname -Append -Encoding ascii Write-output "`$sync.configs.$($psitem.BaseName) = '$json' `| convertfrom-json" | Out-File ./$scriptname -Append -Encoding ascii
} }

View File

@ -99,3 +99,6 @@ Thanks a lot for spending your time helping Winutil grow. Thanks a lot! Keep roc
[![Contributors](https://contrib.rocks/image?repo=ChrisTitusTech/winutil)](https://github.com/ChrisTitusTech/winutil/graphs/contributors) [![Contributors](https://contrib.rocks/image?repo=ChrisTitusTech/winutil)](https://github.com/ChrisTitusTech/winutil/graphs/contributors)
## GitHub Stats
![Alt](https://repobeats.axiom.co/api/embed/aad37eec9114c507f109d34ff8d38a59adc9503f.svg "Repobeats analytics image")

View File

@ -1,4 +1,4 @@
{ {
"WPFInstall7zip": { "WPFInstall7zip": {
"winget": "7zip.7zip", "winget": "7zip.7zip",
"choco": "7zip" "choco": "7zip"
@ -19,6 +19,10 @@
"winget": "AnyDeskSoftwareGmbH.AnyDesk", "winget": "AnyDeskSoftwareGmbH.AnyDesk",
"choco": "anydesk" "choco": "anydesk"
}, },
"WPFInstallaimp": {
"winget": "AIMP.AIMP",
"choco": "aimp"
},
"WPFInstallaudacity": { "WPFInstallaudacity": {
"winget": "Audacity.Audacity", "winget": "Audacity.Audacity",
"choco": "audacity" "choco": "audacity"
@ -91,6 +95,10 @@
"winget": "Microsoft.DotNet.DesktopRuntime.6", "winget": "Microsoft.DotNet.DesktopRuntime.6",
"choco": "dotnet-6.0-runtime" "choco": "dotnet-6.0-runtime"
}, },
"WPFInstalldotnet7": {
"winget": "Microsoft.DotNet.DesktopRuntime.7",
"choco": "dotnet-7.0-runtime"
},
"WPFInstalleaapp": { "WPFInstalleaapp": {
"winget": "ElectronicArts.EADesktop", "winget": "ElectronicArts.EADesktop",
"choco": "ea-app" "choco": "ea-app"
@ -143,6 +151,10 @@
"winget": "GIMP.GIMP", "winget": "GIMP.GIMP",
"choco": "gimp" "choco": "gimp"
}, },
"WPFInstallguilded": {
"winget": "Guilded.Guilded",
"choco": ""
},
"WPFInstallgit": { "WPFInstallgit": {
"Winget": "Git.Git", "Winget": "Git.Git",
"choco": "git" "choco": "git"
@ -303,6 +315,10 @@
"winget": "mRemoteNG.mRemoteNG", "winget": "mRemoteNG.mRemoteNG",
"choco": "mremoteng" "choco": "mremoteng"
}, },
"WPFInstallmsiafterburner": {
"winget": "Guru3D.Afterburner",
"choco": "msiafterburner"
},
"WPFInstallmusicbee": { "WPFInstallmusicbee": {
"winget": "MusicBee.MusicBee", "winget": "MusicBee.MusicBee",
"choco": "musicbee" "choco": "musicbee"
@ -491,6 +507,10 @@
"winget": "SumatraPDF.SumatraPDF", "winget": "SumatraPDF.SumatraPDF",
"choco": "sumatrapdf" "choco": "sumatrapdf"
}, },
"WPFInstallsuperf4": {
"winget": "StefanSundin.Superf4",
"choco": "superf4"
},
"WPFInstalltcpview": { "WPFInstalltcpview": {
"winget": "Microsoft.Sysinternals.TCPView", "winget": "Microsoft.Sysinternals.TCPView",
"choco": "tcpview" "choco": "tcpview"
@ -511,6 +531,10 @@
"winget": "Microsoft.WindowsTerminal", "winget": "Microsoft.WindowsTerminal",
"choco": "microsoft-windows-terminal" "choco": "microsoft-windows-terminal"
}, },
"WPFInstallthorium": {
"winget": "Alex313031.Thorium",
"choco": "na"
},
"WPFInstalltor": { "WPFInstalltor": {
"Winget": "TorProject.TorBrowser", "Winget": "TorProject.TorBrowser",
"choco": "tor-browser" "choco": "tor-browser"
@ -530,7 +554,7 @@
"WPFInstalltidal": { "WPFInstalltidal": {
"Winget": "9NNCB5BS59PH", "Winget": "9NNCB5BS59PH",
"choco": "na" "choco": "na"
}, },
"WPFInstallubisoft": { "WPFInstallubisoft": {
"winget": "Ubisoft.Connect", "winget": "Ubisoft.Connect",
"choco": "ubisoft-connect" "choco": "ubisoft-connect"
@ -547,6 +571,10 @@
"winget": "Microsoft.VCRedist.2015+.x64", "winget": "Microsoft.VCRedist.2015+.x64",
"choco": "na" "choco": "na"
}, },
"WPFInstallventoy": {
"winget": "na",
"choco": "ventoy"
},
"WPFInstallviber": { "WPFInstallviber": {
"Winget": "Viber.Viber", "Winget": "Viber.Viber",
"choco": "viber" "choco": "viber"
@ -611,6 +639,10 @@
"winget": "subhra74.XtremeDownloadManager", "winget": "subhra74.XtremeDownloadManager",
"choco": "xdm" "choco": "xdm"
}, },
"WPFInstallzerotierone": {
"winget": "ZeroTier.ZeroTierOne",
"choco": "zerotier-one"
},
"WPFInstallzoom": { "WPFInstallzoom": {
"winget": "Zoom.Zoom", "winget": "Zoom.Zoom",
"choco": "zoom" "choco": "zoom"

View File

@ -40,7 +40,7 @@
"Microsoft-Windows-Subsystem-Linux" "Microsoft-Windows-Subsystem-Linux"
], ],
"InvokeScript": [ "InvokeScript": [
] ]
}, },
"WPFFeaturenfs": { "WPFFeaturenfs": {

View File

@ -1,4 +1,4 @@
#This file is meant to assist in building out the json files inside this folder. # This file is meant to assist in building out the json files inside this folder.
#=========================================================================== #===========================================================================
# applications.json # applications.json
@ -35,7 +35,7 @@ Example:
#> #>
#Modify the variables and run his code. It will import the current file and add your addition. From there you can create a pull request. # Modify the variables and run his code. It will import the current file and add your addition. From there you can create a pull request.
#------Do not delete WPF------ #------Do not delete WPF------
$NameofButton = "WPF" + "" $NameofButton = "WPF" + ""
@ -45,7 +45,7 @@ $ChocoCommand = ""
$ButtonToAdd = New-Object psobject $ButtonToAdd = New-Object psobject
$jsonfile = Get-Content ./config/applications.json | ConvertFrom-Json $jsonfile = Get-Content ./config/applications.json | ConvertFrom-Json
#remove if already exists # Remove if already exists
if($jsonfile.$NameofButton){ if($jsonfile.$NameofButton){
$jsonfile.psobject.Properties.remove($NameofButton) $jsonfile.psobject.Properties.remove($NameofButton)
} }
@ -85,10 +85,10 @@ Example:
"ClientForNFS-Infrastructure", "ClientForNFS-Infrastructure",
"NFS-Administration" "NFS-Administration"
] ]
} }
#> #>
#Modify the variables and run his code. It will import the current file and add your addition. From there you can create a pull request. # Modify the variables and run his code. It will import the current file and add your addition. From there you can create a pull request.
$NameofButton = "" $NameofButton = ""
$commands = @( $commands = @(
@ -97,7 +97,7 @@ $commands = @(
$jsonfile = Get-Content ./config/feature.json | ConvertFrom-Json $jsonfile = Get-Content ./config/feature.json | ConvertFrom-Json
#remove if already exists # Remove if already exists
if($jsonfile.$NameofButton){ if($jsonfile.$NameofButton){
$jsonfile.psobject.Properties.remove($NameofButton) $jsonfile.psobject.Properties.remove($NameofButton)
} }
@ -147,19 +147,19 @@ Example:
"EssTweaksServices", "EssTweaksServices",
"EssTweaksTele" "EssTweaksTele"
] ]
} }
#> #>
#Modify the variables and run his code. It will import the current file and add your addition. From there you can create a pull request. # Modify the variables and run his code. It will import the current file and add your addition. From there you can create a pull request.
$NameofButton = "WPF" + "" $NameofButton = "WPF" + ""
$commands = @( $commands = @(
) )
$jsonfile = Get-Content ./config/preset.json | ConvertFrom-Json $jsonfile = Get-Content ./config/preset.json | ConvertFrom-Json
#remove if already exists # Remove if already exists
if($jsonfile.$NameofButton){ if($jsonfile.$NameofButton){
$jsonfile.psobject.Properties.remove($NameofButton) $jsonfile.psobject.Properties.remove($NameofButton)
} }
@ -186,21 +186,21 @@ $jsonfile | ConvertTo-Json | Out-File ./config/preset.json
"Path": "Path in registry", "Path": "Path in registry",
"Name": "Name of Registry key", "Name": "Name of Registry key",
"Type": "Item type", "Type": "Item type",
"Value": "Value to modify", "Value": "Value to modify",
"OriginalValue": "value to reset" "OriginalValue": "value to reset"
} }
], ],
"service" : [ "service" : [
{ {
"Name": "Name of service", "Name": "Name of service",
"StartupType": "Startup type to set", "StartupType": "Startup type to set",
"OriginalType": "Startup type to reset" "OriginalType": "Startup type to reset"
} }
], ],
"ScheduledTask" : [ "ScheduledTask" : [
{ {
"Name": "Path to scheduled task", "Name": "Path to scheduled task",
"State": "State to set", "State": "State to set",
"OriginalState": "State to reset" "OriginalState": "State to reset"
} }
], ],
@ -211,10 +211,10 @@ $jsonfile | ConvertTo-Json | Out-File ./config/preset.json
"InvokeScript": [ "InvokeScript": [
"Script to make modifications not possible with the above types "Script to make modifications not possible with the above types
Special care needs to be taken here as converting from json to a scriptblock Special care needs to be taken here as converting from json to a scriptblock
can cause weird issues. Please look at the example below to get an idea of how things should work" can cause weird issues. Please look at the example below to get an idea of how things should work"
], ],
"UndoScript": [ "UndoScript": [
"Same as above however is meant to undo what you did above" "Same as above however is meant to undo what you did above"
] ]
} }
} }
@ -228,14 +228,14 @@ Example:
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\System", "Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\System",
"Name": "EnableActivityFeed", "Name": "EnableActivityFeed",
"Type": "DWord", "Type": "DWord",
"Value": "0", "Value": "0",
"OriginalValue": "1" "OriginalValue": "1"
}, },
{ {
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\System", "Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\System",
"Name": "PublishUserActivities", "Name": "PublishUserActivities",
"Type": "DWord", "Type": "DWord",
"Value": "0", "Value": "0",
"OriginalValue": "1" "OriginalValue": "1"
} }
] ]
@ -244,12 +244,12 @@ Example:
"service" : [ "service" : [
{ {
"Name": "HomeGroupListener", "Name": "HomeGroupListener",
"StartupType": "Manual", "StartupType": "Manual",
"OriginalType": "Automatic" "OriginalType": "Automatic"
}, },
{ {
"Name": "HomeGroupProvider", "Name": "HomeGroupProvider",
"StartupType": "Manual", "StartupType": "Manual",
"OriginalType": "Automatic" "OriginalType": "Automatic"
} }
] ]
@ -258,12 +258,12 @@ Example:
"ScheduledTask" : [ "ScheduledTask" : [
{ {
"Name": "Microsoft\\Windows\\Application Experience\\Microsoft Compatibility Appraiser", "Name": "Microsoft\\Windows\\Application Experience\\Microsoft Compatibility Appraiser",
"State": "Disabled", "State": "Disabled",
"OriginalState": "Enabled" "OriginalState": "Enabled"
}, },
{ {
"Name": "Microsoft\\Windows\\Application Experience\\ProgramDataUpdater", "Name": "Microsoft\\Windows\\Application Experience\\ProgramDataUpdater",
"State": "Disabled", "State": "Disabled",
"OriginalState": "Enabled" "OriginalState": "Enabled"
} }
] ]
@ -279,18 +279,18 @@ Example:
"Import-Module BitsTransfer "Import-Module BitsTransfer
Start-BitsTransfer -Source \"https://raw.githubusercontent.com/ChrisTitusTech/win10script/master/ooshutup10.cfg\" -Destination C:\\Windows\\Temp\\ooshutup10.cfg Start-BitsTransfer -Source \"https://raw.githubusercontent.com/ChrisTitusTech/win10script/master/ooshutup10.cfg\" -Destination C:\\Windows\\Temp\\ooshutup10.cfg
Start-BitsTransfer -Source \"https://dl5.oo-software.com/files/ooshutup10/OOSU10.exe\" -Destination C:\\Windows\\Temp\\OOSU10.exe Start-BitsTransfer -Source \"https://dl5.oo-software.com/files/ooshutup10/OOSU10.exe\" -Destination C:\\Windows\\Temp\\OOSU10.exe
C:\\Windows\\Temp\\OOSU10.exe C:\\Windows\\Temp\\ooshutup10.cfg /quiet" C:\\Windows\\Temp\\OOSU10.exe C:\\Windows\\Temp\\ooshutup10.cfg /quiet"
] ]
} }
} }
#> #>
#Modify the variables and run his code. It will import the current file and add your addition. From there you can create a pull request. # Modify the variables and run his code. It will import the current file and add your addition. From there you can create a pull request.
#Make sure to uncomment the sections you which to add. # Make sure to uncomment the sections you which to add.
#$Registry = @( #$Registry = @(
# #to add more repeat this separated by a comma # # To add more repeat this separated by a comma
# @{ # @{
# Path = "" # Path = ""
# Name = "" # Name = ""
@ -301,7 +301,7 @@ Example:
#) #)
#$Service = @( #$Service = @(
# #to add more repeat this separated by a comma # # To add more repeat this separated by a comma
# @{ # @{
# Name = "" # Name = ""
# StartupType = "" # StartupType = ""
@ -310,7 +310,7 @@ Example:
#) #)
#$ScheduledTask = @( #$ScheduledTask = @(
# #to add more repeat this separated by a comma # # To add more repeat this separated by a comma
# @{ # @{
# Name = "" # Name = ""
# State = "" # State = ""
@ -323,11 +323,11 @@ Example:
#) #)
#$InvokeScript = @( #$InvokeScript = @(
# "" # ""
#) #)
#$UndoScript = @( #$UndoScript = @(
# "" # ""
#) #)
$NameofButton = "WPF" + "" $NameofButton = "WPF" + ""
@ -335,7 +335,7 @@ $NameofButton = "WPF" + ""
$ButtonToAdd = New-Object psobject $ButtonToAdd = New-Object psobject
$jsonfile = Get-Content ./config/tweaks.json | ConvertFrom-Json $jsonfile = Get-Content ./config/tweaks.json | ConvertFrom-Json
#remove if already exists # Remove if already exists
if($jsonfile.$NameofButton){ if($jsonfile.$NameofButton){
$jsonfile.psobject.Properties.remove($NameofButton) $jsonfile.psobject.Properties.remove($NameofButton)
} }
@ -375,10 +375,10 @@ Example:
"Primary": "1.1.1.1", "Primary": "1.1.1.1",
"Secondary": "1.0.0.1" "Secondary": "1.0.0.1"
} }
} }
#> #>
#Modify the variables and run his code. It will import the current file and add your addition. From there you can create a pull request. # Modify the variables and run his code. It will import the current file and add your addition. From there you can create a pull request.
$NameofProvider = "" -replace " ","_" $NameofProvider = "" -replace " ","_"
$IPAddress = @{ $IPAddress = @{
@ -389,7 +389,7 @@ $IPAddress = @{
$ButtonToAdd = New-Object psobject $ButtonToAdd = New-Object psobject
$jsonfile = Get-Content ./config/dns.json | ConvertFrom-Json $jsonfile = Get-Content ./config/dns.json | ConvertFrom-Json
#remove if already exists # Remove if already exists
if($jsonfile.$NameofProvider){ if($jsonfile.$NameofProvider){
$jsonfile.psobject.Properties.remove($NameofProvider) $jsonfile.psobject.Properties.remove($NameofProvider)
} }

View File

@ -1556,6 +1556,26 @@
"Name": "Microsoft\\Windows\\Windows Error Reporting\\QueueReporting", "Name": "Microsoft\\Windows\\Windows Error Reporting\\QueueReporting",
"State": "Disabled", "State": "Disabled",
"OriginalState": "Enabled" "OriginalState": "Enabled"
},
{
"Name": "Microsoft\\Windows\\Application Experience\\MareBackup",
"State": "Disabled",
"OriginalState": "Enabled"
},
{
"Name": "Microsoft\\Windows\\Application Experience\\StartupAppTask",
"State": "Disabled",
"OriginalState": "Enabled"
},
{
"Name": "Microsoft\\Windows\\Application Experience\\PcaPatchDbTask",
"State": "Disabled",
"OriginalState": "Enabled"
},
{
"Name": "Microsoft\\Windows\\Maps\\MapsUpdateTask",
"State": "Disabled",
"OriginalState": "Enabled"
} }
], ],
"registry": [ "registry": [
@ -1842,7 +1862,8 @@
} }
], ],
"InvokeScript": [ "InvokeScript": [
"bcdedit /set `{current`} bootmenupolicy Legacy | Out-Null "
bcdedit /set `{current`} bootmenupolicy Legacy | Out-Null
If ((get-ItemProperty -Path \"HKLM:\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\" -Name CurrentBuild).CurrentBuild -lt 22557) { If ((get-ItemProperty -Path \"HKLM:\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\" -Name CurrentBuild).CurrentBuild -lt 22557) {
$taskmgr = Start-Process -WindowStyle Hidden -FilePath taskmgr.exe -PassThru $taskmgr = Start-Process -WindowStyle Hidden -FilePath taskmgr.exe -PassThru
Do { Do {
@ -1853,7 +1874,7 @@
$preferences.Preferences[28] = 0 $preferences.Preferences[28] = 0
Set-ItemProperty -Path \"HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\TaskManager\" -Name \"Preferences\" -Type Binary -Value $preferences.Preferences Set-ItemProperty -Path \"HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\TaskManager\" -Name \"Preferences\" -Type Binary -Value $preferences.Preferences
} }
Remove-Item -Path \"HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{0DB7E03F-FC29-4DC6-9020-FF41B59E513A}\" -Recurse -ErrorAction SilentlyContinue Remove-Item -Path \"HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{0DB7E03F-FC29-4DC6-9020-FF41B59E513A}\" -Recurse -ErrorAction SilentlyContinue
# Group svchost.exe processes # Group svchost.exe processes
$ram = (Get-CimInstance -ClassName Win32_PhysicalMemory | Measure-Object -Property Capacity -Sum).Sum / 1kb $ram = (Get-CimInstance -ClassName Win32_PhysicalMemory | Measure-Object -Property Capacity -Sum).Sum / 1kb
@ -1864,6 +1885,9 @@
Remove-Item \"$autoLoggerDir\\AutoLogger-Diagtrack-Listener.etl\" Remove-Item \"$autoLoggerDir\\AutoLogger-Diagtrack-Listener.etl\"
} }
icacls $autoLoggerDir /deny SYSTEM:`(OI`)`(CI`)F | Out-Null icacls $autoLoggerDir /deny SYSTEM:`(OI`)`(CI`)F | Out-Null
# Disable Defender Auto Sample Submission
Set-MpPreference -SubmitSamplesConsent 2 -ErrorAction SilentlyContinue | Out-Null
" "
] ]
}, },
@ -1910,84 +1934,84 @@
"WPFMiscTweaksDisplay": { "WPFMiscTweaksDisplay": {
"registry": [ "registry": [
{ {
"path": "HKCU:\\Control Panel\\Desktop", "Path": "HKCU:\\Control Panel\\Desktop",
"OriginalValue": "1", "OriginalValue": "1",
"Name": "DragFullWindows", "Name": "DragFullWindows",
"Value": "0", "Value": "0",
"Type": "String" "Type": "String"
}, },
{ {
"path": "HKCU:\\Control Panel\\Desktop", "Path": "HKCU:\\Control Panel\\Desktop",
"OriginalValue": "1", "OriginalValue": "1",
"Name": "MenuShowDelay", "Name": "MenuShowDelay",
"Value": "200", "Value": "200",
"Type": "String" "Type": "String"
}, },
{ {
"path": "HKCU:\\Control Panel\\Desktop\\WindowMetrics", "Path": "HKCU:\\Control Panel\\Desktop\\WindowMetrics",
"OriginalValue": "1", "OriginalValue": "1",
"Name": "MinAnimate", "Name": "MinAnimate",
"Value": "0", "Value": "0",
"Type": "String" "Type": "String"
}, },
{ {
"path": "HKCU:\\Control Panel\\Keyboard", "Path": "HKCU:\\Control Panel\\Keyboard",
"OriginalValue": "1", "OriginalValue": "1",
"Name": "KeyboardDelay", "Name": "KeyboardDelay",
"Value": "0", "Value": "0",
"Type": "DWord" "Type": "DWord"
}, },
{ {
"path": "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced", "Path": "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
"OriginalValue": "1", "OriginalValue": "1",
"Name": "ListviewAlphaSelect", "Name": "ListviewAlphaSelect",
"Value": "0", "Value": "0",
"Type": "DWord" "Type": "DWord"
}, },
{ {
"path": "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced", "Path": "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
"OriginalValue": "1", "OriginalValue": "1",
"Name": "ListviewShadow", "Name": "ListviewShadow",
"Value": "0", "Value": "0",
"Type": "DWord" "Type": "DWord"
}, },
{ {
"path": "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced", "Path": "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
"OriginalValue": "1", "OriginalValue": "1",
"Name": "TaskbarAnimations", "Name": "TaskbarAnimations",
"Value": "0", "Value": "0",
"Type": "DWord" "Type": "DWord"
}, },
{ {
"path": "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\VisualEffects", "Path": "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\VisualEffects",
"OriginalValue": "1", "OriginalValue": "1",
"Name": "VisualFXSetting", "Name": "VisualFXSetting",
"Value": "3", "Value": "3",
"Type": "DWord" "Type": "DWord"
}, },
{ {
"path": "HKCU:\\Software\\Microsoft\\Windows\\DWM", "Path": "HKCU:\\Software\\Microsoft\\Windows\\DWM",
"OriginalValue": "1", "OriginalValue": "1",
"Name": "EnableAeroPeek", "Name": "EnableAeroPeek",
"Value": "0", "Value": "0",
"Type": "DWord" "Type": "DWord"
}, },
{ {
"path": "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced", "Path": "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
"OriginalValue": "1", "OriginalValue": "1",
"Name": "TaskbarMn", "Name": "TaskbarMn",
"Value": "0", "Value": "0",
"Type": "DWord" "Type": "DWord"
}, },
{ {
"path": "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced", "Path": "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
"OriginalValue": "1", "OriginalValue": "1",
"Name": "TaskbarDa", "Name": "TaskbarDa",
"Value": "0", "Value": "0",
"Type": "DWord" "Type": "DWord"
}, },
{ {
"path": "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced", "Path": "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
"OriginalValue": "1", "OriginalValue": "1",
"Name": "ShowTaskViewButton", "Name": "ShowTaskViewButton",
"Value": "0", "Value": "0",
@ -2089,26 +2113,26 @@
" "
$TeamsPath = [System.IO.Path]::Combine($env:LOCALAPPDATA, 'Microsoft', 'Teams') $TeamsPath = [System.IO.Path]::Combine($env:LOCALAPPDATA, 'Microsoft', 'Teams')
$TeamsUpdateExePath = [System.IO.Path]::Combine($TeamsPath, 'Update.exe') $TeamsUpdateExePath = [System.IO.Path]::Combine($TeamsPath, 'Update.exe')
Write-Host \"Stopping Teams process...\" Write-Host \"Stopping Teams process...\"
Stop-Process -Name \"*teams*\" -Force -ErrorAction SilentlyContinue Stop-Process -Name \"*teams*\" -Force -ErrorAction SilentlyContinue
Write-Host \"Uninstalling Teams from AppData\\Microsoft\\Teams\" Write-Host \"Uninstalling Teams from AppData\\Microsoft\\Teams\"
if ([System.IO.File]::Exists($TeamsUpdateExePath)) { if ([System.IO.File]::Exists($TeamsUpdateExePath)) {
# Uninstall app # Uninstall app
$proc = Start-Process $TeamsUpdateExePath \"-uninstall -s\" -PassThru $proc = Start-Process $TeamsUpdateExePath \"-uninstall -s\" -PassThru
$proc.WaitForExit() $proc.WaitForExit()
} }
Write-Host \"Removing Teams AppxPackage...\" Write-Host \"Removing Teams AppxPackage...\"
Get-AppxPackage \"*Teams*\" | Remove-AppxPackage -ErrorAction SilentlyContinue Get-AppxPackage \"*Teams*\" | Remove-AppxPackage -ErrorAction SilentlyContinue
Get-AppxPackage \"*Teams*\" -AllUsers | Remove-AppxPackage -AllUsers -ErrorAction SilentlyContinue Get-AppxPackage \"*Teams*\" -AllUsers | Remove-AppxPackage -AllUsers -ErrorAction SilentlyContinue
Write-Host \"Deleting Teams directory\" Write-Host \"Deleting Teams directory\"
if ([System.IO.Directory]::Exists($TeamsPath)) { if ([System.IO.Directory]::Exists($TeamsPath)) {
Remove-Item $TeamsPath -Force -Recurse -ErrorAction SilentlyContinue Remove-Item $TeamsPath -Force -Recurse -ErrorAction SilentlyContinue
} }
Write-Host \"Deleting Teams uninstall registry key\" Write-Host \"Deleting Teams uninstall registry key\"
# Uninstall from Uninstall registry key UninstallString # Uninstall from Uninstall registry key UninstallString
$us = (Get-ChildItem -Path HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall, HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall | Get-ItemProperty | Where-Object { $_.DisplayName -like '*Teams*'}).UninstallString $us = (Get-ChildItem -Path HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall, HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall | Get-ItemProperty | Where-Object { $_.DisplayName -like '*Teams*'}).UninstallString
@ -2133,7 +2157,7 @@
"WPFEssTweaksStorage": { "WPFEssTweaksStorage": {
"InvokeScript": [ "InvokeScript": [
"Remove-Item -Path \"HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\StorageSense\\Parameters\\StoragePolicy\" -Recurse -ErrorAction SilentlyContinue" "Remove-Item -Path \"HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\StorageSense\\Parameters\\StoragePolicy\" -Recurse -ErrorAction SilentlyContinue"
], ],
"UndoScript": [ "UndoScript": [
"New-Item -Path \"HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\StorageSense\\Parameters\\StoragePolicy\" | Out-Null "New-Item -Path \"HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\StorageSense\\Parameters\\StoragePolicy\" | Out-Null
" "
@ -2142,7 +2166,7 @@
"WPFMiscTweaksLapNum": { "WPFMiscTweaksLapNum": {
"Registry": [ "Registry": [
{ {
"path": "HKU:\\.DEFAULT\\Control Panel\\Keyboard", "Path": "HKU:\\.DEFAULT\\Control Panel\\Keyboard",
"OriginalValue": "1", "OriginalValue": "1",
"Name": "InitialKeyboardIndicators", "Name": "InitialKeyboardIndicators",
"Value": "0", "Value": "0",
@ -2153,7 +2177,7 @@
"WPFMiscTweaksNum": { "WPFMiscTweaksNum": {
"Registry": [ "Registry": [
{ {
"path": "HKU:\\.DEFAULT\\Control Panel\\Keyboard", "Path": "HKU:\\.DEFAULT\\Control Panel\\Keyboard",
"OriginalValue": "1", "OriginalValue": "1",
"Name": "InitialKeyboardIndicators", "Name": "InitialKeyboardIndicators",
"Value": "80000002", "Value": "80000002",
@ -2163,10 +2187,10 @@
}, },
"WPFEssTweaksRemoveEdge": { "WPFEssTweaksRemoveEdge": {
"InvokeScript": [ "InvokeScript": [
" "
#:: Standalone script by AveYo Source: https://raw.githubusercontent.com/AveYo/fox/main/Edge_Removal.bat #:: Standalone script by AveYo Source: https://raw.githubusercontent.com/AveYo/fox/main/Edge_Removal.bat
curl.exe -s \"https://raw.githubusercontent.com/AveYo/fox/main/Edge_Removal.bat\" -o $ENV:temp\\edgeremoval.bat curl.exe -s \"https://raw.githubusercontent.com/ChrisTitusTech/winutil/main/edgeremoval.bat\" -o $ENV:temp\\edgeremoval.bat
Start-Process $ENV:temp\\edgeremoval.bat Start-Process $ENV:temp\\edgeremoval.bat
" "
@ -2181,7 +2205,7 @@
"WPFEssTweaksRemoveOnedrive": { "WPFEssTweaksRemoveOnedrive": {
"InvokeScript": [ "InvokeScript": [
" "
Write-Host \"Kill OneDrive process\" Write-Host \"Kill OneDrive process\"
taskkill.exe /F /IM \"OneDrive.exe\" taskkill.exe /F /IM \"OneDrive.exe\"
taskkill.exe /F /IM \"explorer.exe\" taskkill.exe /F /IM \"explorer.exe\"
@ -2295,7 +2319,7 @@
"WPFMiscTweaksDisableUAC": { "WPFMiscTweaksDisableUAC": {
"registry": [ "registry": [
{ {
"path": "HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", "Path": "HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System",
"OriginalValue": "5", "OriginalValue": "5",
"Name": "ConsentPromptBehaviorAdmin", "Name": "ConsentPromptBehaviorAdmin",
"Value": "0", "Value": "0",
@ -2306,21 +2330,21 @@
"WPFMiscTweaksDisableMouseAcceleration": { "WPFMiscTweaksDisableMouseAcceleration": {
"registry": [ "registry": [
{ {
"path": "HKCU:\\Control Panel\\Mouse", "Path": "HKCU:\\Control Panel\\Mouse",
"OriginalValue": "1", "OriginalValue": "1",
"Name": "MouseSpeed", "Name": "MouseSpeed",
"Value": "0", "Value": "0",
"Type": "String" "Type": "String"
}, },
{ {
"path": "HKCU:\\Control Panel\\Mouse", "Path": "HKCU:\\Control Panel\\Mouse",
"OriginalValue": "6", "OriginalValue": "6",
"Name": "MouseThreshold1", "Name": "MouseThreshold1",
"Value": "0", "Value": "0",
"Type": "String" "Type": "String"
}, },
{ {
"path": "HKCU:\\Control Panel\\Mouse", "Path": "HKCU:\\Control Panel\\Mouse",
"OriginalValue": "10", "OriginalValue": "10",
"Name": "MouseThreshold2", "Name": "MouseThreshold2",
"Value": "0", "Value": "0",
@ -2331,21 +2355,21 @@
"WPFMiscTweaksEnableMouseAcceleration": { "WPFMiscTweaksEnableMouseAcceleration": {
"registry": [ "registry": [
{ {
"path": "HKCU:\\Control Panel\\Mouse", "Path": "HKCU:\\Control Panel\\Mouse",
"OriginalValue": "1", "OriginalValue": "1",
"Name": "MouseSpeed", "Name": "MouseSpeed",
"Value": "1", "Value": "1",
"Type": "String" "Type": "String"
}, },
{ {
"path": "HKCU:\\Control Panel\\Mouse", "Path": "HKCU:\\Control Panel\\Mouse",
"OriginalValue": "6", "OriginalValue": "6",
"Name": "MouseThreshold1", "Name": "MouseThreshold1",
"Value": "6", "Value": "6",
"Type": "String" "Type": "String"
}, },
{ {
"path": "HKCU:\\Control Panel\\Mouse", "Path": "HKCU:\\Control Panel\\Mouse",
"OriginalValue": "10", "OriginalValue": "10",
"Name": "MouseThreshold2", "Name": "MouseThreshold2",
"Value": "10", "Value": "10",
@ -2356,7 +2380,7 @@
"WPFMiscTweaksEnableVerboselogon": { "WPFMiscTweaksEnableVerboselogon": {
"registry": [ "registry": [
{ {
"path": "HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\policies\\system", "Path": "HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\policies\\system",
"OriginalValue": "0", "OriginalValue": "0",
"Name": "VerboseStatus", "Name": "VerboseStatus",
"Value": "1", "Value": "1",

236
edgeremoval.bat Normal file
View File

@ -0,0 +1,236 @@
@(set "0=%~f0"^)#) & powershell -nop -c iex([io.file]::ReadAllText($env:0)) & exit /b
#:: made by AveYo source: https://raw.githubusercontent.com/AveYo/fox/main/Edge_Removal.bat
sp 'HKCU:\Volatile Environment' 'Edge_Removal' @'
$also_remove_webview = 0
$host.ui.RawUI.WindowTitle = 'Edge Removal - AveYo, 2023.09.09'
$remove_win32 = @("Microsoft Edge","Microsoft Edge Update"); $remove_appx = @("MicrosoftEdge"); $skip = @() # @("DevTools")
if ($also_remove_webview -eq 1) {$remove_win32 += "Microsoft EdgeWebView"; $remove_appx += "WebExperience","Win32WebViewHost"}
## 1 bonus! enter into powershell console: firefox / edge / webview to install a browser / reinstall edge or webview after removal
function global:firefox { $url = 'https://download.mozilla.org/?product=firefox-stub'
$setup = "$((new-object -ComObject Shell.Application).NameSpace('shell:Downloads').Self.Path)\Firefox Installer.exe"
write-host $url; Invoke-WebRequest $url -OutFile $setup; start $setup
}
function global:edge { $url = 'https://go.microsoft.com/fwlink/?linkid=2108834&Channel=Stable&language=en'
$setup = "$((new-object -ComObject Shell.Application).NameSpace('shell:Downloads').Self.Path)\MicrosoftEdgeSetup.exe"
write-host $url; Invoke-WebRequest $url -OutFile $setup; prepare_edge; start $setup
}
function global:webview { $url = 'https://go.microsoft.com/fwlink/p/?LinkId=2124703'
$setup = "$((new-object -ComObject Shell.Application).NameSpace('shell:Downloads').Self.Path)\MicrosoftEdgeWebview2Setup.exe"
write-host $url; Invoke-WebRequest $url -OutFile $setup; prepare_webview; start $setup
}
## helper for set-itemproperty remove-itemproperty new-item remove-item with auto test-path
function global:sp_test_path { if (test-path $args[0]) {Microsoft.PowerShell.Management\Set-ItemProperty @args} else {
Microsoft.PowerShell.Management\New-Item $args[0] -force -ea 0 >''; Microsoft.PowerShell.Management\Set-ItemProperty @args} }
function global:rp_test_path { if (test-path $args[0]) {Microsoft.PowerShell.Management\Remove-ItemProperty @args} }
function global:ni_test_path { if (-not (test-path $args[0])) {Microsoft.PowerShell.Management\New-Item @args} }
function global:ri_test_path { if (test-path $args[0]) {Microsoft.PowerShell.Management\Remove-Item @args} }
foreach ($f in 'sp','rp','ni','ri') {set-alias -Name $f -Value "${f}_test_path" -Scope Local -Option AllScope -force -ea 0}
## helper for edge reinstall - remove bundled OpenWebSearch redirector and edgeupdate policies
function global:prepare_edge {
foreach ($f in 'ni','ri','sp','rp') {set-alias -Name $f -Value "${f}_test_path" -Scope Local -Option AllScope -force -ea 0}
$MS=($env:ProgramFiles,${env:ProgramFiles(x86)})[[Environment]::Is64BitOperatingSystem]+'\Microsoft\Edge\Application\msedge.exe'
ri "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\msedge.exe" -recurse -force -ea 0
ri "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ie_to_edge_stub.exe" -recurse -force -ea 0
ri 'Registry::HKEY_Users\S-1-5-21*\Software\Classes\microsoft-edge' -recurse -force -ea 0
ri 'Registry::HKEY_Users\S-1-5-21*\Software\Classes\MSEdgeHTM' -recurse -force -ea 0
ni "HKLM:\SOFTWARE\Classes\microsoft-edge\shell\open\command" -force -ea 0 >''
sp "HKLM:\SOFTWARE\Classes\microsoft-edge\shell\open\command" '(Default)' "`"$MS`" --single-argument %%1" -force -ea 0
ni "HKLM:\SOFTWARE\Classes\MSEdgeHTM\shell\open\command" -force -ea 0 >''
sp "HKLM:\SOFTWARE\Classes\MSEdgeHTM\shell\open\command" '(Default)' "`"$MS`" --single-argument %%1" -force -ea 0
foreach ($p in 'HKLM:\SOFTWARE\Policies','HKLM:\SOFTWARE','HKLM:\SOFTWARE\WOW6432Node') {
rp "$p\Microsoft\EdgeUpdate" 'InstallDefault' -force -ea 0
rp "$p\Microsoft\EdgeUpdate" 'Install{56EB18F8-B008-4CBD-B6D2-8C97FE7E9062}' -force -ea 0
rp "$p\Microsoft\EdgeUpdate" 'Install{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}' -force -ea 0
}
$edgeupdate='Microsoft\EdgeUpdate\Clients\{56EB18F8-B008-4CBD-B6D2-8C97FE7E9062}'
$webvupdate='Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}'
$on_actions='on-os-upgrade','on-logon','on-logon-autolaunch','on-logon-startup-boost'
foreach ($p in 'HKLM:\SOFTWARE','HKLM:\SOFTWARE\Wow6432Node') { foreach ($launch in $on_actions) {
ri "$p\$edgeupdate\Commands\$launch" -force -ea 0; ri "$p\$webvupdate\Commands\$launch" -force -ea 0
}}
}
## helper for webview reinstall - restore webexperience (widgets) if available
function global:prepare_webview {
$cfg = @{Register=$true; ForceApplicationShutdown=$true; ForceUpdateFromAnyVersion=$true; DisableDevelopmentMode=$true}
dir "$env:ProgramFiles\WindowsApps\MicrosoftWindows.Client.WebExperience*\AppxManifest.xml" -rec -ea 0 | Add-AppxPackage @cfg
dir "$env:SystemRoot\SystemApps\Microsoft.Win32WebViewHost*\AppxManifest.xml" -rec -ea 0 | Add-AppxPackage @cfg
kill -name explorer -ea 0; if ((get-process -name 'explorer' -ea 0) -eq $null) {start explorer}
}
## 2 enable admin privileges
$D1=[uri].module.gettype('System.Diagnostics.Process')."GetM`ethods"(42) |where {$_.Name -eq 'SetPrivilege'} #`:no-ev-warn
'SeSecurityPrivilege','SeTakeOwnershipPrivilege','SeBackupPrivilege','SeRestorePrivilege'|foreach {$D1.Invoke($null, @("$_",2))}
## 3 shut edge & webview clone stuff down and gather install paths
$shut = 'explorer','Widgets','widgetservice','msedgewebview2','MicrosoftEdge*','chredge','msedge','edge'
$shut+= 'msteams','msfamily','WebViewHost','Clipchamp'
cd $env:systemdrive; taskkill /im explorer.exe /f 2>&1 >''; foreach ($p in $shut) {kill -name $p -force -ea 0}
prepare_edge
## clear win32 uninstall block
foreach ($hk in 'HKCU:','HKLM:') { foreach ($wow in '','\Wow6432Node') { foreach ($i in $remove_win32) {
rp "$hk\SOFTWARE${wow}\Microsoft\Windows\CurrentVersion\Uninstall\$i" 'NoRemove' -force -ea 0
ni "$hk\SOFTWARE${wow}\Microsoft\EdgeUpdateDev" -force >''
sp "$hk\SOFTWARE${wow}\Microsoft\EdgeUpdateDev" 'AllowUninstall' 1 -type Dword -force
}}}
## find all Edge setup.exe and gather BHO paths for OpenWebSearch / MSEdgeRedirect usage
$edges = @(); $bho = @(); 'LocalApplicationData','ProgramFilesX86','ProgramFiles' |foreach {
$folder = [Environment]::GetFolderPath($_); $bho += dir "$folder\Microsoft\Edge*\ie_to_edge_stub.exe" -rec -ea 0
if ($also_remove_webview -eq 1) {$edges += dir "$folder\Microsoft\Edge*\setup.exe" -rec -ea 0 |where {$_ -like '*EdgeWebView*'}}
$edges += dir "$folder\Microsoft\Edge*\setup.exe" -rec -ea 0 |where {$_ -notlike '*EdgeWebView*'}
}
## use dedicated C:\Scripts path to save OpenWebSearch (due to Sigma rules FUD)
$DIR = "$env:SystemDrive\Scripts"; mkdir $DIR -ea 0 >''
## export OpenWebSearch innovative redirector - used by MSEdgeRedirect as well
foreach ($b in $bho) { if (test-path $b) { try {copy $b "$DIR\ie_to_edge_stub.exe" -force -ea 0} catch{} } }
## 4 remove found *Edge* appx packages with unblock tricks
$provisioned = get-appxprovisionedpackage -online; $appxpackage = get-appxpackage -allusers; $eol = @()
$store = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore'
$users = @('S-1-5-18'); if (test-path $store) {$users += $((dir $store -ea 0 |where {$_ -like '*S-1-5-21*'}).PSChildName)}
foreach ($choice in $remove_appx) { if ('' -eq $choice.Trim()) {continue}
foreach ($appx in $($provisioned |where {$_.PackageName -like "*$choice*"})) {
$next = !1; foreach ($no in $skip) {if ($appx.PackageName -like "*$no*") {$next = !0}} ; if ($next) {continue}
$PackageName = $appx.PackageName; $PackageFamilyName = ($appxpackage |where {$_.Name -eq $appx.DisplayName}).PackageFamilyName
ni "$store\Deprovisioned\$PackageFamilyName" -force >''; $PackageFamilyName
foreach ($sid in $users) {ni "$store\EndOfLife\$sid\$PackageName" -force >''} ; $eol += $PackageName
dism /online /set-nonremovableapppolicy /packagefamily:$PackageFamilyName /nonremovable:0 >''
remove-appxprovisionedpackage -packagename $PackageName -online -allusers >''
}
foreach ($appx in $($appxpackage |where {$_.PackageFullName -like "*$choice*"})) {
$next = !1; foreach ($no in $skip) {if ($appx.PackageFullName -like "*$no*") {$next = !0}} ; if ($next) {continue}
$PackageFullName = $appx.PackageFullName;
ni "$store\Deprovisioned\$appx.PackageFamilyName" -force >''; $PackageFullName
foreach ($sid in $users) {ni "$store\EndOfLife\$sid\$PackageFullName" -force >''} ; $eol += $PackageFullName
dism /online /set-nonremovableapppolicy /packagefamily:$PackageFamilyName /nonremovable:0 >''
remove-appxpackage -package $PackageFullName -allusers >''
}
}
## 5 run found *Edge* setup.exe with uninstall args and wait in-between
foreach ($setup in $edges) { if (test-path $setup) {
if ($setup -like '*EdgeWebView*') {$target = "--msedgewebview"} else {$target = "--msedge"}
$removal = "--uninstall $target --system-level --verbose-logging --force-uninstall"
try {write-host $setup $removal; start -wait $setup -args $removal} catch {}
do {sleep 3} while ((get-process -name 'setup','MicrosoftEdge*' -ea 0).Path -like '*\Microsoft\Edge*')
}}
## 6 extra cleanup
foreach ($PF in $env:ProgramFiles,${env:ProgramFiles(x86)}) { if (test-path "$PF\Microsoft\EdgeUpdate\MicrosoftEdgeUpdate.exe") {
write-host "$PF\Microsoft\EdgeUpdate\MicrosoftEdgeUpdate.exe /uninstall"
start -wait "$PF\Microsoft\EdgeUpdate\MicrosoftEdgeUpdate.exe" -args '/uninstall'
do {sleep 3} while ((get-process -name 'setup','MicrosoftEdge*' -ea 0).Path -like '*\Microsoft\Edge*')
if ($also_remove_webview -eq 1) { foreach ($hk in 'HKCU:','HKLM:') { foreach ($wow in '','\Wow6432Node') {
ri "$hk\SOFTWARE${wow}\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft Edge Update" -rec -force -ea 0 }}
ri "$PF\Microsoft\EdgeUpdate" -rec -force -ea 0; Unregister-ScheduledTask -TaskName MicrosoftEdgeUpdate* -Confirm:$false -ea 0
}
}}
$appdata = $([Environment]::GetFolderPath('ApplicationData'))
ri "$appdata\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\Tombstones\Microsoft Edge.lnk" -force
ri "$appdata\Microsoft\Internet Explorer\Quick Launch\Microsoft Edge.lnk" -force
## undo eol unblock trick to prevent latest cumulative update (LCU) failing
foreach ($sid in $users) { foreach ($PackageName in $eol) {ri "$store\EndOfLife\$sid\$PackageName" -force >''} }
## set (almost) useless policies to prevent unsolicited reinstalls
foreach ($p in 'HKLM:\SOFTWARE\Policies','HKLM:\SOFTWARE','HKLM:\SOFTWARE\WOW6432Node') {
ni "$p\Microsoft\EdgeUpdate" -force >''
sp "$p\Microsoft\EdgeUpdate" 'InstallDefault' 0 -type Dword -force
sp "$p\Microsoft\EdgeUpdate" 'Install{56EB18F8-B008-4CBD-B6D2-8C97FE7E9062}' 0 -type Dword -force
sp "$p\Microsoft\EdgeUpdate" 'Install{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}' 1 -type Dword -force
sp "$p\Microsoft\EdgeUpdate" 'DoNotUpdateToEdgeWithChromium' 1 -type Dword -force
}
$edgeupdate='Microsoft\EdgeUpdate\Clients\{56EB18F8-B008-4CBD-B6D2-8C97FE7E9062}'
$webvupdate='Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}'
$on_actions='on-os-upgrade','on-logon','on-logon-autolaunch','on-logon-startup-boost'
foreach ($p in 'HKLM:\SOFTWARE','HKLM:\SOFTWARE\Wow6432Node') { foreach ($launch in $on_actions) {
ni "$p\$edgeupdate\Commands\$launch" -force >''; sp "$p\$edgeupdate\Commands\$launch" 'CommandLine' 'systray.exe' -force
ni "$p\$webvupdate\Commands\$launch" -force >''; sp "$p\$webvupdate\Commands\$launch" 'CommandLine' 'systray.exe' -force
}}
## 7 add bundled OpenWebSearch script to redirect microsoft-edge: anti-competitive links to the default browser
$MSEP = ($env:ProgramFiles,${env:ProgramFiles(x86)})[[Environment]::Is64BitOperatingSystem] + '\Microsoft\Edge\Application'
$IFEO = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options'
$MIN = ('--headless','--width 1 --height 1')[([environment]::OSVersion.Version.Build) -gt 25179]
$CMD = "$env:systemroot\system32\conhost.exe $MIN" # AveYo: minimize prompt - see Terminal issue #13914
ni "HKLM:\SOFTWARE\Classes\microsoft-edge\shell\open\command" -force >''
sp "HKLM:\SOFTWARE\Classes\microsoft-edge" '(Default)' 'URL:microsoft-edge' -force
sp "HKLM:\SOFTWARE\Classes\microsoft-edge" 'URL Protocol' '' -force
sp "HKLM:\SOFTWARE\Classes\microsoft-edge" 'NoOpenWith' '' -force
sp "HKLM:\SOFTWARE\Classes\microsoft-edge\shell\open\command" '(Default)' "`"$DIR\ie_to_edge_stub.exe`" %1" -force
ni "HKLM:\SOFTWARE\Classes\MSEdgeHTM\shell\open\command" -force >''
sp "HKLM:\SOFTWARE\Classes\MSEdgeHTM" 'NoOpenWith' '' -force
sp "HKLM:\SOFTWARE\Classes\MSEdgeHTM\shell\open\command" '(Default)' "`"$DIR\ie_to_edge_stub.exe`" %1" -force
ni "$IFEO\ie_to_edge_stub.exe\0" -force >''
sp "$IFEO\ie_to_edge_stub.exe" 'UseFilter' 1 -type Dword -force
sp "$IFEO\ie_to_edge_stub.exe\0" 'FilterFullPath' "$DIR\ie_to_edge_stub.exe" -force
sp "$IFEO\ie_to_edge_stub.exe\0" 'Debugger' "$CMD $DIR\OpenWebSearch.cmd" -force
ni "$IFEO\msedge.exe\0" -force >''
sp "$IFEO\msedge.exe" 'UseFilter' 1 -type Dword -force
sp "$IFEO\msedge.exe\0" 'FilterFullPath' "$MSEP\msedge.exe" -force
sp "$IFEO\msedge.exe\0" 'Debugger' "$CMD $DIR\OpenWebSearch.cmd" -force
$OpenWebSearch = @$
@title OpenWebSearch Redux & echo off & set ?= open start menu web search, widgets links or help in your chosen browser - by AveYo
for /f %%E in ('"prompt $E$S& for %%e in (1) do rem"') do echo;%%E[2t 2>nul & rem AveYo: minimize prompt
call :reg_var "HKCU\SOFTWARE\Microsoft\Windows\Shell\Associations\UrlAssociations\https\UserChoice" ProgID ProgID
if /i "%ProgID%" equ "MSEdgeHTM" echo;Default browser is set to Edge! Change it or remove OpenWebSearch script. & pause & exit /b
call :reg_var "HKCR\%ProgID%\shell\open\command" "" Browser
set Choice=& for %%. in (%Browser%) do if not defined Choice set "Choice=%%~."
call :reg_var "HKCR\MSEdgeMHT\shell\open\command" "" FallBack
set "Edge=" & for %%. in (%FallBack%) do if not defined Edge set "Edge=%%~."
set "URI=" & set "URL=" & set "NOOP=" & set "PassTrough=%Edge:msedge=edge%"
set "CLI=%CMDCMDLINE:"=``% "
if defined CLI set "CLI=%CLI:*ie_to_edge_stub.exe`` =%"
if defined CLI set "CLI=%CLI:*ie_to_edge_stub.exe =%"
if defined CLI set "CLI=%CLI:*msedge.exe`` =%"
if defined CLI set "CLI=%CLI:*msedge.exe =%"
set "FIX=%CLI:~-1%"
if defined CLI if "%FIX%"==" " set "CLI=%CLI:~0,-1%"
if defined CLI set "RED=%CLI:microsoft-edge=%"
if defined CLI set "URL=%CLI:http=%"
if defined CLI set "ARG=%CLI:``="%"
if "%CLI%" equ "%RED%" (set NOOP=1) else if "%CLI%" equ "%URL%" (set NOOP=1)
if defined NOOP if exist "%PassTrough%" start "" "%PassTrough%" %ARG%
if defined NOOP exit /b
set "URL=%CLI:*microsoft-edge=%"
set "URL=http%URL:*http=%"
set "FIX=%URL:~-2%"
if defined URL if "%FIX%"=="``" set "URL=%URL:~0,-2%"
call :dec_url
start "" "%Choice%" "%URL%"
exit
:reg_var [USAGE] call :reg_var "HKCU\Volatile Environment" value-or-"" variable [extra options]
set {var}=& set {reg}=reg query "%~1" /v %2 /z /se "," /f /e& if %2=="" set {reg}=reg query "%~1" /ve /z /se "," /f /e
for /f "skip=2 tokens=* delims=" %%V in ('%{reg}% %4 %5 %6 %7 %8 %9 2^>nul') do if not defined {var} set "{var}=%%V"
if not defined {var} (set {reg}=& set "%~3="& exit /b) else if %2=="" set "{var}=%{var}:*) =%"& rem AveYo: v3
if not defined {var} (set {reg}=& set "%~3="& exit /b) else set {reg}=& set "%~3=%{var}:*) =%"& set {var}=& exit /b
:dec_url brute url percent decoding by AveYo
set ".=%URL:!=}%"&setlocal enabledelayedexpansion& rem brute url percent decoding
set ".=!.:%%={!" &set ".=!.:{3A=:!" &set ".=!.:{2F=/!" &set ".=!.:{3F=?!" &set ".=!.:{23=#!" &set ".=!.:{5B=[!" &set ".=!.:{5D=]!"
set ".=!.:{40=@!"&set ".=!.:{21=}!" &set ".=!.:{24=$!" &set ".=!.:{26=&!" &set ".=!.:{27='!" &set ".=!.:{28=(!" &set ".=!.:{29=)!"
set ".=!.:{2A=*!"&set ".=!.:{2B=+!" &set ".=!.:{2C=,!" &set ".=!.:{3B=;!" &set ".=!.:{3D==!" &set ".=!.:{25=%%!"&set ".=!.:{20= !"
set ".=!.:{=%%!" &rem set ",=!.:%%=!" & if "!,!" neq "!.!" endlocal& set "URL=%.:}=!%" & call :dec_url
endlocal& set "URL=%.:}=!%" & exit /b
rem done
$@
[io.file]::WriteAllText("$DIR\OpenWebSearch.cmd", $OpenWebSearch)
## 8 done
$done = gp 'Registry::HKEY_Users\S-1-5-21*\Volatile*' Edge_Removal -ea 0; if ($done) {rp $done.PSPath Edge_Removal -force -ea 0}
if ((get-process -name 'explorer' -ea 0) -eq $null) {start explorer}
## 9 bonus enter into powershell console: firefox / edge / webview to install a browser / reinstall edge or webview after removal
${.} = [char]27; $firefox = "${.}[38;2;255;165;0m firefox"; $edge = "${.}[94m edge${.}[97m"; $webview = "${.}[94mwebview ${.}[97m"
write-host "`n${.}[40;32m EDGE REMOVED! ${.}[97m -GET-ANOTHER-BROWSER? ENTER:$firefox ${.}[97m -REINSTALL? ENTER:$edge / $webview"
## 0 ask to run script as admin
'@.replace("$@","'@").replace("@$","@'") -force -ea 0; $code='gp ''Registry::HKEY_Users\S-1-5-21*\Volatile*'' Edge_Removal -ea 0'
start powershell -args "-nop -noe -c & {iex(($code)[0].Edge_Removal)}" -verb runas
$_Press_Enter
#::

466
edgeremoval.ps1 Normal file
View File

@ -0,0 +1,466 @@
# Script Metadata
# Created by AveYo, source: https://raw.githubusercontent.com/AveYo/fox/main/Edge_Removal.bat
# Powershell Conversion and Refactor done by Chris Titus Tech
# Initial Configuration
$host.ui.RawUI.WindowTitle = 'Edge Removal - Chris Titus Tech 2023.05.10'
$remove_win32 = @("Microsoft Edge", "Microsoft Edge Update")
$remove_appx = @("MicrosoftEdge")
$skip = @() # Optional: @("DevTools")
$also_remove_webview = 0
if ($also_remove_webview -eq 1) {
$remove_win32 += "Microsoft EdgeWebView"
$remove_appx += "WebExperience", "Win32WebViewHost"
}
# Administrative Privileges Check
# Get the 'SetPrivilege' method from System.Diagnostics.Process type
$setPrivilegeMethod = [System.Diagnostics.Process].GetMethod('SetPrivilege', [System.Reflection.BindingFlags]::NonPublic -bor [System.Reflection.BindingFlags]::Static)
# List of privileges to set
$privileges = @(
'SeSecurityPrivilege',
'SeTakeOwnershipPrivilege',
'SeBackupPrivilege',
'SeRestorePrivilege'
)
# Invoke the method for each privilege
foreach ($privilege in $privileges) {
$setPrivilegeMethod.Invoke($null, @($privilege, 2))
}
# Edge Removal Procedures
# Define processes to shut down
$processesToShutdown = @(
'explorer', 'Widgets', 'widgetservice', 'msedgewebview2', 'MicrosoftEdge*', 'chredge',
'msedge', 'edge', 'msteams', 'msfamily', 'WebViewHost', 'Clipchamp'
)
# Kill explorer process
Stop-Process -Name "explorer" -Force -ErrorAction SilentlyContinue
# Kill the processes from the list
$processesToShutdown | ForEach-Object {
Stop-Process -Name $_ -Force -ErrorAction SilentlyContinue
}
# Set path for Edge executable
$MS = ($env:ProgramFiles, ${env:ProgramFiles(x86)})[[Environment]::Is64BitOperatingSystem] + '\Microsoft\Edge\Application\msedge.exe'
# Clean up certain registry entries
Remove-Item -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\msedge.exe" -Recurse -ErrorAction SilentlyContinue
Remove-Item -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ie_to_edge_stub.exe" -Recurse -ErrorAction SilentlyContinue
Remove-Item -Path 'Registry::HKEY_Users\S-1-5-21*\Software\Classes\microsoft-edge' -Recurse -ErrorAction SilentlyContinue
Remove-Item -Path 'Registry::HKEY_Users\S-1-5-21*\Software\Classes\MSEdgeHTM' -Recurse -ErrorAction SilentlyContinue
# Create new registry entries
New-Item -Path "HKLM:\SOFTWARE\Classes\microsoft-edge\shell\open\command" -Force -ErrorAction SilentlyContinue
Set-ItemProperty -Path "HKLM:\SOFTWARE\Classes\microsoft-edge\shell\open\command" -Name '(Default)' -Value "`"$MS`" --single-argument %%1" -Force -ErrorAction SilentlyContinue
New-Item -Path "HKLM:\SOFTWARE\Classes\MSEdgeHTM\shell\open\command" -Force -ErrorAction SilentlyContinue
Set-ItemProperty -Path "HKLM:\SOFTWARE\Classes\MSEdgeHTM\shell\open\command" -Name '(Default)' -Value "`"$MS`" --single-argument %%1" -Force -ErrorAction SilentlyContinue
# Remove certain registry properties
$registryPaths = @('HKLM:\SOFTWARE\Policies', 'HKLM:\SOFTWARE', 'HKLM:\SOFTWARE\WOW6432Node')
$edgeProperties = @('InstallDefault', 'Install{56EB18F8-B008-4CBD-B6D2-8C97FE7E9062}', 'Install{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}')
foreach ($path in $registryPaths) {
foreach ($prop in $edgeProperties) {
Remove-ItemProperty -Path "$path\Microsoft\EdgeUpdate" -Name $prop -Force -ErrorAction SilentlyContinue
}
}
$edgeupdate = 'Microsoft\EdgeUpdate\Clients\{56EB18F8-B008-4CBD-B6D2-8C97FE7E9062}'
$webvupdate = 'Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}'
$on_actions = @('on-os-upgrade', 'on-logon', 'on-logon-autolaunch', 'on-logon-startup-boost')
$registryBases = @('HKLM:\SOFTWARE', 'HKLM:\SOFTWARE\Wow6432Node')
foreach ($base in $registryBases) {
foreach ($launch in $on_actions) {
Remove-Item -Path "$base\$edgeupdate\Commands\$launch" -Force -ErrorAction SilentlyContinue
Remove-Item -Path "$base\$webvupdate\Commands\$launch" -Force -ErrorAction SilentlyContinue
}
}
# Clear specific registry keys
$registryPaths = @('HKCU:', 'HKLM:')
$nodes = @('', '\Wow6432Node')
foreach ($regPath in $registryPaths) {
foreach ($node in $nodes) {
foreach ($i in $remove_win32) {
Remove-ItemProperty -Path "$regPath\SOFTWARE${node}\Microsoft\Windows\CurrentVersion\Uninstall\$i" -Name 'NoRemove' -Force -ErrorAction SilentlyContinue
New-Item -Path "$regPath\SOFTWARE${node}\Microsoft\EdgeUpdateDev" -Force | Out-Null
Set-ItemProperty -Path "$regPath\SOFTWARE${node}\Microsoft\EdgeUpdateDev" -Name 'AllowUninstall' -Value 1 -Type Dword -Force
}
}
}
# Locate setup.exe and ie_to_edge_stub.exe
$foldersToSearch = @('LocalApplicationData', 'ProgramFilesX86', 'ProgramFiles') | ForEach-Object {
[Environment]::GetFolderPath($_)
}
$edges = @()
$bhoFiles = @()
foreach ($folder in $foldersToSearch) {
$bhoFiles += Get-ChildItem -Path "$folder\Microsoft\Edge*\ie_to_edge_stub.exe" -Recurse -ErrorAction SilentlyContinue
$edges += Get-ChildItem -Path "$folder\Microsoft\Edge*\setup.exe" -Recurse -ErrorAction SilentlyContinue |
Where-Object { $_.FullName -notlike '*EdgeWebView*' }
}
# Create directory and copy ie_to_edge_stub.exe to it
$destinationDir = "$env:SystemDrive\Scripts"
New-Item -Path $destinationDir -ItemType Directory -ErrorAction SilentlyContinue | Out-Null
foreach ($bhoFile in $bhoFiles) {
if (Test-Path $bhoFile) {
try {
Copy-Item -Path $bhoFile -Destination "$destinationDir\ie_to_edge_stub.exe" -Force
} catch { }
}
}
## Work on Appx Removals
# Retrieve AppX provisioned packages and all AppX packages
$provisioned = Get-AppxProvisionedPackage -Online
$appxpackage = Get-AppxPackage -AllUsers
# Initialize empty array for EndOfLife packages
$eol = @()
# Define user SIDs and retrieve them from the registry
$store = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore'
$users = @('S-1-5-18')
if (Test-Path $store) {
$users += (Get-ChildItem $store -ErrorAction SilentlyContinue | Where-Object { $_.PSChildName -like '*S-1-5-21*' }).PSChildName
}
# Process AppX packages for removal
foreach ($choice in $remove_appx) {
if ([string]::IsNullOrWhiteSpace($choice)) { continue }
# Process provisioned packages
$provisioned | Where-Object { $_.PackageName -like "*$choice*" } | ForEach-Object {
if ($skip -Contains $_.PackageName) { return }
$PackageName = $_.PackageName
$PackageFamilyName = ($appxpackage | Where-Object { $_.Name -eq $_.DisplayName }).PackageFamilyName
# Add registry entries
New-Item -Path "$store\Deprovisioned\$PackageFamilyName" -Force -ErrorAction SilentlyContinue | Out-Null
$users | ForEach-Object {
New-Item -Path "$store\EndOfLife\$_\$PackageName" -Force -ErrorAction SilentlyContinue | Out-Null
}
$eol += $PackageName
# Modify non-removable app policy and remove package
dism /online /set-nonremovableapppolicy /packagefamily:$PackageFamilyName /nonremovable:0 | Out-Null
Remove-AppxProvisionedPackage -PackageName $PackageName -Online -AllUsers | Out-Null
}
# Process all AppX packages
$appxpackage | Where-Object { $_.PackageFullName -like "*$choice*" } | ForEach-Object {
if ($skip -Contains $_.PackageFullName) { return }
$PackageFullName = $_.PackageFullName
# Add registry entries
New-Item -Path "$store\Deprovisioned\$_.PackageFamilyName" -Force -ErrorAction SilentlyContinue | Out-Null
$users | ForEach-Object {
New-Item -Path "$store\EndOfLife\$_\$PackageFullName" -Force -ErrorAction SilentlyContinue | Out-Null
}
$eol += $PackageFullName
# Modify non-removable app policy and remove package
dism /online /set-nonremovableapppolicy /packagefamily:$PackageFamilyName /nonremovable:0 | Out-Null
Remove-AppxPackage -Package $PackageFullName -AllUsers | Out-Null
}
}
## Run Edge setup uninstaller
foreach ($setup in $edges) {
if (Test-Path $setup) {
$target = if ($setup -like '*EdgeWebView*') { "--msedgewebview" } else { "--msedge" }
$removalArgs = "--uninstall $target --system-level --verbose-logging --force-uninstall"
Write-Host "$setup $removalArgs"
try {
Start-Process -FilePath $setup -ArgumentList $removalArgs -Wait
} catch {
# You may want to add logging or other error handling here.
}
while ((Get-Process -Name 'setup', 'MicrosoftEdge*' -ErrorAction SilentlyContinue).Path -like '*\Microsoft\Edge*') {
Start-Sleep -Seconds 3
}
}
}
## Cleanup
# Define necessary paths and variables
$edgePaths = $env:ProgramFiles, ${env:ProgramFiles(x86)}
$appDataPath = [Environment]::GetFolderPath('ApplicationData')
# Uninstall Microsoft Edge Update
foreach ($path in $edgePaths) {
$edgeUpdateExe = "$path\Microsoft\EdgeUpdate\MicrosoftEdgeUpdate.exe"
if (Test-Path $edgeUpdateExe) {
Write-Host $edgeUpdateExe /uninstall
Start-Process -FilePath $edgeUpdateExe -ArgumentList '/uninstall' -Wait
while ((Get-Process -Name 'setup','MicrosoftEdge*' -ErrorAction SilentlyContinue).Path -like '*\Microsoft\Edge*') {
Start-Sleep -Seconds 3
}
if ($also_remove_webview -eq 1) {
foreach ($regPath in 'HKCU:', 'HKLM:') {
foreach ($node in '', '\Wow6432Node') {
Remove-Item -Path "$regPath\SOFTWARE$node\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft Edge Update" -Recurse -Force -ErrorAction SilentlyContinue
}
}
Remove-Item -Path "$path\Microsoft\EdgeUpdate" -Recurse -Force -ErrorAction SilentlyContinue
Unregister-ScheduledTask -TaskName 'MicrosoftEdgeUpdate*' -Confirm:$false -ErrorAction SilentlyContinue
}
}
}
# Remove Edge shortcuts
Remove-Item -Path "$appDataPath\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\Tombstones\Microsoft Edge.lnk" -Force -ErrorAction SilentlyContinue
Remove-Item -Path "$appDataPath\Microsoft\Internet Explorer\Quick Launch\Microsoft Edge.lnk" -Force -ErrorAction SilentlyContinue
# Revert settings related to Microsoft Edge
foreach ($sid in $users) {
foreach ($packageName in $eol) {
Remove-Item -Path "$store\EndOfLife\$sid\$packageName" -Force -ErrorAction SilentlyContinue
}
}
# Set policies to prevent unsolicited reinstalls of Microsoft Edge
$registryPaths = @('HKLM:\SOFTWARE\Policies', 'HKLM:\SOFTWARE', 'HKLM:\SOFTWARE\WOW6432Node')
$edgeUpdatePolicies = @{
'InstallDefault' = 0;
'Install{56EB18F8-B008-4CBD-B6D2-8C97FE7E9062}' = 0;
'Install{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}' = 1;
'DoNotUpdateToEdgeWithChromium' = 1;
}
foreach ($path in $registryPaths) {
New-Item -Path "$path\Microsoft\EdgeUpdate" -Force -ErrorAction SilentlyContinue | Out-Null
foreach ($policy in $edgeUpdatePolicies.GetEnumerator()) {
Set-ItemProperty -Path "$path\Microsoft\EdgeUpdate" -Name $policy.Key -Value $policy.Value -Type Dword -Force
}
}
$edgeUpdateActions = @('on-os-upgrade', 'on-logon', 'on-logon-autolaunch', 'on-logon-startup-boost')
$edgeUpdateClients = @(
'Microsoft\EdgeUpdate\Clients\{56EB18F8-B008-4CBD-B6D2-8C97FE7E9062}',
'Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}'
)
foreach ($client in $edgeUpdateClients) {
foreach ($action in $edgeUpdateActions) {
foreach ($regBase in 'HKLM:\SOFTWARE', 'HKLM:\SOFTWARE\Wow6432Node') {
$regPath = "$regBase\$client\Commands\$action"
New-Item -Path $regPath -Force -ErrorAction SilentlyContinue | Out-Null
Set-ItemProperty -Path $regPath -Name 'CommandLine' -Value 'systray.exe' -Force
}
}
}
## Redirect Edge Shortcuts
# Define Microsoft Edge Paths
$MSEP = ($env:ProgramFiles, ${env:ProgramFiles(x86)})[[Environment]::Is64BitOperatingSystem] + '\Microsoft\Edge\Application'
$IFEO = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options'
$MIN = ('--headless', '--width 1 --height 1')[([environment]::OSVersion.Version.Build) -gt 25179]
$CMD = "$env:systemroot\system32\conhost.exe $MIN"
$DIR = "$env:SystemDrive\Scripts"
# Setup Microsoft Edge Registry Entries
New-Item -Path "HKLM:\SOFTWARE\Classes\microsoft-edge\shell\open\command" -Force | Out-Null
Set-ItemProperty -Path "HKLM:\SOFTWARE\Classes\microsoft-edge" -Name '(Default)' -Value 'URL:microsoft-edge' -Force
Set-ItemProperty -Path "HKLM:\SOFTWARE\Classes\microsoft-edge" -Name 'URL Protocol' -Value '' -Force
Set-ItemProperty -Path "HKLM:\SOFTWARE\Classes\microsoft-edge" -Name 'NoOpenWith' -Value '' -Force
Set-ItemProperty -Path "HKLM:\SOFTWARE\Classes\microsoft-edge\shell\open\command" -Name '(Default)' -Value "`"$DIR\ie_to_edge_stub.exe`" %1" -Force
# Setup MSEdgeHTM Registry Entries
New-Item -Path "HKLM:\SOFTWARE\Classes\MSEdgeHTM\shell\open\command" -Force | Out-Null
Set-ItemProperty -Path "HKLM:\SOFTWARE\Classes\MSEdgeHTM" -Name 'NoOpenWith' -Value '' -Force
Set-ItemProperty -Path "HKLM:\SOFTWARE\Classes\MSEdgeHTM\shell\open\command" -Name '(Default)' -Value "`"$DIR\ie_to_edge_stub.exe`" %1" -Force
# Setup Image File Execution Options for Edge and Edge WebView
$exeSettings = @(
@{ ExeName = 'ie_to_edge_stub.exe'; Debugger = "$CMD $DIR\OpenWebSearch.cmd"; FilterPath = "$DIR\ie_to_edge_stub.exe" },
@{ ExeName = 'msedge.exe'; Debugger = "$CMD $DIR\OpenWebSearch.cmd"; FilterPath = "$MSEP\msedge.exe" }
)
foreach ($setting in $exeSettings) {
New-Item -Path "$IFEO\$($setting.ExeName)\0" -Force | Out-Null
Set-ItemProperty -Path "$IFEO\$($setting.ExeName)" -Name 'UseFilter' -Value 1 -Type Dword -Force
Set-ItemProperty -Path "$IFEO\$($setting.ExeName)\0" -Name 'FilterFullPath' -Value $setting.FilterPath -Force
Set-ItemProperty -Path "$IFEO\$($setting.ExeName)\0" -Name 'Debugger' -Value $setting.Debugger -Force
}
# Write OpenWebSearch Batch Script
$OpenWebSearch = @'
@echo off
@title OpenWebSearch Redux
:: Minimize prompt
for /f %%E in ('"prompt $E$S & for %%e in (1) do rem"') do echo;%%E[2t >nul 2>&1
:: Get default browser from registry
call :get_registry_value "HKCU\SOFTWARE\Microsoft\Windows\Shell\Associations\UrlAssociations\https\UserChoice" ProgID DefaultBrowser
if not defined DefaultBrowser (
echo Error: Failed to get default browser from registry.
pause
exit /b
)
if /i "%DefaultBrowser%" equ "MSEdgeHTM" (
echo Error: Default browser is set to Edge! Change it or remove OpenWebSearch script.
pause
exit /b
)
:: Get browser command line
call :get_registry_value "HKCR\%DefaultBrowser%\shell\open\command" "" BrowserCommand
if not defined BrowserCommand (
echo Error: Failed to get browser command from registry.
pause
exit /b
)
set Browser=& for %%i in (%BrowserCommand%) do if not defined Browser set "Browser=%%~i"
:: Set fallback for Edge
call :get_registry_value "HKCR\MSEdgeMHT\shell\open\command" "" FallBack
set EdgeCommand=& for %%i in (%FallBack%) do if not defined EdgeCommand set "EdgeCommand=%%~i"
:: Parse command line arguments and check for redirect or noop conditions
set "URI=" & set "URL=" & set "NOOP=" & set "PassThrough=%EdgeCommand:msedge=edge%"
set "CommandLineArgs=%CMDCMDLINE:"=``% "
call :parse_arguments
if defined NOOP (
if not exist "%PassThrough%" (
echo Error: PassThrough path doesn't exist.
pause
exit /b
)
start "" "%PassThrough%" %ParsedArgs%
exit /b
)
:: Decode URL
call :decode_url
if not defined URL (
echo Error: Failed to decode URL.
pause
exit /b
)
:: Open URL in default browser
start "" "%Browser%" "%URL%"
exit
:: Functions
:get_registry_value
setlocal
set regQuery=reg query "%~1" /v %2 /z /se "," /f /e
if "%~2" equ "" set regQuery=reg query "%~1" /ve /z /se "," /f /e
for /f "skip=2 tokens=* delims=" %%V in ('%regQuery% 2^>nul') do set "result=%%V"
if defined result (set "result=%result:*) =%") else (set "%~3=")
endlocal & set "%~3=%result%"
exit /b
:decode_url
:: Brute URL percent decoding
setlocal enabledelayedexpansion
set "decoded=%URL:!=}%"
call :brute_decode
endlocal & set "URL=%decoded%"
exit /b
:parse_arguments
:: Remove specific substrings from arguments
set "CommandLineArgs=%CommandLineArgs:*ie_to_edge_stub.exe`` =%"
set "CommandLineArgs=%CommandLineArgs:*ie_to_edge_stub.exe =%"
set "CommandLineArgs=%CommandLineArgs:*msedge.exe`` =%"
set "CommandLineArgs=%CommandLineArgs:*msedge.exe =%"
:: Remove any trailing spaces
if "%CommandLineArgs:~-1%"==" " set "CommandLineArgs=%CommandLineArgs:~0,-1%"
:: Check if arguments are a redirect or URL
set "RedirectArg=%CommandLineArgs:microsoft-edge=%"
set "UrlArg=%CommandLineArgs:http=%"
set "ParsedArgs=%CommandLineArgs:``="%"
:: Set NOOP flag if no changes to arguments
if "%CommandLineArgs%" equ "%RedirectArg%" (set NOOP=1) else if "%CommandLineArgs%" equ "%UrlArg%" (set NOOP=1)
:: Extract URL if present
if not defined NOOP (
set "URL=%CommandLineArgs:*microsoft-edge=%"
set "URL=http%URL:*http=%"
if "%URL:~-2%"=="``" set "URL=%URL:~0,-2%"
)
exit /b
:brute_decode
:: Brute force URL percent decoding
set "decoded=%decoded:%%20= %"
set "decoded=%decoded:%%21=!!"
set "decoded=%decoded:%%22="%""
set "decoded=%decoded:%%23=#%"
set "decoded=%decoded:%%24=$%"
set "decoded=%decoded:%%25=%%%"
set "decoded=%decoded:%%26=&%"
set "decoded=%decoded:%%27='%"
set "decoded=%decoded:%%28=(%"
set "decoded=%decoded:%%29=)%"
set "decoded=%decoded:%%2A=*%"
set "decoded=%decoded:%%2B=+%"
set "decoded=%decoded:%%2C=,%"
set "decoded=%decoded:%%2D=-%"
set "decoded=%decoded:%%2E=.%"
set "decoded=%decoded:%%2F=/%"
:: ... Continue for other encodings ...
:: Correct any double percentage signs
set "decoded=%decoded:%%%%=%"
exit /b
'@
[io.file]::WriteAllText("$DIR\OpenWebSearch.cmd", $OpenWebSearch)
# Final Steps
# Retrieve the Edge_Removal property from the specified registry paths
$userRegPaths = Get-ChildItem -Path 'Registry::HKEY_Users\S-1-5-21*\Volatile*' -ErrorAction SilentlyContinue
$edgeRemovalPath = $userRegPaths | Get-ItemProperty -Name 'Edge_Removal' -ErrorAction SilentlyContinue
# If the Edge_Removal property exists, remove it
if ($edgeRemovalPath) {
Remove-ItemProperty -Path $edgeRemovalPath.PSPath -Name 'Edge_Removal' -Force -ErrorAction SilentlyContinue
}
# Ensure the explorer process is running
if (-not (Get-Process -Name 'explorer' -ErrorAction SilentlyContinue)) {
Start-Process 'explorer'
}

View File

@ -2,13 +2,19 @@ Function Get-WinUtilCheckBoxes {
<# <#
.DESCRIPTION .SYNOPSIS
Function is meant to find all checkboxes that are checked on the specific tab and input them into a script. Finds all checkboxes that are checked on the specific tab and inputs them into a script.
Outputed data will be the names of the checkboxes that were checked .PARAMETER Group
The group of checkboxes to check
.EXAMPLE .PARAMETER unCheck
Whether to uncheck the checkboxes that are checked. Defaults to true
.OUTPUTS
A List containing the name of each checked checkbox
.EXAMPLE
Get-WinUtilCheckBoxes "WPFInstall" Get-WinUtilCheckBoxes "WPFInstall"
#> #>
@ -32,18 +38,18 @@ Function Get-WinUtilCheckBoxes {
if ($uncheck -eq $true){ if ($uncheck -eq $true){
$CheckBox.value.ischecked = $false $CheckBox.value.ischecked = $false
} }
} }
} }
} }
if($Group -eq "WPFTweaks"){ if($Group -eq "WPFTweaks"){
$filter = Get-WinUtilVariables -Type Checkbox | Where-Object {$psitem -like "WPF*Tweaks*"} $filter = Get-WinUtilVariables -Type Checkbox | Where-Object {$psitem -like "WPF*Tweaks*"}
$CheckBoxes = $sync.GetEnumerator() | Where-Object {$psitem.Key -in $filter} $CheckBoxes = $sync.GetEnumerator() | Where-Object {$psitem.Key -in $filter}
Foreach ($CheckBox in $CheckBoxes){ Foreach ($CheckBox in $CheckBoxes){
if($CheckBox.value.ischecked -eq $true){ if($CheckBox.value.ischecked -eq $true){
$Output.Add($Checkbox.Name) $Output.Add($Checkbox.Name)
if ($uncheck -eq $true){ if ($uncheck -eq $true){
$CheckBox.value.ischecked = $false $CheckBox.value.ischecked = $false
} }
@ -57,7 +63,7 @@ Function Get-WinUtilCheckBoxes {
Foreach ($CheckBox in $CheckBoxes){ Foreach ($CheckBox in $CheckBoxes){
if($CheckBox.value.ischecked -eq $true){ if($CheckBox.value.ischecked -eq $true){
$Output.Add($Checkbox.Name) $Output.Add($Checkbox.Name)
if ($uncheck -eq $true){ if ($uncheck -eq $true){
$CheckBox.value.ischecked = $false $CheckBox.value.ischecked = $false
} }

View File

@ -1,9 +1,15 @@
function Get-WinUtilInstallerProcess { function Get-WinUtilInstallerProcess {
<# <#
.DESCRIPTION .SYNOPSIS
Meant to check for running processes and will return a boolean response Checks if the given process is running
.PARAMETER Process
The process to check
.OUTPUTS
Boolean - True if the process is running
#> #>
param($Process) param($Process)

View File

@ -1,14 +1,13 @@
function Get-WinUtilRegistry { function Get-WinUtilRegistry {
<# <#
.DESCRIPTION
This function will make all modifications to the registry
.EXAMPLE .SYNOPSIS
Gets the value of a registry key
Set-WinUtilRegistry -Name "PublishUserActivities" -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System" -Type "DWord" -Value "0" .EXAMPLE
Get-WinUtilRegistry -Name "PublishUserActivities" -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System" -Type "DWord" -Value "0"
#>
#>
param ( param (
$Name, $Name,
$Path, $Path,
@ -16,7 +15,7 @@ function Get-WinUtilRegistry {
$Value $Value
) )
Try{ Try{
$syscheckvalue = Get-ItemPropertyValue -Path $Path -Value $Value # Return Value $syscheckvalue = Get-ItemPropertyValue -Path $Path -Value $Value # Return Value
} }

View File

@ -1,12 +1,15 @@
Function Get-WinUtilToggleStatus { Function Get-WinUtilToggleStatus {
<# <#
.DESCRIPTION
Meant to pull the registry keys for a toggle switch and returns true or false
True should mean status is enabled .SYNOPSIS
False should mean status is disabled Pulls the registry keys for the given toggle switch and checks whether the toggle should be checked or unchecked
.PARAMETER ToggleSwitch
The name of the toggle to check
.OUTPUTS
Boolean to set the toggle's status to
#> #>
Param($ToggleSwitch) Param($ToggleSwitch)
@ -15,7 +18,7 @@ Function Get-WinUtilToggleStatus {
$system = (Get-ItemProperty -path 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize').SystemUsesLightTheme $system = (Get-ItemProperty -path 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize').SystemUsesLightTheme
if($app -eq 0 -and $system -eq 0){ if($app -eq 0 -and $system -eq 0){
return $true return $true
} }
else{ else{
return $false return $false
} }
@ -24,7 +27,7 @@ Function Get-WinUtilToggleStatus {
$bingsearch = (Get-ItemProperty -path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Search').BingSearchEnabled $bingsearch = (Get-ItemProperty -path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Search').BingSearchEnabled
if($bingsearch -eq 0){ if($bingsearch -eq 0){
return $false return $false
} }
else{ else{
return $true return $true
} }

View File

@ -1,10 +1,13 @@
function Get-WinUtilVariables { function Get-WinUtilVariables {
<# <#
.DESCRIPTION .SYNOPSIS
placeholder Gets every form object of the provided type
.OUTPUTS
List containing every object that matches the provided type
#> #>
param ( param (
[Parameter()] [Parameter()]
@ -12,7 +15,7 @@ function Get-WinUtilVariables {
[string]$Type [string]$Type
) )
$keys = $sync.keys | Where-Object {$psitem -like "WPF*"} $keys = $sync.keys | Where-Object {$psitem -like "WPF*"}
if($type){ if($type){
$output = $keys | ForEach-Object { $output = $keys | ForEach-Object {
@ -23,7 +26,7 @@ function Get-WinUtilVariables {
} }
Catch{<#I am here so errors don't get outputted for a couple variables that don't have the .GetType() attribute#>} Catch{<#I am here so errors don't get outputted for a couple variables that don't have the .GetType() attribute#>}
} }
return $output return $output
} }
return $keys return $keys
} }

View File

@ -1,30 +1,29 @@
function Install-WinUtilChoco { function Install-WinUtilChoco {
<# <#
.DESCRIPTION .SYNOPSIS
Function is meant to ensure Choco is installed Installs Chocolatey if it is not already installed
#> #>
try{ try {
Write-Host "Checking if Chocolatey is Installed..." Write-Host "Checking if Chocolatey is Installed..."
if((Test-WinUtilPackageManager -choco)){ if((Test-WinUtilPackageManager -choco)){
Write-Host "Chocolatey Already Installed" Write-Host "Chocolatey Already Installed"
return return
} }
Write-Host "Seems Chocolatey is not installed, installing now?" Write-Host "Seems Chocolatey is not installed, installing now"
#Let user decide if he wants to install Chocolatey Set-ExecutionPolicy Bypass -Scope Process -Force; Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) -ErrorAction Stop
$confirmation = Read-Host "Are you Sure You Want To Proceed:(y/n)" powershell choco feature enable -n allowGlobalConfirmation
if ($confirmation -eq 'y') {
Set-ExecutionPolicy Bypass -Scope Process -Force; Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) -ErrorAction Stop
powershell choco feature enable -n allowGlobalConfirmation
}
} }
Catch{ Catch {
throw [ChocoFailedInstall]::new('Failed to install') Write-Host "==========================================="
Write-Host "-- Chocolatey failed to install ---"
Write-Host "==========================================="
} }
} }

View File

@ -1,12 +1,19 @@
Function Install-WinUtilProgramWinget { Function Install-WinUtilProgramWinget {
<# <#
.DESCRIPTION
This will install programs via Winget using a new powershell.exe instance to prevent the GUI from locking up.
Note the triple quotes are required any time you need a " in a normal script block. .SYNOPSIS
Manages the provided programs using Winget
.PARAMETER ProgramsToInstall
A list of programs to manage
.PARAMETER manage
The action to perform on the programs, can be either 'Installing' or 'Uninstalling'
.NOTES
The triple quotes are required any time you need a " in a normal script block.
#> #>
param( param(
@ -20,7 +27,7 @@ Function Install-WinUtilProgramWinget {
Write-Progress -Activity "$manage Applications" -Status "Starting" -PercentComplete 0 Write-Progress -Activity "$manage Applications" -Status "Starting" -PercentComplete 0
Foreach ($Program in $($ProgramsToInstall -split ",")){ Foreach ($Program in $($ProgramsToInstall -split ",")){
Write-Progress -Activity "$manage Applications" -Status "$manage $Program $($x + 1) of $count" -PercentComplete $($x/$count*100) Write-Progress -Activity "$manage Applications" -Status "$manage $Program $($x + 1) of $count" -PercentComplete $($x/$count*100)
if($manage -eq "Installing"){ if($manage -eq "Installing"){
Start-Process -FilePath winget -ArgumentList "install -e --accept-source-agreements --accept-package-agreements --silent $Program" -NoNewWindow -Wait Start-Process -FilePath winget -ArgumentList "install -e --accept-source-agreements --accept-package-agreements --silent $Program" -NoNewWindow -Wait
@ -28,7 +35,7 @@ Function Install-WinUtilProgramWinget {
if($manage -eq "Uninstalling"){ if($manage -eq "Uninstalling"){
Start-Process -FilePath winget -ArgumentList "uninstall -e --purge --force --silent $Program" -NoNewWindow -Wait Start-Process -FilePath winget -ArgumentList "uninstall -e --purge --force --silent $Program" -NoNewWindow -Wait
} }
$X++ $X++
} }

View File

@ -1,29 +1,29 @@
function Get-LatestHash { function Get-LatestHash {
$shaUrl = ((Invoke-WebRequest $apiLatestUrl -UseBasicParsing | ConvertFrom-Json).assets | Where-Object { $_.name -match '^Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.txt$' }).browser_download_url $shaUrl = ((Invoke-WebRequest $apiLatestUrl -UseBasicParsing | ConvertFrom-Json).assets | Where-Object { $_.name -match '^Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.txt$' }).browser_download_url
$shaFile = Join-Path -Path $tempFolder -ChildPath 'Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.txt' $shaFile = Join-Path -Path $tempFolder -ChildPath 'Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.txt'
$WebClient.DownloadFile($shaUrl, $shaFile) $WebClient.DownloadFile($shaUrl, $shaFile)
Get-Content $shaFile Get-Content $shaFile
} }
function Install-WinUtilWinget { function Install-WinUtilWinget {
<# <#
.DESCRIPTION .SYNOPSIS
Function is meant to ensure winget is installed Installs Winget if it is not already installed
#> #>
Try{ Try{
Write-Host "Checking if Winget is Installed..." Write-Host "Checking if Winget is Installed..."
if (Test-WinUtilPackageManager -winget) { if (Test-WinUtilPackageManager -winget) {
#Checks if winget executable exists and if the Windows Version is 1809 or higher # Checks if winget executable exists and if the Windows Version is 1809 or higher
Write-Host "Winget Already Installed" Write-Host "Winget Already Installed"
return return
} }
#Gets the computer's information # Gets the computer's information
if ($null -eq $sync.ComputerInfo){ if ($null -eq $sync.ComputerInfo){
$ComputerInfo = Get-ComputerInfo -ErrorAction Stop $ComputerInfo = Get-ComputerInfo -ErrorAction Stop
} }
@ -32,14 +32,14 @@ function Install-WinUtilWinget {
} }
if (($ComputerInfo.WindowsVersion) -lt "1809") { if (($ComputerInfo.WindowsVersion) -lt "1809") {
#Checks if Windows Version is too old for winget # Checks if Windows Version is too old for winget
Write-Host "Winget is not supported on this version of Windows (Pre-1809)" Write-Host "Winget is not supported on this version of Windows (Pre-1809)"
return return
} }
Write-Host "Running Alternative Installer and Direct Installing" Write-Host "Running Alternative Installer and Direct Installing"
Start-Process -Verb runas -FilePath powershell.exe -ArgumentList "irm https://raw.githubusercontent.com/ChrisTitusTech/winutil/main/winget.ps1 | iex" Start-Process -Verb runas -FilePath powershell.exe -ArgumentList "choco install winget"
Write-Host "Winget Installed" Write-Host "Winget Installed"
} }
Catch{ Catch{

View File

@ -1,9 +1,12 @@
function Invoke-WinUtilBingSearch { function Invoke-WinUtilBingSearch {
<# <#
.DESCRIPTION .SYNOPSIS
Sets Bing Search on or off Disables/Enables Bing Search
.PARAMETER Enabled
Indicates whether to enable or disable Bing Search
#> #>
Param($Enabled) Param($Enabled)
Try{ Try{

View File

@ -2,13 +2,10 @@ Function Invoke-WinUtilCurrentSystem {
<# <#
.DESCRIPTION .SYNOPSIS
Function is meant to read existing system registry and check according configuration. Checks to see what tweaks have already been applied and what programs are installed, and checks the according boxes
Example: Is telemetry enabled? check the box.
.EXAMPLE
.EXAMPLE
Get-WinUtilCheckBoxes "WPFInstall" Get-WinUtilCheckBoxes "WPFInstall"
#> #>
@ -46,19 +43,19 @@ Function Invoke-WinUtilCurrentSystem {
$registryKeys = $sync.configs.tweaks.$Config.registry $registryKeys = $sync.configs.tweaks.$Config.registry
$scheduledtaskKeys = $sync.configs.tweaks.$Config.scheduledtask $scheduledtaskKeys = $sync.configs.tweaks.$Config.scheduledtask
$serviceKeys = $sync.configs.tweaks.$Config.service $serviceKeys = $sync.configs.tweaks.$Config.service
if($registryKeys -or $scheduledtaskKeys -or $serviceKeys){ if($registryKeys -or $scheduledtaskKeys -or $serviceKeys){
$Values = @() $Values = @()
Foreach ($tweaks in $registryKeys){ Foreach ($tweaks in $registryKeys){
Foreach($tweak in $tweaks){ Foreach($tweak in $tweaks){
if(test-path $tweak.Path){ if(test-path $tweak.Path){
$actualValue = Get-ItemProperty -Name $tweak.Name -Path $tweak.Path -ErrorAction SilentlyContinue | Select-Object -ExpandProperty $($tweak.Name) $actualValue = Get-ItemProperty -Name $tweak.Name -Path $tweak.Path -ErrorAction SilentlyContinue | Select-Object -ExpandProperty $($tweak.Name)
$expectedValue = $tweak.Value $expectedValue = $tweak.Value
if ($expectedValue -notlike $actualValue){ if ($expectedValue -notlike $actualValue){
$values += $False $values += $False
} }
} }
} }
@ -67,7 +64,7 @@ Function Invoke-WinUtilCurrentSystem {
Foreach ($tweaks in $scheduledtaskKeys){ Foreach ($tweaks in $scheduledtaskKeys){
Foreach($tweak in $tweaks){ Foreach($tweak in $tweaks){
$task = $ScheduledTasks | Where-Object {$($psitem.TaskPath + $psitem.TaskName) -like "\$($tweak.name)"} $task = $ScheduledTasks | Where-Object {$($psitem.TaskPath + $psitem.TaskName) -like "\$($tweak.name)"}
if($task){ if($task){
$actualValue = $task.State $actualValue = $task.State
$expectedValue = $tweak.State $expectedValue = $tweak.State
@ -81,7 +78,7 @@ Function Invoke-WinUtilCurrentSystem {
Foreach ($tweaks in $serviceKeys){ Foreach ($tweaks in $serviceKeys){
Foreach($tweak in $tweaks){ Foreach($tweak in $tweaks){
$Service = Get-Service -Name $tweak.Name $Service = Get-Service -Name $tweak.Name
if($Service){ if($Service){
$actualValue = $Service.StartType $actualValue = $Service.StartType
$expectedValue = $tweak.StartupType $expectedValue = $tweak.StartupType

View File

@ -1,9 +1,12 @@
Function Invoke-WinUtilDarkMode { Function Invoke-WinUtilDarkMode {
<# <#
.DESCRIPTION .SYNOPSIS
Sets Dark Mode on or off Enables/Disables Dark Mode
.PARAMETER DarkMoveEnabled
Indicates the current dark mode state
#> #>
Param($DarkMoveEnabled) Param($DarkMoveEnabled)
Try{ Try{
@ -15,7 +18,7 @@ Function Invoke-WinUtilDarkMode {
Write-Host "Disabling Dark Mode" Write-Host "Disabling Dark Mode"
$DarkMoveValue = 1 $DarkMoveValue = 1
} }
$Theme = "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize" $Theme = "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize"
Set-ItemProperty -Path $Theme -Name AppsUseLightTheme -Value $DarkMoveValue Set-ItemProperty -Path $Theme -Name AppsUseLightTheme -Value $DarkMoveValue
Set-ItemProperty -Path $Theme -Name SystemUsesLightTheme -Value $DarkMoveValue Set-ItemProperty -Path $Theme -Name SystemUsesLightTheme -Value $DarkMoveValue

View File

@ -1,9 +1,9 @@
function Invoke-WinUtilFeatureInstall { function Invoke-WinUtilFeatureInstall {
<# <#
.DESCRIPTION .SYNOPSIS
This function converts all the values from the tweaks.json and routes them to the appropriate function Converts all the values from the tweaks.json and routes them to the appropriate function
#> #>
param( param(
@ -13,7 +13,7 @@ function Invoke-WinUtilFeatureInstall {
$CheckBox | ForEach-Object { $CheckBox | ForEach-Object {
if($sync.configs.feature.$psitem.feature){ if($sync.configs.feature.$psitem.feature){
Foreach( $feature in $sync.configs.feature.$psitem.feature ){ Foreach( $feature in $sync.configs.feature.$psitem.feature ){
Try{ Try{
Write-Host "Installing $feature" Write-Host "Installing $feature"
Enable-WindowsOptionalFeature -Online -FeatureName $feature -All -NoRestart Enable-WindowsOptionalFeature -Online -FeatureName $feature -All -NoRestart
} }
@ -24,10 +24,10 @@ function Invoke-WinUtilFeatureInstall {
else{ else{
Write-Warning "Unable to Install $feature due to unhandled exception" Write-Warning "Unable to Install $feature due to unhandled exception"
Write-Warning $psitem.Exception.StackTrace Write-Warning $psitem.Exception.StackTrace
} }
} }
} }
} }
if($sync.configs.feature.$psitem.InvokeScript){ if($sync.configs.feature.$psitem.InvokeScript){
Foreach( $script in $sync.configs.feature.$psitem.InvokeScript ){ Foreach( $script in $sync.configs.feature.$psitem.InvokeScript ){
@ -44,10 +44,10 @@ function Invoke-WinUtilFeatureInstall {
else{ else{
Write-Warning "Unable to Install $feature due to unhandled exception" Write-Warning "Unable to Install $feature due to unhandled exception"
Write-Warning $psitem.Exception.StackTrace Write-Warning $psitem.Exception.StackTrace
} }
} }
} }
} }
} }
} }

View File

@ -1,14 +1,19 @@
function Invoke-WinUtilScript { function Invoke-WinUtilScript {
<# <#
.DESCRIPTION
This function will run a separate powershell script. Meant for things that can't be handled with the other functions
.EXAMPLE .SYNOPSIS
Invokes the provided scriptblock. Intended for things that can't be handled with the other functions.
.PARAMETER Name
The name of the scriptblock being invoked
.PARAMETER scriptblock
The scriptblock to be invoked
.EXAMPLE
$Scriptblock = [scriptblock]::Create({"Write-output 'Hello World'"}) $Scriptblock = [scriptblock]::Create({"Write-output 'Hello World'"})
Invoke-WinUtilScript -ScriptBlock $scriptblock -Name "Hello World" Invoke-WinUtilScript -ScriptBlock $scriptblock -Name "Hello World"
#> #>
param ( param (
$Name, $Name,
@ -38,7 +43,7 @@ function Invoke-WinUtilScript {
Catch { Catch {
# Generic catch block to handle any other type of exception # Generic catch block to handle any other type of exception
Write-Warning "Unable to run script for $name due to unhandled exception" Write-Warning "Unable to run script for $name due to unhandled exception"
Write-Warning $psitem.Exception.StackTrace Write-Warning $psitem.Exception.StackTrace
} }
} }

View File

@ -1,9 +1,15 @@
function Invoke-WinUtilTweaks { function Invoke-WinUtilTweaks {
<# <#
.DESCRIPTION .SYNOPSIS
This function converts all the values from the tweaks.json and routes them to the appropriate function Invokes the function associated with each provided checkbox
.PARAMETER CheckBox
The checkbox to invoke
.PARAMETER undo
Indicates whether to undo the operation contained in the checkbox
#> #>
param( param(
@ -18,7 +24,7 @@ function Invoke-WinUtilTweaks {
ScriptType = "UndoScript" ScriptType = "UndoScript"
} }
} }
Else{ Else{
$Values = @{ $Values = @{
Registry = "Value" Registry = "Value"

View File

@ -1,13 +1,15 @@
function Remove-WinUtilAPPX { function Remove-WinUtilAPPX {
<# <#
.DESCRIPTION
This function will remove any of the provided APPX names
.EXAMPLE .SYNOPSIS
Removes all APPX packages that match the given name
.PARAMETER Name
The name of the APPX package to remove
.EXAMPLE
Remove-WinUtilAPPX -Name "Microsoft.Microsoft3DViewer" Remove-WinUtilAPPX -Name "Microsoft.Microsoft3DViewer"
#> #>
param ( param (
$Name $Name
@ -24,11 +26,11 @@ function Remove-WinUtilAPPX {
} }
Else{ Else{
Write-Warning "Unable to uninstall $name due to unhandled exception" Write-Warning "Unable to uninstall $name due to unhandled exception"
Write-Warning $psitem.Exception.StackTrace Write-Warning $psitem.Exception.StackTrace
} }
} }
Catch{ Catch{
Write-Warning "Unable to uninstall $name due to unhandled exception" Write-Warning "Unable to uninstall $name due to unhandled exception"
Write-Warning $psitem.Exception.StackTrace Write-Warning $psitem.Exception.StackTrace
} }
} }

View File

@ -1,13 +1,15 @@
function Set-WinUtilDNS { function Set-WinUtilDNS {
<# <#
.DESCRIPTION
This function will set the DNS of all interfaces that are in the "Up" state. It will lookup the values from the DNS.Json file
.EXAMPLE .SYNOPSIS
Sets the DNS of all interfaces that are in the "Up" state. It will lookup the values from the DNS.Json file
.PARAMETER DNSProvider
The DNS provider to set the DNS server to
.EXAMPLE
Set-WinUtilDNS -DNSProvider "google" Set-WinUtilDNS -DNSProvider "google"
#> #>
param($DNSProvider) param($DNSProvider)
if($DNSProvider -eq "Default"){return} if($DNSProvider -eq "Default"){return}
@ -27,6 +29,6 @@ function Set-WinUtilDNS {
} }
Catch{ Catch{
Write-Warning "Unable to set DNS Provider due to an unhandled exception" Write-Warning "Unable to set DNS Provider due to an unhandled exception"
Write-Warning $psitem.Exception.StackTrace Write-Warning $psitem.Exception.StackTrace
} }
} }

View File

@ -1,14 +1,25 @@
function Set-WinUtilRegistry { function Set-WinUtilRegistry {
<# <#
.DESCRIPTION
This function will make all modifications to the registry
.EXAMPLE .SYNOPSIS
Modifies the registry based on the given inputs
.PARAMETER Name
The name of the key to modify
.PARAMETER Path
The path to the key
.PARAMETER Type
The type of value to set the key to
.PARAMETER Value
The value to set the key to
.EXAMPLE
Set-WinUtilRegistry -Name "PublishUserActivities" -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System" -Type "DWord" -Value "0" Set-WinUtilRegistry -Name "PublishUserActivities" -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System" -Type "DWord" -Value "0"
#> #>
param ( param (
$Name, $Name,
$Path, $Path,
@ -16,7 +27,7 @@ function Set-WinUtilRegistry {
$Value $Value
) )
Try{ Try{
if(!(Test-Path 'HKU:\')){New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS} if(!(Test-Path 'HKU:\')){New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS}
If (!(Test-Path $Path)) { If (!(Test-Path $Path)) {

View File

@ -1,10 +1,10 @@
function Set-WinUtilRestorePoint { function Set-WinUtilRestorePoint {
<# <#
.DESCRIPTION
This function will make a Restore Point
#> .SYNOPSIS
Creates a Restore Point
#>
# Check if the user has administrative privileges # Check if the user has administrative privileges
if (-Not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { if (-Not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
@ -24,7 +24,7 @@ function Set-WinUtilRestorePoint {
$exists = Get-ItemProperty -path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRestore" -name "SystemRestorePointCreationFrequency" -ErrorAction SilentlyContinue $exists = Get-ItemProperty -path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRestore" -name "SystemRestorePointCreationFrequency" -ErrorAction SilentlyContinue
if($null -eq $exists){ if($null -eq $exists){
write-host 'Changing system to allow multiple restore points per day' write-host 'Changing system to allow multiple restore points per day'
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRestore" -Name "SystemRestorePointCreationFrequency" -Value "0" -Type DWord -Force -ErrorAction Stop | Out-Null Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRestore" -Name "SystemRestorePointCreationFrequency" -Value "0" -Type DWord -Force -ErrorAction Stop | Out-Null
} }
# Get all the restore points for the current day # Get all the restore points for the current day
@ -33,7 +33,7 @@ function Set-WinUtilRestorePoint {
# Check if there is already a restore point created today # Check if there is already a restore point created today
if ($existingRestorePoints.Count -eq 0) { if ($existingRestorePoints.Count -eq 0) {
$description = "System Restore Point created by WinUtil" $description = "System Restore Point created by WinUtil"
Checkpoint-Computer -Description $description -RestorePointType "MODIFY_SETTINGS" Checkpoint-Computer -Description $description -RestorePointType "MODIFY_SETTINGS"
Write-Host -ForegroundColor Green "System Restore Point Created Successfully" Write-Host -ForegroundColor Green "System Restore Point Created Successfully"
} }

View File

@ -1,13 +1,18 @@
function Set-WinUtilScheduledTask { function Set-WinUtilScheduledTask {
<# <#
.DESCRIPTION
This function will enable/disable the provided Scheduled Task
.EXAMPLE .SYNOPSIS
Enables/Disables the provided Scheduled Task
.PARAMETER Name
The path to the Scheduled Task
.PARAMETER State
The State to set the Task to
.EXAMPLE
Set-WinUtilScheduledTask -Name "Microsoft\Windows\Application Experience\Microsoft Compatibility Appraiser" -State "Disabled" Set-WinUtilScheduledTask -Name "Microsoft\Windows\Application Experience\Microsoft Compatibility Appraiser" -State "Disabled"
#> #>
param ( param (
$Name, $Name,
@ -35,6 +40,6 @@ function Set-WinUtilScheduledTask {
} }
Catch{ Catch{
Write-Warning "Unable to run script for $name due to unhandled exception" Write-Warning "Unable to run script for $name due to unhandled exception"
Write-Warning $psitem.Exception.StackTrace Write-Warning $psitem.Exception.StackTrace
} }
} }

View File

@ -1,24 +1,29 @@
Function Set-WinUtilService { Function Set-WinUtilService {
<# <#
.DESCRIPTION
This function will change the startup type of services and start/stop them as needed
.EXAMPLE .SYNOPSIS
Changes the startup type of the given service
.PARAMETER Name
The name of the service to modify
.PARAMETER StartupType
The startup type to set the service to
.EXAMPLE
Set-WinUtilService -Name "HomeGroupListener" -StartupType "Manual" Set-WinUtilService -Name "HomeGroupListener" -StartupType "Manual"
#> #>
param ( param (
$Name, $Name,
$StartupType $StartupType
) )
try { try {
Write-Host "Setting Service $Name to $StartupType" Write-Host "Setting Service $Name to $StartupType"
# Check if the service exists # Check if the service exists
$service = Get-Service -Name $Name -ErrorAction Stop $service = Get-Service -Name $Name -ErrorAction Stop
# Service exists, proceed with changing properties # Service exists, proceed with changing properties
$service | Set-Service -StartupType $StartupType -ErrorAction Stop $service | Set-Service -StartupType $StartupType -ErrorAction Stop
} }
@ -29,5 +34,5 @@ Function Set-WinUtilService {
Write-Warning "Unable to set $Name due to unhandled exception" Write-Warning "Unable to set $Name due to unhandled exception"
Write-Warning $_.Exception.Message Write-Warning $_.Exception.Message
} }
} }

View File

@ -1,13 +1,18 @@
function Set-WinUtilUITheme { function Set-WinUtilUITheme {
<# <#
.DESCRIPTION
This function will set theme to the XAML file
.EXAMPLE .SYNOPSIS
Sets the theme of the XAML file
.PARAMETER inputXML
A string representing the XAML object to modify
.PARAMETER themeName
The name of the theme to set the XAML to. Defaults to 'matrix'
.EXAMPLE
Set-WinUtilUITheme -inputXAML $inputXAML Set-WinUtilUITheme -inputXAML $inputXAML
#> #>
param param
( (
@ -41,7 +46,7 @@ function Set-WinUtilUITheme {
} }
catch { catch {
Write-Warning "Unable to apply theme" Write-Warning "Unable to apply theme"
Write-Warning $psitem.Exception.StackTrace Write-Warning $psitem.Exception.StackTrace
} }
return $inputXML; return $inputXML;

View File

@ -1,9 +1,15 @@
function Test-WinUtilPackageManager { function Test-WinUtilPackageManager {
<# <#
.DESCRIPTION .SYNOPSIS
Checks for Winget or Choco depending on the parameter Checks if Winget and/or Choco are installed
.PARAMETER winget
Check if Winget is installed
.PARAMETER choco
Check if Chocolatey is installed
#> #>
Param( Param(

View File

@ -1,10 +1,10 @@
Function Update-WinUtilProgramWinget { Function Update-WinUtilProgramWinget {
<# <#
.DESCRIPTION .SYNOPSIS
This will update programs via Winget using a new powershell.exe instance to prevent the GUI from locking up. This will update all programs using Winget
#> #>
[ScriptBlock]$wingetinstall = { [ScriptBlock]$wingetinstall = {

View File

@ -1,17 +1,18 @@
function Invoke-WPFButton { function Invoke-WPFButton {
<# <#
.DESCRIPTION
Meant to make creating buttons easier. There is a section below in the gui that will assign this function to every button.
This way you can dictate what each button does from this function.
Input will be the name of the button that is clicked.
#>
Param ([string]$Button)
#Use this to get the name of the button .SYNOPSIS
Invokes the function associated with the clicked button
.PARAMETER Button
The name of the button that was clicked
#>
Param ([string]$Button)
# Use this to get the name of the button
#[System.Windows.MessageBox]::Show("$Button","Chris Titus Tech's Windows Utility","OK","Info") #[System.Windows.MessageBox]::Show("$Button","Chris Titus Tech's Windows Utility","OK","Info")
Switch -Wildcard ($Button){ Switch -Wildcard ($Button){

View File

@ -1,9 +1,12 @@
function Invoke-WPFControlPanel { function Invoke-WPFControlPanel {
<# <#
.DESCRIPTION .SYNOPSIS
Simple Switch for legacy windows Opens the requested legacy panel
.PARAMETER Panel
The panel to open
#> #>
param($Panel) param($Panel)

View File

@ -1,9 +1,9 @@
function Invoke-WPFFeatureInstall { function Invoke-WPFFeatureInstall {
<# <#
.DESCRIPTION .SYNOPSIS
GUI Function to install Windows Features Installs selected Windows Features
#> #>
if($sync.ProcessRunning){ if($sync.ProcessRunning){
@ -26,12 +26,12 @@ function Invoke-WPFFeatureInstall {
Write-Host "--- Features are Installed ---" Write-Host "--- Features are Installed ---"
Write-Host "--- A Reboot may be required ---" Write-Host "--- A Reboot may be required ---"
Write-Host "===================================" Write-Host "==================================="
$ButtonType = [System.Windows.MessageBoxButton]::OK $ButtonType = [System.Windows.MessageBoxButton]::OK
$MessageboxTitle = "All features are now installed " $MessageboxTitle = "All features are now installed "
$Messageboxbody = ("Done") $Messageboxbody = ("Done")
$MessageIcon = [System.Windows.MessageBoxImage]::Information $MessageIcon = [System.Windows.MessageBoxImage]::Information
[System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon) [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)
} }
} }

View File

@ -1,14 +1,18 @@
function Invoke-WPFFixesNetwork { function Invoke-WPFFixesNetwork {
<# <#
.DESCRIPTION .SYNOPSIS
PlaceHolder Resets various network configurations
#> #>
Write-Host "Resetting Network with netsh" Write-Host "Resetting Network with netsh"
# Reset WinSock catalog to a clean state
Start-Process -NoNewWindow -FilePath "netsh" -ArgumentList "winsock", "reset" Start-Process -NoNewWindow -FilePath "netsh" -ArgumentList "winsock", "reset"
# Resets WinHTTP proxy setting to DIRECT
Start-Process -NoNewWindow -FilePath "netsh" -ArgumentList "winhttp", "reset", "proxy" Start-Process -NoNewWindow -FilePath "netsh" -ArgumentList "winhttp", "reset", "proxy"
# Removes all user configured IP settings
Start-Process -NoNewWindow -FilePath "netsh" -ArgumentList "int", "ip", "reset" Start-Process -NoNewWindow -FilePath "netsh" -ArgumentList "int", "ip", "reset"
Write-Host "Process complete. Please reboot your computer." Write-Host "Process complete. Please reboot your computer."
@ -19,7 +23,7 @@ function Invoke-WPFFixesNetwork {
$MessageIcon = [System.Windows.MessageBoxImage]::Information $MessageIcon = [System.Windows.MessageBoxImage]::Information
[System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon) [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)
Write-Host "=================================" Write-Host "=========================================="
Write-Host "-- Reset Network Configuration --" Write-Host "-- Network Configuration has been Reset --"
Write-Host "=================================" Write-Host "=========================================="
} }

View File

@ -1,13 +1,13 @@
function Invoke-WPFFixesUpdate { function Invoke-WPFFixesUpdate {
<# <#
.DESCRIPTION .SYNOPSIS
PlaceHolder Performs various tasks in an attempt to repair Windows Update
#> #>
### Reset Windows Update Script - reregister dlls, services, and remove registry entries. # Reset Windows Update Script - reregister dlls, services, and remove registry entries
Write-Host "1. Stopping Windows Update Services..." Write-Host "1. Stopping Windows Update Services..."
Stop-Service -Name BITS Stop-Service -Name BITS
Stop-Service -Name wuauserv Stop-Service -Name wuauserv
@ -83,7 +83,7 @@ Write-Host "12) Forcing discovery..."
$MessageIcon = [System.Windows.MessageBoxImage]::Information $MessageIcon = [System.Windows.MessageBoxImage]::Information
[System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon) [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)
Write-Host "=================================" Write-Host "==============================================="
Write-Host "-- Reset ALL Updates to Factory -" Write-Host "-- Reset All Windows Update Settings to Stock -"
Write-Host "=================================" Write-Host "==============================================="
} }

View File

@ -1,9 +1,9 @@
Function Invoke-WPFFormVariables { Function Invoke-WPFFormVariables {
<# <#
.DESCRIPTION .SYNOPSIS
PlaceHolder Prints the logo
#> #>
#If ($global:ReadmeDisplay -ne $true) { Write-Host "If you need to reference this display again, run Get-FormVariables" -ForegroundColor Yellow; $global:ReadmeDisplay = $true } #If ($global:ReadmeDisplay -ne $true) { Write-Host "If you need to reference this display again, run Get-FormVariables" -ForegroundColor Yellow; $global:ReadmeDisplay = $true }

View File

@ -1,8 +1,11 @@
function Invoke-WPFGetInstalled { function Invoke-WPFGetInstalled {
<# <#
.DESCRIPTION .SYNOPSIS
placeholder Invokes the function that gets the checkboxes to check in a new runspace
.PARAMETER checkbox
Indicates whether to check for installed 'winget' programs or applied 'tweaks'
#> #>
param($checkbox) param($checkbox)
@ -31,9 +34,9 @@ function Invoke-WPFGetInstalled {
if($checkbox -eq "tweaks"){ if($checkbox -eq "tweaks"){
Write-Host "Getting Installed Tweaks..." Write-Host "Getting Installed Tweaks..."
} }
$Checkboxes = Invoke-WinUtilCurrentSystem -CheckBox $checkbox $Checkboxes = Invoke-WinUtilCurrentSystem -CheckBox $checkbox
$sync.form.Dispatcher.invoke({ $sync.form.Dispatcher.invoke({
foreach($checkbox in $Checkboxes){ foreach($checkbox in $Checkboxes){
$sync.$checkbox.ischecked = $True $sync.$checkbox.ischecked = $True

View File

@ -1,13 +1,18 @@
function Invoke-WPFImpex { function Invoke-WPFImpex {
<# <#
.DESCRIPTION
This function handles importing and exporting of the checkboxes checked for the tweaks section
.EXAMPLE .SYNOPSIS
Handles importing and exporting of the checkboxes checked for the tweaks section
.PARAMETER type
Indicates whether to 'import' or 'export'
.PARAMETER checkbox
The checkbox to export to a file or apply the imported file to
.EXAMPLE
Invoke-WPFImpex -type "export" Invoke-WPFImpex -type "export"
#> #>
param( param(
$type, $type,
@ -18,7 +23,7 @@ function Invoke-WPFImpex {
$FileBrowser = New-Object System.Windows.Forms.SaveFileDialog $FileBrowser = New-Object System.Windows.Forms.SaveFileDialog
} }
if ($type -eq "import"){ if ($type -eq "import"){
$FileBrowser = New-Object System.Windows.Forms.OpenFileDialog $FileBrowser = New-Object System.Windows.Forms.OpenFileDialog
} }
$FileBrowser.InitialDirectory = [Environment]::GetFolderPath('Desktop') $FileBrowser.InitialDirectory = [Environment]::GetFolderPath('Desktop')
@ -28,7 +33,7 @@ function Invoke-WPFImpex {
if($FileBrowser.FileName -eq ""){ if($FileBrowser.FileName -eq ""){
return return
} }
if ($type -eq "export"){ if ($type -eq "export"){
$jsonFile = Get-WinUtilCheckBoxes $checkbox -unCheck $false $jsonFile = Get-WinUtilCheckBoxes $checkbox -unCheck $false
$jsonFile | ConvertTo-Json | Out-File $FileBrowser.FileName -Force $jsonFile | ConvertTo-Json | Out-File $FileBrowser.FileName -Force

View File

@ -1,9 +1,9 @@
function Invoke-WPFInstall { function Invoke-WPFInstall {
<# <#
.DESCRIPTION .SYNOPSIS
PlaceHolder Installs the selected programs using winget
#> #>
if($sync.ProcessRunning){ if($sync.ProcessRunning){
@ -28,14 +28,14 @@ function Invoke-WPFInstall {
# Ensure winget is installed # Ensure winget is installed
Install-WinUtilWinget Install-WinUtilWinget
# Install all winget programs in new window # Install all selected programs in new window
Install-WinUtilProgramWinget -ProgramsToInstall $WingetInstall Install-WinUtilProgramWinget -ProgramsToInstall $WingetInstall
$ButtonType = [System.Windows.MessageBoxButton]::OK $ButtonType = [System.Windows.MessageBoxButton]::OK
$MessageboxTitle = "Installs are Finished " $MessageboxTitle = "Installs are Finished "
$Messageboxbody = ("Done") $Messageboxbody = ("Done")
$MessageIcon = [System.Windows.MessageBoxImage]::Information $MessageIcon = [System.Windows.MessageBoxImage]::Information
[System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon) [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)
Write-Host "===========================================" Write-Host "==========================================="

View File

@ -1,9 +1,9 @@
function Invoke-WPFInstallUpgrade { function Invoke-WPFInstallUpgrade {
<# <#
.DESCRIPTION .SYNOPSIS
PlaceHolder Invokes the function that upgrades all installed programs using winget
#> #>
if(!(Test-WinUtilPackageManager -winget)){ if(!(Test-WinUtilPackageManager -winget)){
Write-Host "===========================================" Write-Host "==========================================="

View File

@ -1,9 +1,9 @@
function Invoke-WPFPanelAutologin { function Invoke-WPFPanelAutologin {
<# <#
.DESCRIPTION .SYNOPSIS
PlaceHolder Enables autologin using Sysinternals Autologon.exe
#> #>
curl.exe -ss "https://live.sysinternals.com/Autologon.exe" -o $env:temp\autologin.exe # Official Microsoft recommendation https://learn.microsoft.com/en-us/sysinternals/downloads/autologon curl.exe -ss "https://live.sysinternals.com/Autologon.exe" -o $env:temp\autologin.exe # Official Microsoft recommendation https://learn.microsoft.com/en-us/sysinternals/downloads/autologon
cmd /c $env:temp\autologin.exe /accepteula cmd /c $env:temp\autologin.exe /accepteula

View File

@ -1,9 +1,26 @@
function Invoke-WPFPanelDISM { function Invoke-WPFPanelDISM {
<# <#
.DESCRIPTION .SYNOPSIS
PlaceHolder Checks for system corruption using Chkdsk, SFC, and DISM
.DESCRIPTION
1. Chkdsk - Fixes disk and filesystem corruption
2. SFC Run 1 - Fixes system file corruption, and fixes DISM if it was corrupted
3. DISM - Fixes system image corruption, and fixes SFC's system image if it was corrupted
4. SFC Run 2 - Fixes system file corruption, this time with an almost guaranteed uncorrupted system image
.NOTES
Command Arguments:
1. Chkdsk
/Scan - Runs an online scan on the system drive, attempts to fix any corruption, and queues other corruption for fixing on reboot
2. SFC
/ScanNow - Performs a scan of the system files and fixes any corruption
3. DISM - Fixes system image corruption, and fixes SFC's system image if it was corrupted
/Online - Fixes the currently running system image
/Cleanup-Image - Performs cleanup operations on the image, could remove some unneeded temporary files
/Restorehealth - Performs a scan of the image and fixes any corruption
#> #>
Start-Process PowerShell -ArgumentList "Write-Host '(1/4) Chkdsk' -ForegroundColor Green; Chkdsk /scan; Start-Process PowerShell -ArgumentList "Write-Host '(1/4) Chkdsk' -ForegroundColor Green; Chkdsk /scan;
Write-Host '`n(2/4) SFC - 1st scan' -ForegroundColor Green; sfc /scannow; Write-Host '`n(2/4) SFC - 1st scan' -ForegroundColor Green; sfc /scannow;

View File

@ -1,8 +1,17 @@
function Invoke-WPFPresets { function Invoke-WPFPresets {
<# <#
.DESCRIPTION .SYNOPSIS
Meant to make settings presets easier in the tweaks tab. Will pull the data from config/preset.json Sets the options in the tweaks panel to the given preset
.PARAMETER preset
The preset to set the options to
.PARAMETER imported
If the preset is imported from a file, defaults to false
.PARAMETER checkbox
The checkbox to set the options to, defaults to 'WPFTweaks'
#> #>

View File

@ -1,40 +1,41 @@
function Invoke-WPFRunspace { function Invoke-WPFRunspace {
<# <#
.DESCRIPTION
Simple function to make it easier to invoke a runspace from inside the script.
.EXAMPLE .SYNOPSIS
Creates and invokes a runspace using the given scriptblock and argumentlist
$params = @{ .PARAMETER ScriptBlock
ScriptBlock = $sync.ScriptsInstallPrograms The scriptblock to invoke in the runspace
ArgumentList = "Installadvancedip,Installbitwarden"
Verbose = $true .PARAMETER ArgumentList
} A list of arguments to pass to the runspace
.EXAMPLE
Invoke-WPFRunspace `
-ScriptBlock $sync.ScriptsInstallPrograms `
-ArgumentList "Installadvancedip,Installbitwarden" `
Invoke-WPFRunspace @params
#> #>
[CmdletBinding()] [CmdletBinding()]
Param ( Param (
$ScriptBlock, $ScriptBlock,
$ArgumentList $ArgumentList
) )
#Crate a PowerShell instance. # Create a PowerShell instance
$script:powershell = [powershell]::Create() $script:powershell = [powershell]::Create()
#Add Scriptblock and Arguments to runspace # Add Scriptblock and Arguments to runspace
$script:powershell.AddScript($ScriptBlock) $script:powershell.AddScript($ScriptBlock)
$script:powershell.AddArgument($ArgumentList) $script:powershell.AddArgument($ArgumentList)
$script:powershell.RunspacePool = $sync.runspace $script:powershell.RunspacePool = $sync.runspace
#Run our RunspacePool. # Execute the RunspacePool
$script:handle = $script:powershell.BeginInvoke() $script:handle = $script:powershell.BeginInvoke()
#Cleanup our RunspacePool threads when they are complete ie. GC. # Clean up the RunspacePool threads when they are complete, and invoke the garbage collector to clean up the memory
if ($script:handle.IsCompleted) if ($script:handle.IsCompleted)
{ {
$script:powershell.EndInvoke($script:handle) $script:powershell.EndInvoke($script:handle)

View File

@ -1,15 +1,18 @@
function Invoke-WPFShortcut { function Invoke-WPFShortcut {
<# <#
.DESCRIPTION .SYNOPSIS
Creates a shortcut Creates a shortcut and prompts for a save location
.PARAMETER ShortcutToAdd
The name of the shortcut to add
#> #>
param($ShortcutToAdd) param($ShortcutToAdd)
Switch ($ShortcutToAdd) { Switch ($ShortcutToAdd) {
"WinUtil" { "WinUtil" {
$SourceExe = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" $SourceExe = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
$IRM = 'irm https://christitus.com/win | iex' $IRM = 'irm https://christitus.com/win | iex'
$Powershell = '-ExecutionPolicy Bypass -Command "Start-Process powershell.exe -verb runas -ArgumentList' $Powershell = '-ExecutionPolicy Bypass -Command "Start-Process powershell.exe -verb runas -ArgumentList'
$ArgumentsToSourceExe = "$powershell '$IRM'" $ArgumentsToSourceExe = "$powershell '$IRM'"
@ -28,6 +31,6 @@ function Invoke-WPFShortcut {
$Shortcut.TargetPath = $SourceExe $Shortcut.TargetPath = $SourceExe
$Shortcut.Arguments = $ArgumentsToSourceExe $Shortcut.Arguments = $ArgumentsToSourceExe
$Shortcut.Save() $Shortcut.Save()
Write-Host "Shortcut for $ShortcutToAdd has been saved to $($FileBrowser.FileName)" Write-Host "Shortcut for $ShortcutToAdd has been saved to $($FileBrowser.FileName)"
} }

View File

@ -1,10 +1,13 @@
function Invoke-WPFTab { function Invoke-WPFTab {
<# <#
.DESCRIPTION .SYNOPSIS
Sole purpose of this function is to reduce duplicated code for switching between tabs. Sets the selected tab to the tab that was clicked
.PARAMETER ClickedTab
The name of the tab that was clicked
#> #>
Param ($ClickedTab) Param ($ClickedTab)
@ -13,7 +16,7 @@ function Invoke-WPFTab {
$x = [int]($ClickedTab -replace "WPFTab","" -replace "BT","") - 1 $x = [int]($ClickedTab -replace "WPFTab","" -replace "BT","") - 1
0..($Tabs.Count -1 ) | ForEach-Object { 0..($Tabs.Count -1 ) | ForEach-Object {
if ($x -eq $psitem){ if ($x -eq $psitem){
$sync.$TabNav.Items[$psitem].IsSelected = $true $sync.$TabNav.Items[$psitem].IsSelected = $true
} }

View File

@ -1,17 +1,18 @@
function Invoke-WPFToggle { function Invoke-WPFToggle {
<# <#
.DESCRIPTION
Meant to make creating toggle switches easier. There is a section below in the gui that will assign this function to every switch.
This way you can dictate what each button does from this function.
Input will be the name of the toggle that is checked.
#>
Param ([string]$Button)
#Use this to get the name of the button .SYNOPSIS
Invokes the scriptblock for the given toggle
.PARAMETER Button
The name of the toggle to invoke
#>
Param ([string]$Button)
# Use this to get the name of the button
#[System.Windows.MessageBox]::Show("$Button","Chris Titus Tech's Windows Utility","OK","Info") #[System.Windows.MessageBox]::Show("$Button","Chris Titus Tech's Windows Utility","OK","Info")
Switch -Wildcard ($Button){ Switch -Wildcard ($Button){

View File

@ -1,46 +1,51 @@
Function Invoke-WPFUltimatePerformance { Function Invoke-WPFUltimatePerformance {
<# <#
.DESCRIPTION .SYNOPSIS
PlaceHolder Creates or removes the Ultimate Performance power scheme
.PARAMETER State
Indicates whether to enable or disable the Ultimate Performance power scheme
#> #>
param($State) param($State)
Try{ Try{
if($state -eq "Enabled"){ if($state -eq "Enabled"){
# Define the name and GUID of the power scheme you want to add # Define the name and GUID of the power scheme
$powerSchemeName = "Ultimate Performance" $powerSchemeName = "Ultimate Performance"
$powerSchemeGuid = "e9a42b02-d5df-448d-aa00-03f14749eb61" $powerSchemeGuid = "e9a42b02-d5df-448d-aa00-03f14749eb61"
# Get all power schemes # Get all power schemes
$schemes = powercfg /list | Out-String -Stream $schemes = powercfg /list | Out-String -Stream
# Find the scheme you want to add # Check if the power scheme already exists
$ultimateScheme = $schemes | Where-Object { $_ -match $powerSchemeName } $ultimateScheme = $schemes | Where-Object { $_ -match $powerSchemeName }
# If the scheme does not exist, add it
if ($null -eq $ultimateScheme) { if ($null -eq $ultimateScheme) {
Write-Host "Power scheme '$powerSchemeName' not found. Adding..." Write-Host "Power scheme '$powerSchemeName' not found. Adding..."
# Add the power scheme # Add the power scheme
powercfg /duplicatescheme $powerSchemeGuid powercfg /duplicatescheme $powerSchemeGuid
powercfg -attributes SUB_SLEEP 7bc4a2f9-d8fc-4469-b07b-33eb785aaca0 -ATTRIB_HIDE powercfg -attributes SUB_SLEEP 7bc4a2f9-d8fc-4469-b07b-33eb785aaca0 -ATTRIB_HIDE
powercfg -setactive $powerSchemeGuid
powercfg -change -monitor-timeout-ac 0
Write-Host "Power scheme added successfully." Write-Host "Power scheme added successfully."
} }
else { else {
Write-Host "Power scheme '$powerSchemeName' already exists." Write-Host "Power scheme '$powerSchemeName' already exists."
} }
} }
elseif($state -eq "Disabled"){ elseif($state -eq "Disabled"){
# Define the name of the power scheme you want to remove # Define the name of the power scheme
$powerSchemeName = "Ultimate Performance" $powerSchemeName = "Ultimate Performance"
# Get all power schemes # Get all power schemes
$schemes = powercfg /list | Out-String -Stream $schemes = powercfg /list | Out-String -Stream
# Find the scheme you want to remove # Find the scheme to be removed
$ultimateScheme = $schemes | Where-Object { $_ -match $powerSchemeName } $ultimateScheme = $schemes | Where-Object { $_ -match $powerSchemeName }
# If the scheme exists, remove it # If the scheme exists, remove it
@ -50,10 +55,10 @@ Function Invoke-WPFUltimatePerformance {
if($null -ne $guid){ if($null -ne $guid){
Write-Host "Found power scheme '$powerSchemeName' with GUID $guid. Removing..." Write-Host "Found power scheme '$powerSchemeName' with GUID $guid. Removing..."
# Remove the power scheme # Remove the power scheme
powercfg /delete $guid powercfg /delete $guid
Write-Host "Power scheme removed successfully." Write-Host "Power scheme removed successfully."
} }
else { else {
@ -65,7 +70,7 @@ Function Invoke-WPFUltimatePerformance {
} }
} }
} }
Catch{ Catch{
Write-Warning $psitem.Exception.Message Write-Warning $psitem.Exception.Message

View File

@ -1,13 +1,13 @@
function Invoke-WPFUnInstall { function Invoke-WPFUnInstall {
<# <#
.DESCRIPTION .SYNOPSIS
PlaceHolder Uninstalls the selected programs
#> #>
if($sync.ProcessRunning){ if($sync.ProcessRunning){
$msg = "Install process is currently running." $msg = "Install process is currently running"
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning) [System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
return return
} }
@ -22,7 +22,7 @@ function Invoke-WPFUnInstall {
$ButtonType = [System.Windows.MessageBoxButton]::YesNo $ButtonType = [System.Windows.MessageBoxButton]::YesNo
$MessageboxTitle = "Are you sure?" $MessageboxTitle = "Are you sure?"
$Messageboxbody = ("This will uninstall the following applications `n $WingetInstall") $Messageboxbody = ("This will uninstall the following applications: `n $WingetInstall")
$MessageIcon = [System.Windows.MessageBoxImage]::Information $MessageIcon = [System.Windows.MessageBoxImage]::Information
$confirm = [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon) $confirm = [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)
@ -34,23 +34,23 @@ function Invoke-WPFUnInstall {
try{ try{
$sync.ProcessRunning = $true $sync.ProcessRunning = $true
# Install all winget programs in new window # Install all selected programs in new window
Install-WinUtilProgramWinget -ProgramsToInstall $WingetInstall -Manage "Uninstalling" Install-WinUtilProgramWinget -ProgramsToInstall $WingetInstall -Manage "Uninstalling"
$ButtonType = [System.Windows.MessageBoxButton]::OK $ButtonType = [System.Windows.MessageBoxButton]::OK
$MessageboxTitle = "Uninstalls are Finished " $MessageboxTitle = "Uninstalls are Finished "
$Messageboxbody = ("Done") $Messageboxbody = ("Done")
$MessageIcon = [System.Windows.MessageBoxImage]::Information $MessageIcon = [System.Windows.MessageBoxImage]::Information
[System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon) [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)
Write-Host "===========================================" Write-Host "==========================================="
Write-Host "-- Uninstalls have finished ---" Write-Host "-- Uninstalls have finished ---"
Write-Host "===========================================" Write-Host "==========================================="
} }
Catch { Catch {
Write-Host "===========================================" Write-Host "==========================================="
Write-Host "-- Winget failed to install ---" Write-Host "-- Winget failed to install ---"
Write-Host "===========================================" Write-Host "==========================================="
} }
$sync.ProcessRunning = $False $sync.ProcessRunning = $False

View File

@ -1,9 +1,9 @@
function Invoke-WPFUpdatesdefault { function Invoke-WPFUpdatesdefault {
<# <#
.DESCRIPTION .SYNOPSIS
PlaceHolder Resets Windows Update settings to default
#> #>
If (!(Test-Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU")) { If (!(Test-Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU")) {
New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Force | Out-Null New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Force | Out-Null
@ -39,7 +39,7 @@ function Invoke-WPFUpdatesdefault {
Remove-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings" -Name "BranchReadinessLevel" -ErrorAction SilentlyContinue Remove-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings" -Name "BranchReadinessLevel" -ErrorAction SilentlyContinue
Remove-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings" -Name "DeferFeatureUpdatesPeriodInDays" -ErrorAction SilentlyContinue Remove-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings" -Name "DeferFeatureUpdatesPeriodInDays" -ErrorAction SilentlyContinue
Remove-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings" -Name "DeferQualityUpdatesPeriodInDays" -ErrorAction SilentlyContinue Remove-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings" -Name "DeferQualityUpdatesPeriodInDays" -ErrorAction SilentlyContinue
Write-Host "=================================" Write-Host "==================================================="
Write-Host "--- Updates Set to Default ---" Write-Host "--- Windows Update Settings Reset to Default ---"
Write-Host "=================================" Write-Host "==================================================="
} }

View File

@ -1,9 +1,12 @@
function Invoke-WPFUpdatesdisable { function Invoke-WPFUpdatesdisable {
<# <#
.DESCRIPTION .SYNOPSIS
PlaceHolder Disables Windows Update
.NOTES
Disabling Windows Update is not recommended. This is only for advanced users who know what they are doing.
#> #>
If (!(Test-Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU")) { If (!(Test-Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU")) {
New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Force | Out-Null New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Force | Out-Null
@ -27,6 +30,6 @@ function Invoke-WPFUpdatesdisable {
Get-Service -Name $service -ErrorAction SilentlyContinue | Set-Service -StartupType Disabled Get-Service -Name $service -ErrorAction SilentlyContinue | Set-Service -StartupType Disabled
} }
Write-Host "=================================" Write-Host "================================="
Write-Host "--- Updates ARE DISABLED ---" Write-Host "--- Updates ARE DISABLED ---"
Write-Host "=================================" Write-Host "================================="
} }

View File

@ -1,9 +1,16 @@
function Invoke-WPFUpdatessecurity { function Invoke-WPFUpdatessecurity {
<# <#
.DESCRIPTION .SYNOPSIS
PlaceHolder Sets Windows Update to recommended settings
.DESCRIPTION
1. Disables driver offering through Windows Update
2. Disables Windows Update automatic restart
3. Sets Windows Update to Semi-Annual Channel (Targeted)
4. Defers feature updates for 365 days
5. Defers quality updates for 4 days
#> #>
Write-Host "Disabling driver offering through Windows Update..." Write-Host "Disabling driver offering through Windows Update..."
If (!(Test-Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Device Metadata")) { If (!(Test-Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Device Metadata")) {

View File

@ -1,9 +1,9 @@
function Invoke-WPFtweaksbutton { function Invoke-WPFtweaksbutton {
<# <#
.DESCRIPTION .SYNOPSIS
PlaceHolder Invokes the functions associated with each group of checkboxes
#> #>
if($sync.ProcessRunning){ if($sync.ProcessRunning){
@ -22,13 +22,13 @@ function Invoke-WPFtweaksbutton {
return return
} }
Set-WinUtilRestorePoint
Invoke-WPFRunspace -ArgumentList $Tweaks -ScriptBlock { Invoke-WPFRunspace -ArgumentList $Tweaks -ScriptBlock {
param($Tweaks) param($Tweaks)
$sync.ProcessRunning = $true $sync.ProcessRunning = $true
Set-WinUtilRestorePoint
Foreach ($tweak in $tweaks){ Foreach ($tweak in $tweaks){
Invoke-WinUtilTweaks $tweak Invoke-WinUtilTweaks $tweak
} }

View File

@ -1,9 +1,9 @@
function Invoke-WPFundoall { function Invoke-WPFundoall {
<# <#
.DESCRIPTION .SYNOPSIS
PlaceHolder Undoes every selected tweak
#> #>
if($sync.ProcessRunning){ if($sync.ProcessRunning){
@ -18,8 +18,8 @@ function Invoke-WPFundoall {
$msg = "Please check the tweaks you wish to undo." $msg = "Please check the tweaks you wish to undo."
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning) [System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
return return
} }
Invoke-WPFRunspace -ArgumentList $Tweaks -ScriptBlock { Invoke-WPFRunspace -ArgumentList $Tweaks -ScriptBlock {
param($Tweaks) param($Tweaks)

4
gpedit-home.ps1 Normal file
View File

@ -0,0 +1,4 @@
Get-ChildItem @(
"C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientTools-Package*.mum",
"C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package*.mum"
) | ForEach-Object { dism.exe /online /norestart /add-package:"$_" }

View File

@ -15,7 +15,7 @@
'PSShouldProcess', 'PSShouldProcess',
'PSUseApprovedVerbs', 'PSUseApprovedVerbs',
'PSUseDeclaredVarsMoreThanAssignments') 'PSUseDeclaredVarsMoreThanAssignments')
#> #>
# Do not analyze the following rules. Use ExcludeRules when you have # Do not analyze the following rules. Use ExcludeRules when you have
# commented out the IncludeRules settings above and want to include all # commented out the IncludeRules settings above and want to include all
# the default rules except for those you exclude below. # the default rules except for those you exclude below.

View File

@ -1,14 +1,14 @@
############################################################################ ############################################################################
# This file was created with O&O ShutUp10++ V1.9.1435 # This file was created with O&O ShutUp10++ V1.9.1435
# and can be imported onto another computer. # and can be imported onto another computer.
# #
# Download the application at https://www.oo-software.com/shutup10 # Download the application at https://www.oo-software.com/shutup10
# You can then import the file from within the program. # You can then import the file from within the program.
# #
# Alternatively you can import it automatically over a command line. # Alternatively you can import it automatically over a command line.
# Simply use the following parameter: # Simply use the following parameter:
# OOSU10.exe <path to file> # OOSU10.exe <path to file>
# #
# Selecting the Option /quiet ends the app right after the import and the # Selecting the Option /quiet ends the app right after the import and the
# user does not get any feedback about the import. # user does not get any feedback about the import.
# #

View File

@ -1,27 +1,23 @@
#region Load Variables needed for testing # Import Config Files
$global:importedconfigs = @{}
Get-ChildItem .\config | Where-Object {$_.Extension -eq ".json"} | ForEach-Object {
$global:importedconfigs[$psitem.BaseName] = Get-Content $psitem.FullName | ConvertFrom-Json
}
#Config Files
$global:importedconfigs = @{}
Get-ChildItem .\config | Where-Object {$_.Extension -eq ".json"} | ForEach-Object {
$global:importedconfigs[$psitem.BaseName] = Get-Content $psitem.FullName | ConvertFrom-Json
}
#endregion Load Variables needed for testing
#=========================================================================== #===========================================================================
# Tests - Application Installs # Tests - Application Installs
#=========================================================================== #===========================================================================
Describe "Config Files" -ForEach @( Describe "Config Files" -ForEach @(
@{ @{
name = "applications" name = "applications"
config = $('{ config = $('{
"winget": "value", "winget": "value",
"choco": "value" "choco": "value"
}' | ConvertFrom-Json) }' | ConvertFrom-Json)
}, },
@{ @{
name = "tweaks" name = "tweaks"
undo = $true undo = $true
} }
@ -41,7 +37,7 @@ Describe "Config Files" -ForEach @(
$result.Add($application) $result.Add($application)
} }
} }
$result | Select-String "WPF*" | should -BeNullOrEmpty $result | Select-String "WPF*" | should -BeNullOrEmpty
} }
} }
@ -52,16 +48,16 @@ Describe "Config Files" -ForEach @(
foreach ($tweak in $tweaks){ foreach ($tweak in $tweaks){
$Originals = @( $Originals = @(
@{ @{
name = "registry" name = "registry"
value = "OriginalValue" value = "OriginalValue"
}, },
@{ @{
name = "service" name = "service"
value = "OriginalType" value = "OriginalType"
}, },
@{ @{
name = "ScheduledTask" name = "ScheduledTask"
value = "OriginalState" value = "OriginalState"
} }
) )

View File

@ -3,23 +3,19 @@
#=========================================================================== #===========================================================================
Describe "Functions"{ Describe "Functions"{
Get-ChildItem .\functions -Recurse -File | ForEach-Object { Get-ChildItem .\functions -Recurse -File | ForEach-Object {
context "$($psitem.BaseName)" { context "$($psitem.BaseName)" {
BeforeEach -Scriptblock { BeforeEach -Scriptblock {
. $fullname . $fullname
} }
It "Imports with no errors" -TestCases @{ It "Imports with no errors" -TestCases @{
basename = $($psitem.BaseName) basename = $($psitem.BaseName)
fullname = $psitem.FullName fullname = $psitem.FullName
} { } {
Get-ChildItem function:\$basename | should -Not -BeNullOrEmpty Get-ChildItem function:\$basename | should -Not -BeNullOrEmpty
}
It "Contains Description" -TestCases @{
basename = $($psitem.BaseName)
fullname = $psitem.FullName
} { } {
get-help $basename -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Description | should -Not -BeNullOrEmpty get-help $basename -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Description | should -Not -BeNullOrEmpty
} }

View File

@ -1,15 +1,15 @@
#region Load Variables needed for testing # Load Variables needed for testing
./Compile.ps1 ./Compile.ps1
$script = Get-Content .\winutil.ps1 $script = Get-Content .\winutil.ps1
$script[0..($script.count - 21)] | Out-File .\pester.ps1 # Remove the part of the script that shows the form, leaving only the variable and function declarations
$script[0..($script.count - 21)] | Out-File .\pester.ps1
#endregion Load Variables needed for testing
BeforeAll { BeforeAll {
. .\pester.ps1 # Execute the truncated script, bringing the variabes into the current scope
. .\pester.ps1
} }
Describe "GUI" { Describe "GUI" {
@ -23,5 +23,5 @@ Describe "GUI" {
It "Imports with no errors" { It "Imports with no errors" {
$sync.Form | should -Not -BeNullOrEmpty $sync.Form | should -Not -BeNullOrEmpty
} }
} }
} }

View File

@ -1,39 +1,43 @@
# SPDX-License-Identifier: MIT # SPDX-License-Identifier: MIT
#Configure max thread count for RunspacePool. # Set the maximum number of threads for the RunspacePool to the number of threads on the machine
$maxthreads = [int]$env:NUMBER_OF_PROCESSORS $maxthreads = [int]$env:NUMBER_OF_PROCESSORS
#Create a new session state for parsing variables ie hashtable into our runspace. # Create a new session state for parsing variables into our runspace
$hashVars = New-object System.Management.Automation.Runspaces.SessionStateVariableEntry -ArgumentList 'sync',$sync,$Null $hashVars = New-object System.Management.Automation.Runspaces.SessionStateVariableEntry -ArgumentList 'sync',$sync,$Null
$InitialSessionState = [System.Management.Automation.Runspaces.InitialSessionState]::CreateDefault() $InitialSessionState = [System.Management.Automation.Runspaces.InitialSessionState]::CreateDefault()
#Add the variable to the RunspacePool sessionstate # Add the variable to the session state
$InitialSessionState.Variables.Add($hashVars) $InitialSessionState.Variables.Add($hashVars)
#Add functions # Get every private function and add them to the session state
$functions = Get-ChildItem function:\ | Where-Object {$_.name -like "*winutil*" -or $_.name -like "*WPF*"} $functions = Get-ChildItem function:\ | Where-Object {$_.name -like "*winutil*" -or $_.name -like "*WPF*"}
foreach ($function in $functions){ foreach ($function in $functions){
$functionDefinition = Get-Content function:\$($function.name) $functionDefinition = Get-Content function:\$($function.name)
$functionEntry = New-Object System.Management.Automation.Runspaces.SessionStateFunctionEntry -ArgumentList $($function.name), $functionDefinition $functionEntry = New-Object System.Management.Automation.Runspaces.SessionStateFunctionEntry -ArgumentList $($function.name), $functionDefinition
# And add it to the iss object
$initialSessionState.Commands.Add($functionEntry) $initialSessionState.Commands.Add($functionEntry)
} }
#Create our runspace pool. We are entering three parameters here min thread count, max thread count and host machine of where these runspaces should be made. # Create the runspace pool
$sync.runspace = [runspacefactory]::CreateRunspacePool(1,$maxthreads,$InitialSessionState, $Host) $sync.runspace = [runspacefactory]::CreateRunspacePool(
1, # Minimum thread count
$maxthreads, # Maximum thread count
$InitialSessionState, # Initial session state
$Host # Machine to create runspaces on
)
#Open a RunspacePool instance. # Open the RunspacePool instance
$sync.runspace.Open() $sync.runspace.Open()
#region exception classes # Create classes for different exceptions
class WingetFailedInstall : Exception { class WingetFailedInstall : Exception {
[string] $additionalData [string] $additionalData
WingetFailedInstall($Message) : base($Message) {} WingetFailedInstall($Message) : base($Message) {}
} }
class ChocoFailedInstall : Exception { class ChocoFailedInstall : Exception {
[string] $additionalData [string] $additionalData
@ -45,8 +49,7 @@ $sync.runspace.Open()
GenericException($Message) : base($Message) {} GenericException($Message) : base($Message) {}
} }
#endregion exception classes
$inputXML = $inputXML -replace 'mc:Ignorable="d"', '' -replace "x:N", 'N' -replace '^<Win.*', '<Window' $inputXML = $inputXML -replace 'mc:Ignorable="d"', '' -replace "x:N", 'N' -replace '^<Win.*', '<Window'
@ -61,8 +64,8 @@ $inputXML = Set-WinUtilUITheme -inputXML $inputXML -themeName $ctttheme
[void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework') [void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')
[xml]$XAML = $inputXML [xml]$XAML = $inputXML
#Read XAML
# Read the XAML file
$reader = (New-Object System.Xml.XmlNodeReader $xaml) $reader = (New-Object System.Xml.XmlNodeReader $xaml)
try { $sync["Form"] = [Windows.Markup.XamlReader]::Load( $reader ) } try { $sync["Form"] = [Windows.Markup.XamlReader]::Load( $reader ) }
catch [System.Management.Automation.MethodInvocationException] { catch [System.Management.Automation.MethodInvocationException] {
@ -73,7 +76,6 @@ catch [System.Management.Automation.MethodInvocationException] {
} }
} }
catch { catch {
# If it broke some other way <img draggable="false" role="img" class="emoji" alt="😀" src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/svg/1f600.svg">
Write-Host "Unable to load Windows.Markup.XamlReader. Double-check syntax and ensure .net is installed." Write-Host "Unable to load Windows.Markup.XamlReader. Double-check syntax and ensure .net is installed."
} }
@ -116,7 +118,7 @@ $sync.keys | ForEach-Object {
# Setup background config # Setup background config
#=========================================================================== #===========================================================================
#Load information in the background # Load computer information in the background
Invoke-WPFRunspace -ScriptBlock { Invoke-WPFRunspace -ScriptBlock {
$sync.ConfigLoaded = $False $sync.ConfigLoaded = $False
@ -126,25 +128,25 @@ Invoke-WPFRunspace -ScriptBlock {
} | Out-Null } | Out-Null
#=========================================================================== #===========================================================================
# Shows the form # Setup and Show the Form
#=========================================================================== #===========================================================================
# Print the logo
Invoke-WPFFormVariables Invoke-WPFFormVariables
try{ # Check if Chocolatey is installed
Install-WinUtilChoco Install-WinUtilChoco
}
Catch [ChocoFailedInstall]{ # Set the titlebar
Write-Host "==========================================="
Write-Host "-- Chocolatey failed to install ---"
Write-Host "==========================================="
}
$sync["Form"].title = $sync["Form"].title + " " + $sync.version $sync["Form"].title = $sync["Form"].title + " " + $sync.version
# Set the commands that will run when the form is closed
$sync["Form"].Add_Closing({ $sync["Form"].Add_Closing({
$sync.runspace.Dispose() $sync.runspace.Dispose()
$sync.runspace.Close() $sync.runspace.Close()
[System.GC]::Collect() [System.GC]::Collect()
}) })
# Show the form
$sync["Form"].ShowDialog() | out-null $sync["Form"].ShowDialog() | out-null
Stop-Transcript
Stop-Transcript

View File

@ -8,10 +8,10 @@
Start-Transcript $ENV:TEMP\Winutil.log -Append Start-Transcript $ENV:TEMP\Winutil.log -Append
#Load DLLs # Load DLLs
Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Windows.Forms
# variable to sync between runspaces # Variable to sync between runspaces
$sync = [Hashtable]::Synchronized(@{}) $sync = [Hashtable]::Synchronized(@{})
$sync.PSScriptRoot = $PSScriptRoot $sync.PSScriptRoot = $PSScriptRoot
$sync.version = "#{replaceme}" $sync.version = "#{replaceme}"

View File

@ -1,6 +1,6 @@
<#PSScriptInfo <#PSScriptInfo
.VERSION 3.0.0 .VERSION 3.0.1
.GUID 3b581edb-5d90-4fa1-ba15-4f2377275463 .GUID 3b581edb-5d90-4fa1-ba15-4f2377275463
@ -29,6 +29,7 @@
[Version 2.1.0] - Added alternate method/URL for dependencies in case the main URL is down. Fixed licensing issue when winget is installed on Server 2022. [Version 2.1.0] - Added alternate method/URL for dependencies in case the main URL is down. Fixed licensing issue when winget is installed on Server 2022.
[Version 2.1.1] - Switched primary/alternate methods. Added Cleanup function to avoid errors when cleaning up temp files. Added output of URL for alternate method. Suppressed Add-AppxProvisionedPackage output. Improved success message. Improved verbiage. Improve PS script comments. Added check if the URL is empty. Moved display of URL beneath the check. [Version 2.1.1] - Switched primary/alternate methods. Added Cleanup function to avoid errors when cleaning up temp files. Added output of URL for alternate method. Suppressed Add-AppxProvisionedPackage output. Improved success message. Improved verbiage. Improve PS script comments. Added check if the URL is empty. Moved display of URL beneath the check.
[Version 3.0.0] - Major changes. Added OS version detection checks - detects OS version, release ID, ensures compatibility. Forces older file installation for Server 2022 to avoid issues after installing. Added DebugMode, DisableCleanup, Force. Renamed CheckForUpdates to CheckForUpdate. Improved output. Improved error handling. Improved comments. Improved code readability. Moved CheckForUpdate into function. Added PowerShellGalleryName. Renamed Get-OSVersion to Get-OSInfo. Moved architecture detection into Get-OSInfo. Renamed Get-NewestLink to Get-WingetDownloadUrl. Have Get-WingetDownloadUrl not get preview releases. [Version 3.0.0] - Major changes. Added OS version detection checks - detects OS version, release ID, ensures compatibility. Forces older file installation for Server 2022 to avoid issues after installing. Added DebugMode, DisableCleanup, Force. Renamed CheckForUpdates to CheckForUpdate. Improved output. Improved error handling. Improved comments. Improved code readability. Moved CheckForUpdate into function. Added PowerShellGalleryName. Renamed Get-OSVersion to Get-OSInfo. Moved architecture detection into Get-OSInfo. Renamed Get-NewestLink to Get-WingetDownloadUrl. Have Get-WingetDownloadUrl not get preview releases.
[Version 3.0.1] - Updated Get-OSInfo function to fix issues when used on non-English systems. Improved error handling of "resources in use" error.
#> #>
@ -56,7 +57,7 @@ This function should be run with administrative privileges.
.PARAMETER Help .PARAMETER Help
Displays the full help information for the script. Displays the full help information for the script.
.NOTES .NOTES
Version : 3.0.0 Version : 3.0.1
Created by : asheroto Created by : asheroto
.LINK .LINK
Project Site: https://github.com/asheroto/winget-install Project Site: https://github.com/asheroto/winget-install
@ -72,7 +73,7 @@ param (
) )
# Version # Version
$CurrentVersion = '3.0.0' $CurrentVersion = '3.0.1'
$RepoOwner = 'asheroto' $RepoOwner = 'asheroto'
$RepoName = 'winget-install' $RepoName = 'winget-install'
$PowerShellGalleryName = 'winget-install' $PowerShellGalleryName = 'winget-install'
@ -158,12 +159,13 @@ function Get-OSInfo {
$nameValue = $osDetails.Caption $nameValue = $osDetails.Caption
# Get architecture details of the OS (not the processor) # Get architecture details of the OS (not the processor)
$architecture = $osDetails.OSArchitecture # Get only the numbers
$architecture = ($osDetails.OSArchitecture -replace "[^\d]").Trim()
# If 32-bit or 64-bit replace with x32 and x64 # If 32-bit or 64-bit replace with x32 and x64
if ($architecture -eq "32-bit") { if ($architecture -eq "32") {
$architecture = "x32" $architecture = "x32"
} elseif ($architecture -eq "64-bit") { } elseif ($architecture -eq "64") {
$architecture = "x64" $architecture = "x64"
} }
@ -624,12 +626,20 @@ function Install-Prerequisite {
throw throw
} }
Write-Output "URL: ${url}" if ($DebugMode) {
Write-Output "`nInstalling ${arch} ${Name}..." Write-Output "URL: ${url}`n"
}
Write-Output "Installing ${arch} ${Name}..."
Add-AppxPackage $url -ErrorAction Stop Add-AppxPackage $url -ErrorAction Stop
Write-Output "`n$Name installed successfully." Write-Output "`n$Name installed successfully."
} catch { } catch {
# Alternate method # Alternate method
if ($_.Exception.Message -match '0x80073D02') {
# If resources in use exception, fail immediately
Handle-Error $_
throw
}
try { try {
$url = $AlternateUrl $url = $AlternateUrl
@ -758,6 +768,7 @@ if ($CheckForUpdate) {
# Heading # Heading
Write-Output "winget-install $CurrentVersion" Write-Output "winget-install $CurrentVersion"
Write-Output "To check for updates, run winget-install -CheckForUpdate"
# Set OS version # Set OS version
$osVersion = Get-OSInfo $osVersion = Get-OSInfo
@ -891,7 +902,7 @@ try {
if (Get-WingetStatus -eq $true) { if (Get-WingetStatus -eq $true) {
Write-Output "winget is installed and working now, you can go ahead and use it." Write-Output "winget is installed and working now, you can go ahead and use it."
} else { } else {
Write-Warning "winget is installed but is not detected as a command. Try using winget now. If it doesn't work, try restarting your computer." Write-Warning "winget is installed but is not detected as a command. Try using winget now. If it doesn't work, wait about 1 minute and try again (it is sometimes delayed). Also try restarting your computer."
Write-Warning "If you restart your computer and the command still isn't recognized, please read the Troubleshooting section`nof the README: https://github.com/asheroto/winget-install#troubleshooting`n" Write-Warning "If you restart your computer and the command still isn't recognized, please read the Troubleshooting section`nof the README: https://github.com/asheroto/winget-install#troubleshooting`n"
Write-Warning "Make sure you have the latest version of the script by running this command: $PowerShellGalleryName -CheckForUpdate" Write-Warning "Make sure you have the latest version of the script by running this command: $PowerShellGalleryName -CheckForUpdate"
} }
@ -911,4 +922,4 @@ try {
} }
Write-Warning "Error: $($_.Exception.Message)`n" Write-Warning "Error: $($_.Exception.Message)`n"
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -8,7 +8,7 @@
Background="{MainBackgroundColor}" Background="{MainBackgroundColor}"
WindowStartupLocation="CenterScreen" WindowStartupLocation="CenterScreen"
Title="Chris Titus Tech's Windows Utility" Height="800" Width="1200"> Title="Chris Titus Tech's Windows Utility" Height="800" Width="1200">
<Window.Resources> <Window.Resources>
<Style TargetType="ComboBox"> <Style TargetType="ComboBox">
<Setter Property="Foreground" Value="{ComboBoxForegroundColor}" /> <Setter Property="Foreground" Value="{ComboBoxForegroundColor}" />
@ -24,7 +24,7 @@
IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
ClickMode="Press"> ClickMode="Press">
<TextBlock Text="{TemplateBinding SelectionBoxItem}" <TextBlock Text="{TemplateBinding SelectionBoxItem}"
Foreground="{TemplateBinding Foreground}" Foreground="{TemplateBinding Foreground}"
Background="{TemplateBinding Background}" Background="{TemplateBinding Background}"
/> />
</ToggleButton> </ToggleButton>
@ -132,24 +132,24 @@
</ControlTemplate> </ControlTemplate>
</Setter.Value> </Setter.Value>
</Setter> </Setter>
</Style> </Style>
<Style x:Key="ToggleSwitchStyle" TargetType="CheckBox"> <Style x:Key="ToggleSwitchStyle" TargetType="CheckBox">
<Setter Property="Template"> <Setter Property="Template">
<Setter.Value> <Setter.Value>
<ControlTemplate TargetType="CheckBox"> <ControlTemplate TargetType="CheckBox">
<StackPanel> <StackPanel>
<Grid> <Grid>
<Border Width="45" <Border Width="45"
Height="20" Height="20"
Background="#555555" Background="#555555"
CornerRadius="10" CornerRadius="10"
Margin="5,0" Margin="5,0"
/> />
<Border Name="WPFToggleSwitchButton" <Border Name="WPFToggleSwitchButton"
Width="25" Width="25"
Height="25" Height="25"
Background="Black" Background="Black"
CornerRadius="12.5" CornerRadius="12.5"
HorizontalAlignment="Left" HorizontalAlignment="Left"
/> />
<ContentPresenter Name="WPFToggleSwitchContent" <ContentPresenter Name="WPFToggleSwitchContent"
@ -216,13 +216,13 @@
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<DockPanel Background="{MainBackgroundColor}" SnapsToDevicePixels="True" Grid.Row="0" Width="1100"> <DockPanel Background="{MainBackgroundColor}" SnapsToDevicePixels="True" Grid.Row="0" Width="1100">
<Image Height="50" Width="50" Name="WPFIcon" SnapsToDevicePixels="True" Source="https://christitus.com/images/logo-full.png" Margin="0,10,0,10"/> <Image Height="50" Width="50" Name="WPFIcon" SnapsToDevicePixels="True" Source="https://christitus.com/images/logo-full.png" Margin="0,10,0,10"/>
<Button Content="Install" HorizontalAlignment="Left" Height="40" Width="100" <Button Content="Install" HorizontalAlignment="Left" Height="40" Width="100"
Background="{ButtonInstallBackgroundColor}" Foreground="{ButtonInstallForegroundColor}" FontWeight="Bold" Name="WPFTab1BT"/> Background="{ButtonInstallBackgroundColor}" Foreground="{ButtonInstallForegroundColor}" FontWeight="Bold" Name="WPFTab1BT"/>
<Button Content="Tweaks" HorizontalAlignment="Left" Height="40" Width="100" <Button Content="Tweaks" HorizontalAlignment="Left" Height="40" Width="100"
Background="{ButtonTweaksBackgroundColor}" Foreground="{ButtonInstallForegroundColor}" FontWeight="Bold" Name="WPFTab2BT"/> Background="{ButtonTweaksBackgroundColor}" Foreground="{ButtonInstallForegroundColor}" FontWeight="Bold" Name="WPFTab2BT"/>
<Button Content="Config" HorizontalAlignment="Left" Height="40" Width="100" <Button Content="Config" HorizontalAlignment="Left" Height="40" Width="100"
Background="{ButtonConfigBackgroundColor}" Foreground="{ButtonInstallForegroundColor}" FontWeight="Bold" Name="WPFTab3BT"/> Background="{ButtonConfigBackgroundColor}" Foreground="{ButtonInstallForegroundColor}" FontWeight="Bold" Name="WPFTab3BT"/>
<Button Content="Updates" HorizontalAlignment="Left" Height="40" Width="100" <Button Content="Updates" HorizontalAlignment="Left" Height="40" Width="100"
Background="{ButtonUpdatesBackgroundColor}" Foreground="{ButtonInstallForegroundColor}" FontWeight="Bold" Name="WPFTab4BT"/> Background="{ButtonUpdatesBackgroundColor}" Foreground="{ButtonInstallForegroundColor}" FontWeight="Bold" Name="WPFTab4BT"/>
</DockPanel> </DockPanel>
<TabControl Grid.Row="1" Padding="-1" Name="WPFTabNav" Background="#222222"> <TabControl Grid.Row="1" Padding="-1" Name="WPFTabNav" Background="#222222">
@ -261,12 +261,14 @@
<CheckBox Name="WPFInstalledge" Content="Edge" Margin="5,0"/> <CheckBox Name="WPFInstalledge" Content="Edge" Margin="5,0"/>
<CheckBox Name="WPFInstallfirefox" Content="Firefox" Margin="5,0"/> <CheckBox Name="WPFInstallfirefox" Content="Firefox" Margin="5,0"/>
<CheckBox Name="WPFInstalllibrewolf" Content="LibreWolf" Margin="5,0"/> <CheckBox Name="WPFInstalllibrewolf" Content="LibreWolf" Margin="5,0"/>
<CheckBox Name="WPFInstallthorium" Content="Thorium Browser" Margin="5,0"/>
<CheckBox Name="WPFInstalltor" Content="Tor Browser" Margin="5,0"/> <CheckBox Name="WPFInstalltor" Content="Tor Browser" Margin="5,0"/>
<CheckBox Name="WPFInstallvivaldi" Content="Vivaldi" Margin="5,0"/> <CheckBox Name="WPFInstallvivaldi" Content="Vivaldi" Margin="5,0"/>
<CheckBox Name="WPFInstallwaterfox" Content="Waterfox" Margin="5,0"/> <CheckBox Name="WPFInstallwaterfox" Content="Waterfox" Margin="5,0"/>
<Label Content="Communications" FontSize="16" Margin="5,0"/> <Label Content="Communications" FontSize="16" Margin="5,0"/>
<CheckBox Name="WPFInstalldiscord" Content="Discord" Margin="5,0"/> <CheckBox Name="WPFInstalldiscord" Content="Discord" Margin="5,0"/>
<CheckBox Name="WPFInstallguilded" Content="Guilded" Margin="5,0"/>
<CheckBox Name="WPFInstallhexchat" Content="Hexchat" Margin="5,0"/> <CheckBox Name="WPFInstallhexchat" Content="Hexchat" Margin="5,0"/>
<CheckBox Name="WPFInstalljami" Content="Jami" Margin="5,0"/> <CheckBox Name="WPFInstalljami" Content="Jami" Margin="5,0"/>
<CheckBox Name="WPFInstallmatrix" Content="Matrix" Margin="5,0"/> <CheckBox Name="WPFInstallmatrix" Content="Matrix" Margin="5,0"/>
@ -302,7 +304,7 @@
<CheckBox Name="WPFInstallvisualstudio" Content="Visual Studio 2022" Margin="5,0"/> <CheckBox Name="WPFInstallvisualstudio" Content="Visual Studio 2022" Margin="5,0"/>
<CheckBox Name="WPFInstallvscode" Content="VS Code" Margin="5,0"/> <CheckBox Name="WPFInstallvscode" Content="VS Code" Margin="5,0"/>
<CheckBox Name="WPFInstallvscodium" Content="VS Codium" Margin="5,0"/> <CheckBox Name="WPFInstallvscodium" Content="VS Codium" Margin="5,0"/>
<Label Content="Document" FontSize="16" Margin="5,0"/> <Label Content="Document" FontSize="16" Margin="5,0"/>
<CheckBox Name="WPFInstalladobe" Content="Adobe Reader DC" Margin="5,0"/> <CheckBox Name="WPFInstalladobe" Content="Adobe Reader DC" Margin="5,0"/>
<CheckBox Name="WPFInstallopenoffice" Content="Apache OpenOffice" Margin="5,0"/> <CheckBox Name="WPFInstallopenoffice" Content="Apache OpenOffice" Margin="5,0"/>
@ -333,6 +335,7 @@
<CheckBox Name="WPFInstalldotnet3" Content=".NET Desktop Runtime 3.1" Margin="5,0"/> <CheckBox Name="WPFInstalldotnet3" Content=".NET Desktop Runtime 3.1" Margin="5,0"/>
<CheckBox Name="WPFInstalldotnet5" Content=".NET Desktop Runtime 5" Margin="5,0"/> <CheckBox Name="WPFInstalldotnet5" Content=".NET Desktop Runtime 5" Margin="5,0"/>
<CheckBox Name="WPFInstalldotnet6" Content=".NET Desktop Runtime 6" Margin="5,0"/> <CheckBox Name="WPFInstalldotnet6" Content=".NET Desktop Runtime 6" Margin="5,0"/>
<CheckBox Name="WPFInstalldotnet7" Content=".NET Desktop Runtime 7" Margin="5,0"/>
<CheckBox Name="WPFInstallnuget" Content="Nuget" Margin="5,0"/> <CheckBox Name="WPFInstallnuget" Content="Nuget" Margin="5,0"/>
<CheckBox Name="WPFInstallonedrive" Content="OneDrive" Margin="5,0"/> <CheckBox Name="WPFInstallonedrive" Content="OneDrive" Margin="5,0"/>
<CheckBox Name="WPFInstallpowershell" Content="PowerShell" Margin="5,0"/> <CheckBox Name="WPFInstallpowershell" Content="PowerShell" Margin="5,0"/>
@ -345,6 +348,7 @@
</StackPanel> </StackPanel>
<StackPanel Background="{MainBackgroundColor}" SnapsToDevicePixels="True" Grid.Row="1" Grid.Column="3" Margin="10"> <StackPanel Background="{MainBackgroundColor}" SnapsToDevicePixels="True" Grid.Row="1" Grid.Column="3" Margin="10">
<Label Content="Multimedia Tools" FontSize="16" Margin="5,0"/> <Label Content="Multimedia Tools" FontSize="16" Margin="5,0"/>
<CheckBox Name="WPFInstallaimp" Content="AIMP (Music Player)" Margin="5,0"/>
<CheckBox Name="WPFInstallaudacity" Content="Audacity" Margin="5,0"/> <CheckBox Name="WPFInstallaudacity" Content="Audacity" Margin="5,0"/>
<CheckBox Name="WPFInstallblender" Content="Blender (3D Graphics)" Margin="5,0"/> <CheckBox Name="WPFInstallblender" Content="Blender (3D Graphics)" Margin="5,0"/>
<CheckBox Name="WPFInstallcider" Content="Cider (FOSS Music Player)" Margin="5,0"/> <CheckBox Name="WPFInstallcider" Content="Cider (FOSS Music Player)" Margin="5,0"/>
@ -380,6 +384,7 @@
<CheckBox Name="WPFInstallputty" Content="Putty" Margin="5,0"/> <CheckBox Name="WPFInstallputty" Content="Putty" Margin="5,0"/>
<CheckBox Name="WPFInstallrustdesk" Content="Rust Remote Desktop (FOSS)" Margin="5,0"/> <CheckBox Name="WPFInstallrustdesk" Content="Rust Remote Desktop (FOSS)" Margin="5,0"/>
<CheckBox Name="WPFInstallsimplewall" Content="SimpleWall" Margin="5,0"/> <CheckBox Name="WPFInstallsimplewall" Content="SimpleWall" Margin="5,0"/>
<CheckBox Name="WPFInstallventoy" Content="Ventoy" Margin="5,0"/>
<CheckBox Name="WPFInstallwinscp" Content="WinSCP" Margin="5,0"/> <CheckBox Name="WPFInstallwinscp" Content="WinSCP" Margin="5,0"/>
<CheckBox Name="WPFInstallwireshark" Content="WireShark" Margin="5,0"/> <CheckBox Name="WPFInstallwireshark" Content="WireShark" Margin="5,0"/>
</StackPanel> </StackPanel>
@ -405,6 +410,7 @@
<CheckBox Name="WPFInstallkeepass" Content="KeePassXC" Margin="5,0"/> <CheckBox Name="WPFInstallkeepass" Content="KeePassXC" Margin="5,0"/>
<CheckBox Name="WPFInstallmalwarebytes" Content="MalwareBytes" Margin="5,0"/> <CheckBox Name="WPFInstallmalwarebytes" Content="MalwareBytes" Margin="5,0"/>
<CheckBox Name="WPFInstallmonitorian" Content="Monitorian" Margin="5,0"/> <CheckBox Name="WPFInstallmonitorian" Content="Monitorian" Margin="5,0"/>
<CheckBox Name="WPFInstallmsiafterburner" Content="MSI Afterburner" Margin="5,0"/>
<CheckBox Name="WPFInstallnanazip" Content="NanaZip" Margin="5,0"/> <CheckBox Name="WPFInstallnanazip" Content="NanaZip" Margin="5,0"/>
<CheckBox Name="WPFInstallnvclean" Content="NVCleanstall" Margin="5,0"/> <CheckBox Name="WPFInstallnvclean" Content="NVCleanstall" Margin="5,0"/>
<CheckBox Name="WPFInstallopenshell" Content="Open Shell (Start Menu)" Margin="5,0"/> <CheckBox Name="WPFInstallopenshell" Content="Open Shell (Start Menu)" Margin="5,0"/>
@ -416,6 +422,7 @@
<CheckBox Name="WPFInstallsandboxie" Content="Sandboxie Plus" Margin="5,0"/> <CheckBox Name="WPFInstallsandboxie" Content="Sandboxie Plus" Margin="5,0"/>
<CheckBox Name="WPFInstallshell" Content="Shell (Expanded Context Menu)" Margin="5,0"/> <CheckBox Name="WPFInstallshell" Content="Shell (Expanded Context Menu)" Margin="5,0"/>
<CheckBox Name="WPFInstallsdio" Content="Snappy Driver Installer Origin" Margin="5,0"/> <CheckBox Name="WPFInstallsdio" Content="Snappy Driver Installer Origin" Margin="5,0"/>
<CheckBox Name="WPFInstallsuperf4" Content="SuperF4" Margin="5,0"/>
<CheckBox Name="WPFInstallteamviewer" Content="TeamViewer" Margin="5,0"/> <CheckBox Name="WPFInstallteamviewer" Content="TeamViewer" Margin="5,0"/>
<CheckBox Name="WPFInstallttaskbar" Content="Translucent Taskbar" Margin="5,0"/> <CheckBox Name="WPFInstallttaskbar" Content="Translucent Taskbar" Margin="5,0"/>
<CheckBox Name="WPFInstalltreesize" Content="TreeSize Free" Margin="5,0"/> <CheckBox Name="WPFInstalltreesize" Content="TreeSize Free" Margin="5,0"/>
@ -425,6 +432,7 @@
<CheckBox Name="WPFInstallwiztree" Content="WizTree" Margin="5,0"/> <CheckBox Name="WPFInstallwiztree" Content="WizTree" Margin="5,0"/>
<CheckBox Name="WPFInstallwinrar" Content="WinRAR" Margin="5,0"/> <CheckBox Name="WPFInstallwinrar" Content="WinRAR" Margin="5,0"/>
<CheckBox Name="WPFInstallxdm" Content="Xtreme Download Manager" Margin="5,0"/> <CheckBox Name="WPFInstallxdm" Content="Xtreme Download Manager" Margin="5,0"/>
<CheckBox Name="WPFInstallzerotierone" Content="ZeroTier One" Margin="5,0"/>
</StackPanel> </StackPanel>
</Grid> </Grid>
</TabItem> </TabItem>
@ -485,14 +493,14 @@
<Label Content="On" /> <Label Content="On" />
</StackPanel> </StackPanel>
<Label Content="Performance Plans" /> <Label Content="Performance Plans" />
<Button Name="WPFAddUltPerf" Content="Add Ultimate Performance Profile" HorizontalAlignment = "Left" Margin="5,2" Width="300"/> <Button Name="WPFAddUltPerf" Content="Add and Activate Ultimate Performance Profile" HorizontalAlignment = "Left" Margin="5,2" Width="300"/>
<Button Name="WPFRemoveUltPerf" Content="Remove Ultimate Performance Profile" HorizontalAlignment = "Left" Margin="5,2" Width="300"/> <Button Name="WPFRemoveUltPerf" Content="Remove Ultimate Performance Profile" HorizontalAlignment = "Left" Margin="5,2" Width="300"/>
<Label Content="Shortcuts" /> <Label Content="Shortcuts" />
<Button Name="WPFWinUtilShortcut" Content="Create WinUtil Shortcut" HorizontalAlignment = "Left" Margin="5,0" Padding="20,5" Width="300"/> <Button Name="WPFWinUtilShortcut" Content="Create WinUtil Shortcut" HorizontalAlignment = "Left" Margin="5,0" Padding="20,5" Width="300"/>
</StackPanel> </StackPanel>
<StackPanel Background="{MainBackgroundColor}" SnapsToDevicePixels="True" Grid.Row="1" Grid.Column="1" Margin="10,5"> <StackPanel Background="{MainBackgroundColor}" SnapsToDevicePixels="True" Grid.Row="1" Grid.Column="1" Margin="10,5">
<Label FontSize="16" Content="Misc. Tweaks"/> <Label FontSize="16" Content="Advanced Tweaks - CAUTION"/>
<CheckBox Name="WPFMiscTweaksNum" Content="Enable NumLock on Startup" Margin="5,0" ToolTip="This creates a time vortex and sends you back to the past... or it simply turns numlock on at startup"/> <CheckBox Name="WPFMiscTweaksNum" Content="Enable NumLock on Startup" Margin="5,0" ToolTip="This creates a time vortex and sends you back to the past... or it simply turns numlock on at startup"/>
<CheckBox Name="WPFMiscTweaksLapNum" Content="Disable Numlock on Startup" Margin="5,0" ToolTip="Disables Numlock... Very useful when you are on a laptop WITHOUT 9-key and this fixes that issue when the numlock is enabled!"/> <CheckBox Name="WPFMiscTweaksLapNum" Content="Disable Numlock on Startup" Margin="5,0" ToolTip="Disables Numlock... Very useful when you are on a laptop WITHOUT 9-key and this fixes that issue when the numlock is enabled!"/>
<CheckBox Name="WPFMiscTweaksExt" Content="Show File Extensions" Margin="5,0"/> <CheckBox Name="WPFMiscTweaksExt" Content="Show File Extensions" Margin="5,0"/>
@ -500,8 +508,8 @@
<CheckBox Name="WPFMiscTweaksUTC" Content="Set Time to UTC (Dual Boot)" Margin="5,0" ToolTip="Essential for computers that are dual booting. Fixes the time sync with Linux Systems."/> <CheckBox Name="WPFMiscTweaksUTC" Content="Set Time to UTC (Dual Boot)" Margin="5,0" ToolTip="Essential for computers that are dual booting. Fixes the time sync with Linux Systems."/>
<CheckBox Name="WPFMiscTweaksDisableUAC" Content="Disable UAC" Margin="5,0" ToolTip="Disables User Account Control. Only recommended for Expert Users."/> <CheckBox Name="WPFMiscTweaksDisableUAC" Content="Disable UAC" Margin="5,0" ToolTip="Disables User Account Control. Only recommended for Expert Users."/>
<CheckBox Name="WPFMiscTweaksDisableNotifications" Content="Disable Notification Tray/Calendar" Margin="5,0" ToolTip="Disables all Notifications INCLUDING Calendar"/> <CheckBox Name="WPFMiscTweaksDisableNotifications" Content="Disable Notification Tray/Calendar" Margin="5,0" ToolTip="Disables all Notifications INCLUDING Calendar"/>
<CheckBox Name="WPFEssTweaksDeBloat" Content="Remove ALL MS Store Apps" Margin="5,0" ToolTip="USE WITH CAUTION!!!!! This will remove ALL Microsoft store apps other than the essentials to make winget work. Games installed by MS Store ARE INCLUDED!"/> <CheckBox Name="WPFEssTweaksDeBloat" Content="Remove ALL MS Store Apps - NOT RECOMMENDED" Margin="5,0" ToolTip="USE WITH CAUTION!!!!! This will remove ALL Microsoft store apps other than the essentials to make winget work. Games installed by MS Store ARE INCLUDED!"/>
<CheckBox Name="WPFEssTweaksRemoveEdge" Content="Remove Microsoft Edge" Margin="5,0" ToolTip="Removes MS Edge when it gets reinstalled by updates."/> <CheckBox Name="WPFEssTweaksRemoveEdge" Content="Remove Microsoft Edge - NOT RECOMMENDED" Margin="5,0" ToolTip="Removes MS Edge when it gets reinstalled by updates."/>
<CheckBox Name="WPFEssTweaksRemoveOnedrive" Content="Remove OneDrive" Margin="5,0" ToolTip="Copies OneDrive files to Default Home Folders and Uninstalls it."/> <CheckBox Name="WPFEssTweaksRemoveOnedrive" Content="Remove OneDrive" Margin="5,0" ToolTip="Copies OneDrive files to Default Home Folders and Uninstalls it."/>
<CheckBox Name="WPFMiscTweaksRightClickMenu" Content="Set Classic Right-Click Menu " Margin="5,0" ToolTip="Great Windows 11 tweak to bring back good context menus when right clicking things in explorer."/> <CheckBox Name="WPFMiscTweaksRightClickMenu" Content="Set Classic Right-Click Menu " Margin="5,0" ToolTip="Great Windows 11 tweak to bring back good context menus when right clicking things in explorer."/>
<CheckBox Name="WPFMiscTweaksDisableMouseAcceleration" Content="Disable Mouse Acceleration" Margin="5,0" ToolTip="Disables Mouse Acceleration."/> <CheckBox Name="WPFMiscTweaksDisableMouseAcceleration" Content="Disable Mouse Acceleration" Margin="5,0" ToolTip="Disables Mouse Acceleration."/>
@ -511,17 +519,17 @@
<CheckBox Name="WPFMiscTweaksEnableipsix" Content="Enable IPv6" Margin="5,0" ToolTip="Enables IPv6."/> <CheckBox Name="WPFMiscTweaksEnableipsix" Content="Enable IPv6" Margin="5,0" ToolTip="Enables IPv6."/>
<Label Content="DNS" /> <Label Content="DNS" />
<ComboBox Name="WPFchangedns" Height = "20" Width = "160" HorizontalAlignment = "Left" Margin="5,5"> <ComboBox Name="WPFchangedns" Height = "20" Width = "160" HorizontalAlignment = "Left" Margin="5,5">
<ComboBoxItem IsSelected="True" Content = "Default"/> <ComboBoxItem IsSelected="True" Content = "Default"/>
<ComboBoxItem Content = "DHCP"/> <ComboBoxItem Content = "DHCP"/>
<ComboBoxItem Content = "Google"/> <ComboBoxItem Content = "Google"/>
<ComboBoxItem Content = "Cloudflare"/> <ComboBoxItem Content = "Cloudflare"/>
<ComboBoxItem Content = "Cloudflare_Malware"/> <ComboBoxItem Content = "Cloudflare_Malware"/>
<ComboBoxItem Content = "Cloudflare_Malware_Adult"/> <ComboBoxItem Content = "Cloudflare_Malware_Adult"/>
<ComboBoxItem Content = "Level3"/> <ComboBoxItem Content = "Level3"/>
<ComboBoxItem Content = "Open_DNS"/> <ComboBoxItem Content = "Open_DNS"/>
<ComboBoxItem Content = "Quad9"/> <ComboBoxItem Content = "Quad9"/>
</ComboBox> </ComboBox>
<Button Name="WPFtweaksbutton" Content="Run Tweaks" HorizontalAlignment = "Left" Width="160"/> <Button Name="WPFtweaksbutton" Content="Run Tweaks" HorizontalAlignment = "Left" Width="160"/>
<Button Name="WPFundoall" Content="Undo Selected Tweaks" HorizontalAlignment = "Left" Width="160"/> <Button Name="WPFundoall" Content="Undo Selected Tweaks" HorizontalAlignment = "Left" Width="160"/>
</StackPanel> </StackPanel>