From 2c6b4598707b8f29c2bddf74bf92e52d5cf72380 Mon Sep 17 00:00:00 2001 From: Chris Titus Date: Tue, 16 May 2023 14:52:11 -0500 Subject: [PATCH] Fix power profile (#766) * Fix power profile query * fix syntax * fix * Update Invoke-WPFUltimatePerformance.ps1 * Update winutil.ps1 * power profile fix --- .../public/Invoke-WPFUltimatePerformance.ps1 | 68 +- winutil.ps1 | 10914 ++++++++-------- 2 files changed, 5533 insertions(+), 5449 deletions(-) diff --git a/functions/public/Invoke-WPFUltimatePerformance.ps1 b/functions/public/Invoke-WPFUltimatePerformance.ps1 index bdcb458f..b94e32cc 100644 --- a/functions/public/Invoke-WPFUltimatePerformance.ps1 +++ b/functions/public/Invoke-WPFUltimatePerformance.ps1 @@ -7,24 +7,66 @@ Function Invoke-WPFUltimatePerformance { #> param($State) Try{ - $guid = "e9a42b02-d5df-448d-aa00-03f14749eb61" if($state -eq "Enabled"){ - Write-Host "Adding Ultimate Performance Profile" - [scriptblock]$command = {powercfg -duplicatescheme $guid} - - } - if($state -eq "Disabled"){ - Write-Host "Removing Ultimate Performance Profile" - [scriptblock]$command = {powercfg -delete $guid} + # Define the name and GUID of the power scheme you want to add + $powerSchemeName = "Ultimate Performance" + $powerSchemeGuid = "e9a42b02-d5df-448d-aa00-03f14749eb61" + + # Get all power schemes + $schemes = powercfg /list | Out-String -Stream + + # Find the scheme you want to add + $ultimateScheme = $schemes | Where-Object { $_ -match $powerSchemeName } + + # If the scheme does not exist, add it + if ($null -eq $ultimateScheme) { + Write-Host "Power scheme '$powerSchemeName' not found. Adding..." + + # Add the power scheme + powercfg /duplicatescheme $powerSchemeGuid + + Write-Host "Power scheme added successfully." + } + else { + Write-Host "Power scheme '$powerSchemeName' already exists." + } } + elseif($state -eq "Disabled"){ + # Define the name of the power scheme you want to remove + $powerSchemeName = "Ultimate Performance" + + # Get all power schemes + $schemes = powercfg /list | Out-String -Stream + + # Find the scheme you want to remove + $ultimateScheme = $schemes | Where-Object { $_ -match $powerSchemeName } + + # If the scheme exists, remove it + if ($null -ne $ultimateScheme) { + # Extract the GUID of the power scheme + $guid = ($ultimateScheme -split '\s+')[3] + + if($null -ne $guid){ + Write-Host "Found power scheme '$powerSchemeName' with GUID $guid. Removing..." + + # Remove the power scheme + powercfg /delete $guid + + Write-Host "Power scheme removed successfully." + } + else { + Write-Host "Could not find GUID for power scheme '$powerSchemeName'." + } + } + else { + Write-Host "Power scheme '$powerSchemeName' not found." + } + + } - $output = Invoke-Command -ScriptBlock $command - if($output -like "*does not exist*"){ - throw [GenericException]::new('Failed to modify profile') - } } Catch{ Write-Warning $psitem.Exception.Message } -} \ No newline at end of file +} diff --git a/winutil.ps1 b/winutil.ps1 index 524eef2c..ef0239c1 100644 --- a/winutil.ps1 +++ b/winutil.ps1 @@ -1,5436 +1,5478 @@ - -################################################################################################################ -### ### -### WARNING: This file is automatically generated DO NOT modify this file directly as it will be overwritten ### -### ### -################################################################################################################ - -<# -.NOTES - Author : Chris Titus @christitustech - Runspace Author: @DeveloperDurp - GitHub : https://github.com/ChrisTitusTech - Version : 23.05.16 -#> - -Start-Transcript $ENV:TEMP\Winutil.log -Append - -#Load DLLs -Add-Type -AssemblyName System.Windows.Forms - -# variable to sync between runspaces -$sync = [Hashtable]::Synchronized(@{}) -$sync.PSScriptRoot = $PSScriptRoot -$sync.version = "23.05.16" -$sync.configs = @{} -$sync.ProcessRunning = $false -Function Get-WinUtilCheckBoxes { - - <# - - .DESCRIPTION - Function is meant to find all checkboxes that are checked on the specefic tab and input them into a script. - - Outputed data will be the names of the checkboxes that were checked - - .EXAMPLE - - Get-WinUtilCheckBoxes "WPFInstall" - - #> - - Param( - $Group, - [boolean]$unCheck = $true - ) - - - $Output = New-Object System.Collections.Generic.List[System.Object] - - if($Group -eq "WPFInstall"){ - $filter = Get-WinUtilVariables -Type Checkbox | Where-Object {$psitem -like "WPFInstall*"} - $CheckBoxes = $sync.GetEnumerator() | Where-Object {$psitem.Key -in $filter} - Foreach ($CheckBox in $CheckBoxes){ - if($CheckBox.value.ischecked -eq $true){ - $sync.configs.applications.$($CheckBox.Name).winget -split ";" | ForEach-Object { - $Output.Add($psitem) - } - if ($uncheck -eq $true){ - $CheckBox.value.ischecked = $false - } - - } - } - } - - if($Group -eq "WPFTweaks"){ - $filter = Get-WinUtilVariables -Type Checkbox | Where-Object {$psitem -like "WPF*Tweaks*"} - $CheckBoxes = $sync.GetEnumerator() | Where-Object {$psitem.Key -in $filter} - Foreach ($CheckBox in $CheckBoxes){ - if($CheckBox.value.ischecked -eq $true){ - $Output.Add($Checkbox.Name) - - if ($uncheck -eq $true){ - $CheckBox.value.ischecked = $false - } - } - } - } - - if($Group -eq "WPFFeature"){ - $filter = Get-WinUtilVariables -Type Checkbox | Where-Object {$psitem -like "WPF*Feature*"} - $CheckBoxes = $sync.GetEnumerator() | Where-Object {$psitem.Key -in $filter} - Foreach ($CheckBox in $CheckBoxes){ - if($CheckBox.value.ischecked -eq $true){ - $Output.Add($Checkbox.Name) - - if ($uncheck -eq $true){ - $CheckBox.value.ischecked = $false - } - } - } - } - - Write-Output $($Output | Select-Object -Unique) -} -Function Get-WinUtilDarkMode { - <# - - .DESCRIPTION - Meant to pull the registry keys responsible for Dark Mode and returns true or false - - #> - $app = (Get-ItemProperty -path 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize').AppsUseLightTheme - $system = (Get-ItemProperty -path 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize').SystemUsesLightTheme - if($app -eq 0 -and $system -eq 0){ - return $true - } - else{ - return $false - } -} -function Get-WinUtilInstallerProcess { - <# - - .DESCRIPTION - Meant to check for running processes and will return a boolean response - - #> - - param($Process) - - if ($Null -eq $Process){ - return $false - } - if (Get-Process -Id $Process.Id -ErrorAction SilentlyContinue){ - return $true - } - return $false -} -function Get-WinUtilRegistry { - <# - - .DESCRIPTION - This function will make all modifications to the registry - - .EXAMPLE - - Set-WinUtilRegistry -Name "PublishUserActivities" -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System" -Type "DWord" -Value "0" - - #> - param ( - $Name, - $Path, - $Type, - $Value - ) - - Try{ - $syscheckvalue = Get-ItemPropertyValue -Path $Path -Value $Value # Return Value - - } - Catch [System.Security.SecurityException] { - Write-Warning "Unable to set $Path\$Name to $Value due to a Security Exception" - } - Catch [System.Management.Automation.ItemNotFoundException] { - Write-Warning $psitem.Exception.ErrorRecord - } - Catch{ - Write-Warning "Unable to set $Name due to unhandled exception" - Write-Warning $psitem.Exception.StackTrace - } -} -function Get-WinUtilVariables { - - <# - - .DESCRIPTION - palceholder - - #> - param ( - [Parameter()] - [ValidateSet("CheckBox", "Button")] - [string]$Type - ) - - $keys = $sync.keys | Where-Object {$psitem -like "WPF*"} - - if($type){ - $output = $keys | ForEach-Object { - Try{ - if ($sync["$psitem"].GetType() -like "*$type*"){ - Write-Output $psitem - } - } - Catch{<#I am here so errors don't get outputted for a couple variables that don't have the .GetType() attribute#>} - } - return $output - } - return $keys -} -function Install-WinUtilChoco { - - <# - - .DESCRIPTION - Function is meant to ensure Choco is installed - - #> - - try{ - Write-Host "Checking if Chocolatey is Installed..." - - if((Test-WinUtilPackageManager -choco)){ - Write-Host "Chocolatey Already Installed" - return - } - - Write-Host "Seems Chocolatey is not installed, installing now?" - #Let user decide if he wants to install Chocolatey - $confirmation = Read-Host "Are you Sure You Want To Proceed:(y/n)" - 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{ - throw [ChocoFailedInstall]::new('Failed to install') - } - -} -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. - - #> - - param( - $ProgramsToInstall, - $manage = "Installing" - ) - - $x = 0 - $count = $($ProgramsToInstall -split ",").Count - - Write-Progress -Activity "$manage Applications" -Status "Starting" -PercentComplete 0 - - Foreach ($Program in $($ProgramsToInstall -split ",")){ - - Write-Progress -Activity "$manage Applications" -Status "$manage $Program $($x + 1) of $count" -PercentComplete $($x/$count*100) - if($manage -eq "Installing"){ - Start-Process -FilePath winget -ArgumentList "install -e --accept-source-agreements --accept-package-agreements --silent $Program" -NoNewWindow -Wait - } - if($manage -eq "Uninstalling"){ - Start-Process -FilePath winget -ArgumentList "remove -e --purge --force --silent $Program" -NoNewWindow -Wait - } - - $X++ - } - - Write-Progress -Activity "$manage Applications" -Status "Finished" -Completed - -} -function Install-WinUtilWinget { - - <# - - .DESCRIPTION - Function is meant to ensure winget is installed - - #> - Try{ - Write-Host "Checking if Winget is Installed..." - if (Test-WinUtilPackageManager -winget) { - #Checks if winget executable exists and if the Windows Version is 1809 or higher - Write-Host "Winget Already Installed" - return - } - - #Gets the computer's information - if ($null -eq $sync.ComputerInfo){ - $ComputerInfo = Get-ComputerInfo -ErrorAction Stop - } - Else { - $ComputerInfo = $sync.ComputerInfo - } - - if (($ComputerInfo.WindowsVersion) -lt "1809") { - #Checks if Windows Version is too old for winget - Write-Host "Winget is not supported on this version of Windows (Pre-1809)" - return - } - - #Gets the Windows Edition - $OSName = if ($ComputerInfo.OSName) { - $ComputerInfo.OSName - }else { - $ComputerInfo.WindowsProductName - } - - if (((($OSName.IndexOf("LTSC")) -ne -1) -or ($OSName.IndexOf("Server") -ne -1)) -and (($ComputerInfo.WindowsVersion) -ge "1809")) { - - Write-Host "Running Alternative Installer for LTSC/Server Editions" - - # Switching to winget-install from PSGallery from asheroto - # Source: https://github.com/asheroto/winget-installer - - #adding the code from the asheroto repo - Set-ExecutionPolicy RemoteSigned -force - Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force - Set-PSRepository -Name 'PSGallery' -InstallationPolicy Trusted - Install-Script -Name winget-install -force - winget-instal - - - Start-Process powershell.exe -Verb RunAs -ArgumentList "-command irm https://raw.githubusercontent.com/ChrisTitusTech/winutil/$BranchToUse/winget.ps1 | iex | Out-Host" -WindowStyle Normal -ErrorAction Stop - - if(!(Test-WinUtilPackageManager -winget)){ - break - } - } - - else { - #Installing Winget from the Microsoft Store - Write-Host "Winget not found, installing it now." - Start-Process "ms-appinstaller:?source=https://aka.ms/getwinget" - $nid = (Get-Process AppInstaller).Id - Wait-Process -Id $nid - - if(!(Test-WinUtilPackageManager -winget)){ - break - } - } - Write-Host "Winget Installed" - } - Catch{ - throw [WingetFailedInstall]::new('Failed to install') - } -} -Function Invoke-WinUtilCurrentSystem { - - <# - - .DESCRIPTION - Function is meant to read existing system registry and check according configuration. - - Example: Is telemetry enabled? check the box. - - .EXAMPLE - - Get-WinUtilCheckBoxes "WPFInstall" - - #> - - param( - $CheckBox - ) - - if ($checkbox -eq "winget"){ - - $originalEncoding = [Console]::OutputEncoding - [Console]::OutputEncoding = [System.Text.UTF8Encoding]::new() - $Sync.InstalledPrograms = winget list -s winget | Select-Object -skip 3 | ConvertFrom-String -PropertyNames "Name", "Id", "Version", "Available" -Delimiter '\s{2,}' - [Console]::OutputEncoding = $originalEncoding - - $filter = Get-WinUtilVariables -Type Checkbox | Where-Object {$psitem -like "WPFInstall*"} - $sync.GetEnumerator() | Where-Object {$psitem.Key -in $filter} | ForEach-Object { - if($sync.configs.applications.$($psitem.Key).winget -in $sync.InstalledPrograms.Id){ - Write-Output $psitem.name - } - } - } - - if($CheckBox -eq "tweaks"){ - - if(!(Test-Path 'HKU:\')){New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS} - $ScheduledTasks = Get-ScheduledTask - - $sync.configs.tweaks | Get-Member -MemberType NoteProperty | ForEach-Object { - - $Config = $psitem.Name - #WPFEssTweaksTele - $registryKeys = $sync.configs.tweaks.$Config.registry - $scheduledtaskKeys = $sync.configs.tweaks.$Config.scheduledtask - $serviceKeys = $sync.configs.tweaks.$Config.service - - if($registryKeys -or $scheduledtaskKeys -or $serviceKeys){ - $Values = @() - - - Foreach ($tweaks in $registryKeys){ - Foreach($tweak in $tweaks){ - - if(test-path $tweak.Path){ - $actualValue = Get-ItemProperty -Name $tweak.Name -Path $tweak.Path -ErrorAction SilentlyContinue | Select-Object -ExpandProperty $($tweak.Name) - $expectedValue = $tweak.Value - if ($expectedValue -notlike $actualValue){ - $values += $False - } - } - } - } - - Foreach ($tweaks in $scheduledtaskKeys){ - Foreach($tweak in $tweaks){ - $task = $ScheduledTasks | Where-Object {$($psitem.TaskPath + $psitem.TaskName) -like "\$($tweak.name)"} - - if($task){ - $actualValue = $task.State - $expectedValue = $tweak.State - if ($expectedValue -ne $actualValue){ - $values += $False - } - } - } - } - - Foreach ($tweaks in $serviceKeys){ - Foreach($tweak in $tweaks){ - $Service = Get-Service -Name $tweak.Name - - if($Service){ - $actualValue = $Service.StartType - $expectedValue = $tweak.StartupType - if ($expectedValue -ne $actualValue){ - $values += $False - } - } - } - } - - if($values -notcontains $false){ - Write-Output $Config - } - } - } - } -} - -function Invoke-WinUtilFeatureInstall { - <# - - .DESCRIPTION - This function converts all the values from the tweaks.json and routes them to the appropriate function - - #> - - param( - $CheckBox - ) - - $CheckBox | ForEach-Object { - if($sync.configs.feature.$psitem.feature){ - Foreach( $feature in $sync.configs.feature.$psitem.feature ){ - Try{ - Write-Host "Installing $feature" - Enable-WindowsOptionalFeature -Online -FeatureName $feature -All -NoRestart - } - Catch{ - if ($psitem.Exception.Message -like "*requires elevation*"){ - Write-Warning "Unable to Install $feature due to permissions. Are you running as admin?" - } - - else{ - Write-Warning "Unable to Install $feature due to unhandled exception" - Write-Warning $psitem.Exception.StackTrace - } - } - } - } - if($sync.configs.feature.$psitem.InvokeScript){ - Foreach( $script in $sync.configs.feature.$psitem.InvokeScript ){ - Try{ - $Scriptblock = [scriptblock]::Create($script) - - Write-Host "Running Script for $psitem" - Invoke-Command $scriptblock -ErrorAction stop - } - Catch{ - if ($psitem.Exception.Message -like "*requires elevation*"){ - Write-Warning "Unable to Install $feature due to permissions. Are you running as admin?" - } - - else{ - Write-Warning "Unable to Install $feature due to unhandled exception" - Write-Warning $psitem.Exception.StackTrace - } - } - } - } - } -} -function Invoke-WinUtilScript { - <# - - .DESCRIPTION - This function will run a seperate powershell script. Meant for things that can't be handled with the other functions - - .EXAMPLE - - $Scriptblock = [scriptblock]::Create({"Write-output 'Hello World'"}) - Invoke-WinUtilScript -ScriptBlock $scriptblock -Name "Hello World" - - #> - param ( - $Name, - [scriptblock]$scriptblock - ) - - Try { - Write-Host "Running Script for $name" - Invoke-Command $scriptblock -ErrorAction Stop - } - Catch [System.Management.Automation.CommandNotFoundException] { - Write-Warning "The specified command was not found." - Write-Warning $PSItem.Exception.message - } - Catch [System.Management.Automation.RuntimeException] { - Write-Warning "A runtime exception occurred." - Write-Warning $PSItem.Exception.message - } - Catch [System.Security.SecurityException] { - Write-Warning "A security exception occurred." - Write-Warning $PSItem.Exception.message - } - Catch [System.UnauthorizedAccessException] { - Write-Warning "Access denied. You do not have permission to perform this operation." - Write-Warning $PSItem.Exception.message - } - Catch { - # Generic catch block to handle any other type of exception - Write-Warning "Unable to run script for $name due to unhandled exception" - Write-Warning $psitem.Exception.StackTrace - } - -} -function Invoke-WinUtilTweaks { - <# - - .DESCRIPTION - This function converts all the values from the tweaks.json and routes them to the appropriate function - - #> - - param( - $CheckBox, - $undo = $false - ) - if($undo){ - $Values = @{ - Registry = "OriginalValue" - ScheduledTask = "OriginalState" - Service = "OriginalType" - } - } - Else{ - $Values = @{ - Registry = "Value" - ScheduledTask = "State" - Service = "StartupType" - } - } - - if($sync.configs.tweaks.$CheckBox.registry){ - $sync.configs.tweaks.$CheckBox.registry | ForEach-Object { - Set-WinUtilRegistry -Name $psitem.Name -Path $psitem.Path -Type $psitem.Type -Value $psitem.$($values.registry) - } - } - if($sync.configs.tweaks.$CheckBox.ScheduledTask){ - $sync.configs.tweaks.$CheckBox.ScheduledTask | ForEach-Object { - Set-WinUtilScheduledTask -Name $psitem.Name -State $psitem.$($values.ScheduledTask) - } - } - if($sync.configs.tweaks.$CheckBox.service){ - $sync.configs.tweaks.$CheckBox.service | ForEach-Object { - Set-WinUtilService -Name $psitem.Name -StartupType $psitem.$($values.Service) - } - } - - if(!$undo){ - if($sync.configs.tweaks.$CheckBox.appx){ - $sync.configs.tweaks.$CheckBox.appx | ForEach-Object { - Remove-WinUtilAPPX -Name $psitem - } - } - if($sync.configs.tweaks.$CheckBox.InvokeScript){ - $sync.configs.tweaks.$CheckBox.InvokeScript | ForEach-Object { - $Scriptblock = [scriptblock]::Create($psitem) - Invoke-WinUtilScript -ScriptBlock $scriptblock -Name $CheckBox - } - } - } -} -function Remove-WinUtilAPPX { - <# - - .DESCRIPTION - This function will remove any of the provided APPX names - - .EXAMPLE - - Remove-WinUtilAPPX -Name "Microsoft.Microsoft3DViewer" - - #> - param ( - $Name - ) - - Try{ - Write-Host "Removing $Name" - Get-AppxPackage "*$Name*" | Remove-AppxPackage -ErrorAction SilentlyContinue - Get-AppxProvisionedPackage -Online | Where-Object DisplayName -like "*$Name*" | Remove-AppxProvisionedPackage -Online -ErrorAction SilentlyContinue - } - Catch [System.Exception] { - if($psitem.Exception.Message -like "*The requested operation requires elevation*"){ - Write-Warning "Unable to uninstall $name due to a Security Exception" - } - Else{ - Write-Warning "Unable to uninstall $name due to unhandled exception" - Write-Warning $psitem.Exception.StackTrace - } - } - Catch{ - Write-Warning "Unable to uninstall $name due to unhandled exception" - Write-Warning $psitem.Exception.StackTrace - } -} -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 - - Set-WinUtilDNS -DNSProvider "google" - - #> - param($DNSProvider) - if($DNSProvider -eq "Default"){return} - Try{ - $Adapters = Get-NetAdapter | Where-Object {$_.Status -eq "Up"} - Write-Host "Ensuring DNS is set to $DNSProvider on the following interfaces" - Write-Host $($Adapters | Out-String) - - Foreach ($Adapter in $Adapters){ - if($DNSProvider -eq "DHCP"){ - Set-DnsClientServerAddress -InterfaceIndex $Adapter.ifIndex -ResetServerAddresses - } - Else{ - Set-DnsClientServerAddress -InterfaceIndex $Adapter.ifIndex -ServerAddresses ("$($sync.configs.dns.$DNSProvider.Primary)", "$($sync.configs.dns.$DNSProvider.Secondary)") - } - } - } - Catch{ - Write-Warning "Unable to set DNS Provider due to an unhandled exception" - Write-Warning $psitem.Exception.StackTrace - } -} -function Set-WinUtilRegistry { - <# - - .DESCRIPTION - This function will make all modifications to the registry - - .EXAMPLE - - Set-WinUtilRegistry -Name "PublishUserActivities" -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System" -Type "DWord" -Value "0" - - #> - param ( - $Name, - $Path, - $Type, - $Value - ) - - Try{ - if(!(Test-Path 'HKU:\')){New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS} - - If (!(Test-Path $Path)) { - Write-Host "$Path was not found, Creating..." - New-Item -Path $Path -Force -ErrorAction Stop | Out-Null - } - - Write-Host "Set $Path\$Name to $Value" - Set-ItemProperty -Path $Path -Name $Name -Type $Type -Value $Value -Force -ErrorAction Stop | Out-Null - } - Catch [System.Security.SecurityException] { - Write-Warning "Unable to set $Path\$Name to $Value due to a Security Exception" - } - Catch [System.Management.Automation.ItemNotFoundException] { - Write-Warning $psitem.Exception.ErrorRecord - } - Catch{ - Write-Warning "Unable to set $Name due to unhandled exception" - Write-Warning $psitem.Exception.StackTrace - } -} -function Set-WinUtilScheduledTask { - <# - - .DESCRIPTION - This function will enable/disable the provided Scheduled Task - - .EXAMPLE - - Set-WinUtilScheduledTask -Name "Microsoft\Windows\Application Experience\Microsoft Compatibility Appraiser" -State "Disabled" - - #> - param ( - $Name, - $State - ) - - Try{ - if($State -eq "Disabled"){ - Write-Host "Disabling Scheduled Task $Name" - Disable-ScheduledTask -TaskName $Name -ErrorAction Stop - } - if($State -eq "Enabled"){ - Write-Host "Enabling Scheduled Task $Name" - Enable-ScheduledTask -TaskName $Name -ErrorAction Stop - } - } - Catch [System.Exception]{ - if($psitem.Exception.Message -like "*The system cannot find the file specified*"){ - Write-Warning "Scheduled Task $name was not Found" - } - Else{ - Write-Warning "Unable to set $Name due to unhandled exception" - Write-Warning $psitem.Exception.Message - } - } - Catch{ - Write-Warning "Unable to run script for $name due to unhandled exception" - Write-Warning $psitem.Exception.StackTrace - } -} -Function Set-WinUtilService { - <# - - .DESCRIPTION - This function will change the startup type of services and start/stop them as needed - - .EXAMPLE - - Set-WinUtilService -Name "HomeGroupListener" -StartupType "Manual" - - #> - param ( - $Name, - $StartupType - ) - Try{ - Write-Host "Setting Services $Name to $StartupType" - Set-Service -Name $Name -StartupType $StartupType -ErrorAction Stop - - if($StartupType -eq "Disabled"){ - Write-Host "Stopping $Name" - Stop-Service -Name $Name -Force -ErrorAction Stop - } - if($StartupType -eq "Enabled"){ - Write-Host "Starting $Name" - Start-Service -Name $Name -Force -ErrorAction Stop - } - } - Catch [System.Exception]{ - if($psitem.Exception.Message -like "*Cannot find any service with service name*" -or - $psitem.Exception.Message -like "*was not found on computer*"){ - Write-Warning "Service $name was not Found" - } - Else{ - Write-Warning "Unable to set $Name due to unhandled exception" - Write-Warning $psitem.Exception.Message - } - } - Catch{ - Write-Warning "Unable to set $Name due to unhandled exception" - Write-Warning $psitem.Exception.StackTrace - } -} -function Test-WinUtilPackageManager { - <# - - .DESCRIPTION - Checks for Winget or Choco depending on the paramater - - #> - - Param( - [System.Management.Automation.SwitchParameter]$winget, - [System.Management.Automation.SwitchParameter]$choco - ) - - if($winget){ - if (Test-Path ~\AppData\Local\Microsoft\WindowsApps\winget.exe) { - return $true - } - } - - if($choco){ - if ((Get-Command -Name choco -ErrorAction Ignore) -and ($chocoVersion = (Get-Item "$env:ChocolateyInstall\choco.exe" -ErrorAction Ignore).VersionInfo.ProductVersion)){ - return $true - } - } - - return $false -} -Function Update-WinUtilProgramWinget { - - <# - - .DESCRIPTION - This will update programs via Winget using a new powershell.exe instance to prevent the GUI from locking up. - - #> - - [ScriptBlock]$wingetinstall = { - - $host.ui.RawUI.WindowTitle = """Winget Install""" - - Start-Transcript $ENV:TEMP\winget-update.log -Append - winget upgrade --all - - Pause - } - - $global:WinGetInstall = Start-Process -Verb runas powershell -ArgumentList "-command invoke-command -scriptblock {$wingetinstall} -argumentlist '$($ProgramsToInstall -join ",")'" -PassThru - -} -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 - #[System.Windows.MessageBox]::Show("$Button","Chris Titus Tech's Windows Utility","OK","Info") - - Switch -Wildcard ($Button){ - - "WPFTab?BT" {Invoke-WPFTab $Button} - "WPFinstall" {Invoke-WPFInstall} - "WPFuninstall" {Invoke-WPFUnInstall} - "WPFInstallUpgrade" {Invoke-WPFInstallUpgrade} - "WPFdesktop" {Invoke-WPFPresets "Desktop"} - "WPFlaptop" {Invoke-WPFPresets "laptop"} - "WPFminimal" {Invoke-WPFPresets "minimal"} - "WPFexport" {Invoke-WPFImpex -type "export" -CheckBox "WPFTweaks"} - "WPFimport" {Invoke-WPFImpex -type "import" -CheckBox "WPFTweaks"} - "WPFexportWinget" {Invoke-WPFImpex -type "export" -CheckBox "WPFInstall"} - "WPFimportWinget" {Invoke-WPFImpex -type "import" -CheckBox "WPFInstall"} - "WPFclear" {Invoke-WPFPresets -preset $null -imported $true} - "WPFclearWinget" {Invoke-WPFPresets -preset $null -imported $true -CheckBox "WPFInstall"} - "WPFtweaksbutton" {Invoke-WPFtweaksbutton} - "WPFAddUltPerf" {Invoke-WPFUltimatePerformance -State "Enabled"} - "WPFRemoveUltPerf" {Invoke-WPFUltimatePerformance -State "Disabled"} - "WPFToggleDarkMode" {Invoke-WPFDarkMode -DarkMoveEnabled $(Get-WinUtilDarkMode)} - "WPFundoall" {Invoke-WPFundoall} - "WPFFeatureInstall" {Invoke-WPFFeatureInstall} - "WPFPanelDISM" {Invoke-WPFPanelDISM} - "WPFPanelAutologin" {Invoke-WPFPanelAutologin} - "WPFPanelcontrol" {Invoke-WPFControlPanel -Panel $button} - "WPFPanelnetwork" {Invoke-WPFControlPanel -Panel $button} - "WPFPanelpower" {Invoke-WPFControlPanel -Panel $button} - "WPFPanelsound" {Invoke-WPFControlPanel -Panel $button} - "WPFPanelsystem" {Invoke-WPFControlPanel -Panel $button} - "WPFPaneluser" {Invoke-WPFControlPanel -Panel $button} - "WPFUpdatesdefault" {Invoke-WPFUpdatesdefault} - "WPFFixesUpdate" {Invoke-WPFFixesUpdate} - "WPFUpdatesdisable" {Invoke-WPFUpdatesdisable} - "WPFUpdatessecurity" {Invoke-WPFUpdatessecurity} - "WPFWinUtilShortcut" {Invoke-WPFShortcut -ShortcutToAdd "WinUtil"} - "WPFGetInstalled" {Invoke-WPFGetInstalled -CheckBox "winget"} - "WPFGetInstalledTweaks" {Invoke-WPFGetInstalled -CheckBox "tweaks"} - } -} -function Invoke-WPFControlPanel { - <# - - .DESCRIPTION - Simple Switch for lagacy windows - - #> - param($Panel) - - switch ($Panel){ - "WPFPanelcontrol" {cmd /c control} - "WPFPanelnetwork" {cmd /c ncpa.cpl} - "WPFPanelpower" {cmd /c powercfg.cpl} - "WPFPanelsound" {cmd /c mmsys.cpl} - "WPFPanelsystem" {cmd /c sysdm.cpl} - "WPFPaneluser" {cmd /c "control userpasswords2"} - } -} -Function Invoke-WPFDarkMode { - <# - - .DESCRIPTION - Sets Dark Mode on or off - - #> - Param($DarkMoveEnabled) - Try{ - if ($DarkMoveEnabled -eq $false){ - Write-Host "Enabling Dark Mode" - $DarkMoveValue = 0 - } - else { - Write-Host "Disabling Dark Mode" - $DarkMoveValue = 1 - } - - $Theme = "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize" - Set-ItemProperty -Path $Theme -Name AppsUseLightTheme -Value $DarkMoveValue - Set-ItemProperty -Path $Theme -Name SystemUsesLightTheme -Value $DarkMoveValue - } - Catch [System.Security.SecurityException] { - Write-Warning "Unable to set $Path\$Name to $Value due to a Security Exception" - } - Catch [System.Management.Automation.ItemNotFoundException] { - Write-Warning $psitem.Exception.ErrorRecord - } - Catch{ - Write-Warning "Unable to set $Name due to unhandled exception" - Write-Warning $psitem.Exception.StackTrace - } -} -function Invoke-WPFFeatureInstall { - <# - - .DESCRIPTION - GUI Function to install Windows Features - - #> - - if($sync.ProcessRunning){ - $msg = "Install process is currently running." - [System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning) - return - } - - $Features = Get-WinUtilCheckBoxes -Group "WPFFeature" - - Invoke-WPFRunspace -ArgumentList $Features -ScriptBlock { - param($Features) - - $sync.ProcessRunning = $true - - Invoke-WinUtilFeatureInstall $Features - - $sync.ProcessRunning = $false - Write-Host "===================================" - Write-Host "--- Features are Installed ---" - Write-Host "--- A Reboot may be required ---" - Write-Host "===================================" - - $ButtonType = [System.Windows.MessageBoxButton]::OK - $MessageboxTitle = "All features are now installed " - $Messageboxbody = ("Done") - $MessageIcon = [System.Windows.MessageBoxImage]::Information - - [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon) - } -} -function Invoke-WPFFixesUpdate { - - <# - - .DESCRIPTION - PlaceHolder - - #> - - ### Reset Windows Update Script - reregister dlls, services, and remove registry entires. - Write-Host "1. Stopping Windows Update Services..." - Stop-Service -Name BITS - Stop-Service -Name wuauserv - Stop-Service -Name appidsvc - Stop-Service -Name cryptsvc - - Write-Host "2. Remove QMGR Data file..." - Remove-Item "$env:allusersprofile\Application Data\Microsoft\Network\Downloader\qmgr*.dat" -ErrorAction SilentlyContinue - - Write-Host "3. Renaming the Software Distribution and CatRoot Folder..." - Rename-Item $env:systemroot\SoftwareDistribution SoftwareDistribution.bak -ErrorAction SilentlyContinue - Rename-Item $env:systemroot\System32\Catroot2 catroot2.bak -ErrorAction SilentlyContinue - - Write-Host "4. Removing old Windows Update log..." - Remove-Item $env:systemroot\WindowsUpdate.log -ErrorAction SilentlyContinue - - Write-Host "5. Resetting the Windows Update Services to defualt settings..." - "sc.exe sdset bits D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)" - "sc.exe sdset wuauserv D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)" - Set-Location $env:systemroot\system32 - - Write-Host "6. Registering some DLLs..." - regsvr32.exe /s atl.dll - regsvr32.exe /s urlmon.dll - regsvr32.exe /s mshtml.dll - regsvr32.exe /s shdocvw.dll - regsvr32.exe /s browseui.dll - regsvr32.exe /s jscript.dll - regsvr32.exe /s vbscript.dll - regsvr32.exe /s scrrun.dll - regsvr32.exe /s msxml.dll - regsvr32.exe /s msxml3.dll - regsvr32.exe /s msxml6.dll - regsvr32.exe /s actxprxy.dll - regsvr32.exe /s softpub.dll - regsvr32.exe /s wintrust.dll - regsvr32.exe /s dssenh.dll - regsvr32.exe /s rsaenh.dll - regsvr32.exe /s gpkcsp.dll - regsvr32.exe /s sccbase.dll - regsvr32.exe /s slbcsp.dll - regsvr32.exe /s cryptdlg.dll - regsvr32.exe /s oleaut32.dll - regsvr32.exe /s ole32.dll - regsvr32.exe /s shell32.dll - regsvr32.exe /s initpki.dll - regsvr32.exe /s wuapi.dll - regsvr32.exe /s wuaueng.dll - regsvr32.exe /s wuaueng1.dll - regsvr32.exe /s wucltui.dll - regsvr32.exe /s wups.dll - regsvr32.exe /s wups2.dll - regsvr32.exe /s wuweb.dll - regsvr32.exe /s qmgr.dll - regsvr32.exe /s qmgrprxy.dll - regsvr32.exe /s wucltux.dll - regsvr32.exe /s muweb.dll - regsvr32.exe /s wuwebv.dll - - Write-Host "7) Removing WSUS client settings..." - REG DELETE "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate" /v AccountDomainSid /f - REG DELETE "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate" /v PingID /f - REG DELETE "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate" /v SusClientId /f - - Write-Host "8) Resetting the WinSock..." - netsh winsock reset - netsh winhttp reset proxy - netsh int ip reset - - Write-Host "9) Delete all BITS jobs..." - Get-BitsTransfer | Remove-BitsTransfer - - Write-Host "10) Attempting to install the Windows Update Agent..." - If ([System.Environment]::Is64BitOperatingSystem) { - wusa Windows8-RT-KB2937636-x64 /quiet - } - else { - wusa Windows8-RT-KB2937636-x86 /quiet - } - - Write-Host "11) Starting Windows Update Services..." - Start-Service -Name BITS - Start-Service -Name wuauserv - Start-Service -Name appidsvc - Start-Service -Name cryptsvc - - Write-Host "12) Forcing discovery..." - wuauclt /resetauthorization /detectnow - - Write-Host "Process complete. Please reboot your computer." - - $ButtonType = [System.Windows.MessageBoxButton]::OK - $MessageboxTitle = "Reset Windows Update " - $Messageboxbody = ("Stock settings loaded.`n Please reboot your computer") - $MessageIcon = [System.Windows.MessageBoxImage]::Information - - [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon) - Write-Host "=================================" - Write-Host "-- Reset ALL Updates to Factory -" - Write-Host "=================================" -} -Function Invoke-WPFFormVariables { - <# - - .DESCRIPTION - PlaceHolder - - #> - #If ($global:ReadmeDisplay -ne $true) { Write-Host "If you need to reference this display again, run Get-FormVariables" -ForegroundColor Yellow; $global:ReadmeDisplay = $true } - - - Write-Host "" - Write-Host " CCCCCCCCCCCCCTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT " - Write-Host " CCC::::::::::::CT:::::::::::::::::::::TT:::::::::::::::::::::T " - Write-Host "CC:::::::::::::::CT:::::::::::::::::::::TT:::::::::::::::::::::T " - Write-Host "C:::::CCCCCCCC::::CT:::::TT:::::::TT:::::TT:::::TT:::::::TT:::::T " - Write-Host "C:::::C CCCCCCTTTTTT T:::::T TTTTTTTTTTTT T:::::T TTTTTT" - Write-Host "C:::::C T:::::T T:::::T " - Write-Host "C:::::C T:::::T T:::::T " - Write-Host "C:::::C T:::::T T:::::T " - Write-Host "C:::::C T:::::T T:::::T " - Write-Host "C:::::C T:::::T T:::::T " - Write-Host "C:::::C T:::::T T:::::T " - Write-Host "C:::::C CCCCCC T:::::T T:::::T " - Write-Host "C:::::CCCCCCCC::::C TT:::::::TT TT:::::::TT " - Write-Host "CC:::::::::::::::C T:::::::::T T:::::::::T " - Write-Host "CCC::::::::::::C T:::::::::T T:::::::::T " - Write-Host " CCCCCCCCCCCCC TTTTTTTTTTT TTTTTTTTTTT " - Write-Host "" - Write-Host "====Chris Titus Tech=====" - Write-Host "=====Windows Toolbox=====" - - - #====DEBUG GUI Elements==== - - #Write-Host "Found the following interactable elements from our form" -ForegroundColor Cyan - #get-variable WPF* -} -function Invoke-WPFGetInstalled { - <# - - .DESCRIPTION - placeholder - - #> - param($checkbox) - - if($sync.ProcessRunning){ - $msg = "Install process is currently running." - [System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning) - return - } - - if(!(Test-WinUtilPackageManager -winget) -and $checkbox -eq "winget"){ - Write-Host "===========================================" - Write-Host "-- Winget is not installed ---" - Write-Host "===========================================" - return - } - - Invoke-WPFRunspace -ArgumentList $checkbox -ScriptBlock { - param($checkbox) - - $sync.ProcessRunning = $true - - if($checkbox -eq "winget"){ - Write-Host "Getting Installed Programs..." - } - if($checkbox -eq "tweaks"){ - Write-Host "Getting Installed Tweaks..." - } - - $Checkboxes = Invoke-WinUtilCurrentSystem -CheckBox $checkbox - - $sync.form.Dispatcher.invoke({ - foreach($checkbox in $Checkboxes){ - $sync.$checkbox.ischecked = $True - } - }) - - Write-Host "Done..." - $sync.ProcessRunning = $false - } -} -function Invoke-WPFImpex { - <# - - .DESCRIPTION - This function handles importing and exporting of the checkboxes checked for the tweaks section - - .EXAMPLE - - Invoke-WPFImpex -type "export" - - #> - param( - $type, - $checkbox - ) - - if ($type -eq "export"){ - $FileBrowser = New-Object System.Windows.Forms.SaveFileDialog - } - if ($type -eq "import"){ - $FileBrowser = New-Object System.Windows.Forms.OpenFileDialog - } - - $FileBrowser.InitialDirectory = [Environment]::GetFolderPath('Desktop') - $FileBrowser.Filter = "JSON Files (*.json)|*.json" - $FileBrowser.ShowDialog() | Out-Null - - if($FileBrowser.FileName -eq ""){ - return - } - - if ($type -eq "export"){ - $jsonFile = Get-WinUtilCheckBoxes $checkbox -unCheck $false - $jsonFile | ConvertTo-Json | Out-File $FileBrowser.FileName -Force - } - if ($type -eq "import"){ - $jsonFile = Get-Content $FileBrowser.FileName | ConvertFrom-Json - Invoke-WPFPresets -preset $jsonFile -imported $true -CheckBox $checkbox - } -} -function Invoke-WPFInstall { - <# - - .DESCRIPTION - PlaceHolder - - #> - - if($sync.ProcessRunning){ - $msg = "Install process is currently running." - [System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning) - return - } - - $WingetInstall = Get-WinUtilCheckBoxes -Group "WPFInstall" - - if ($wingetinstall.Count -eq 0) { - $WarningMsg = "Please select the program(s) to install" - [System.Windows.MessageBox]::Show($WarningMsg, $AppTitle, [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning) - return - } - - Invoke-WPFRunspace -ArgumentList $WingetInstall -scriptblock { - param($WingetInstall) - try{ - $sync.ProcessRunning = $true - - # Ensure winget is installed - Install-WinUtilWinget - - # Install all winget programs in new window - Install-WinUtilProgramWinget -ProgramsToInstall $WingetInstall - - $ButtonType = [System.Windows.MessageBoxButton]::OK - $MessageboxTitle = "Installs are Finished " - $Messageboxbody = ("Done") - $MessageIcon = [System.Windows.MessageBoxImage]::Information - - [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon) - - Write-Host "===========================================" - Write-Host "-- Installs have finished ---" - Write-Host "===========================================" - } - Catch { - Write-Host "===========================================" - Write-Host "-- Winget failed to install ---" - Write-Host "===========================================" - } - $sync.ProcessRunning = $False - } -} -function Invoke-WPFInstallUpgrade { - <# - - .DESCRIPTION - PlaceHolder - - #> - if(!(Test-WinUtilPackageManager -winget)){ - Write-Host "===========================================" - Write-Host "-- Winget is not installed ---" - Write-Host "===========================================" - return - } - - if(Get-WinUtilInstallerProcess -Process $global:WinGetInstall){ - $msg = "Install process is currently running. Please check for a powershell window labled 'Winget Install'" - [System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning) - return - } - - Update-WinUtilProgramWinget - - Write-Host "===========================================" - Write-Host "-- Updates started ---" - Write-Host "-- You can close this window if desired ---" - Write-Host "===========================================" -} -function Invoke-WPFPanelAutologin { - <# - - .DESCRIPTION - PlaceHolder - - #> - 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 -} -function Invoke-WPFPanelDISM { - <# - - .DESCRIPTION - PlaceHolder - - #> - 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(3/4) DISM' -ForegroundColor Green; DISM /Online /Cleanup-Image /Restorehealth; - Write-Host '`n(4/4) SFC - 2nd scan' -ForegroundColor Green; sfc /scannow; - Read-Host '`nPress Enter to Continue'" -verb runas -} -function Invoke-WPFPresets { - <# - - .DESCRIPTION - Meant to make settings presets easier in the tweaks tab. Will pull the data from config/preset.json - - #> - - param( - $preset, - [bool]$imported = $false, - $checkbox = "WPFTweaks" - ) - - if($imported -eq $true){ - $CheckBoxesToCheck = $preset - } - Else{ - $CheckBoxesToCheck = $sync.configs.preset.$preset - } - - if($checkbox -eq "WPFTweaks"){ - $filter = Get-WinUtilVariables -Type Checkbox | Where-Object {$psitem -like "*tweaks*"} - $sync.GetEnumerator() | Where-Object {$psitem.Key -in $filter} | ForEach-Object { - if ($CheckBoxesToCheck -contains $PSItem.name){ - $sync.$($PSItem.name).ischecked = $true - } - else{$sync.$($PSItem.name).ischecked = $false} - } - } - if($checkbox -eq "WPFInstall"){ - - $filter = Get-WinUtilVariables -Type Checkbox | Where-Object {$psitem -like "WPFInstall*"} - $sync.GetEnumerator() | Where-Object {$psitem.Key -in $filter} | ForEach-Object { - if($($sync.configs.applications.$($psitem.name).winget) -in $CheckBoxesToCheck){ - $sync.$($PSItem.name).ischecked = $true - } - else{$sync.$($PSItem.name).ischecked = $false} - } - } -} -function Invoke-WPFRunspace { - - <# - - .DESCRIPTION - Simple function to make it easier to invoke a runspace from inside the script. - - .EXAMPLE - - $params = @{ - ScriptBlock = $sync.ScriptsInstallPrograms - ArgumentList = "Installadvancedip,Installbitwarden" - Verbose = $true - } - - Invoke-WPFRunspace @params - - #> - - [CmdletBinding()] - Param ( - $ScriptBlock, - $ArgumentList - ) - - #Crate a PowerShell instance. - $script:powershell = [powershell]::Create() - - #Add Scriptblock and Arguments to runspace - $script:powershell.AddScript($ScriptBlock) - $script:powershell.AddArgument($ArgumentList) - $script:powershell.RunspacePool = $sync.runspace - - #Run our RunspacePool. - $script:handle = $script:powershell.BeginInvoke() - - #Cleanup our RunspacePool threads when they are complete ie. GC. - if ($script:handle.IsCompleted) - { - $script:powershell.EndInvoke($script:handle) - $script:powershell.Dispose() - $sync.runspace.Dispose() - $sync.runspace.Close() - [System.GC]::Collect() - } -} -function Invoke-WPFShortcut { - <# - - .DESCRIPTION - Creates a shortcut - - #> - param($ShortcutToAdd) - - Switch ($ShortcutToAdd) { - "WinUtil" { - $SourceExe = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" - $IRM = 'irm https://christitus.com/win | iex' - $Powershell = '-ExecutionPolicy Bypass -Command "Start-Process powershell.exe -verb runas -ArgumentList' - $ArgumentsToSourceExe = "$powershell '$IRM'" - $DestinationName = "WinUtil.lnk" - } - } - - $FileBrowser = New-Object System.Windows.Forms.SaveFileDialog - $FileBrowser.InitialDirectory = [Environment]::GetFolderPath('Desktop') - $FileBrowser.Filter = "Shortcut Files (*.lnk)|*.lnk" - $FileBrowser.FileName = $DestinationName - $FileBrowser.ShowDialog() | Out-Null - - $WshShell = New-Object -comObject WScript.Shell - $Shortcut = $WshShell.CreateShortcut($FileBrowser.FileName) - $Shortcut.TargetPath = $SourceExe - $Shortcut.Arguments = $ArgumentsToSourceExe - $Shortcut.Save() - - Write-Host "Shortcut for $ShortcutToAdd has been saved to $($FileBrowser.FileName)" -} -function Invoke-WPFTab { - - <# - - .DESCRIPTION - Sole purpose of this fuction reduce duplicated code for switching between tabs. - - #> - - Param ($ClickedTab) - $Tabs = Get-WinUtilVariables | Where-Object {$psitem -like "WPFTab?BT"} - $TabNav = Get-WinUtilVariables | Where-Object {$psitem -like "WPFTabNav"} - $x = [int]($ClickedTab -replace "WPFTab","" -replace "BT","") - 1 - - 0..($Tabs.Count -1 ) | ForEach-Object { - - if ($x -eq $psitem){ - $sync.$TabNav.Items[$psitem].IsSelected = $true - } - else{ - $sync.$TabNav.Items[$psitem].IsSelected = $false - } - } -} -function Invoke-WPFtweaksbutton { - <# - - .DESCRIPTION - PlaceHolder - - #> - - if($sync.ProcessRunning){ - $msg = "Install process is currently running." - [System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning) - return - } - - $Tweaks = Get-WinUtilCheckBoxes -Group "WPFTweaks" - - Set-WinUtilDNS -DNSProvider $sync["WPFchangedns"].text - - if ($tweaks.count -eq 0 -and $sync["WPFchangedns"].text -eq "Default"){ - $msg = "Please check the tweaks you wish to perform." - [System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning) - return - } - - Invoke-WPFRunspace -ArgumentList $Tweaks -ScriptBlock { - param($Tweaks) - - $sync.ProcessRunning = $true - - Foreach ($tweak in $tweaks){ - Invoke-WinUtilTweaks $tweak - } - - $sync.ProcessRunning = $false - Write-Host "=================================" - Write-Host "-- Tweaks are Finished ---" - Write-Host "=================================" - - $ButtonType = [System.Windows.MessageBoxButton]::OK - $MessageboxTitle = "Tweaks are Finished " - $Messageboxbody = ("Done") - $MessageIcon = [System.Windows.MessageBoxImage]::Information - - [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon) - } -} -Function Invoke-WPFUltimatePerformance { - <# - - .DESCRIPTION - PlaceHolder - - #> - param($State) - Try{ - $guid = "e9a42b02-d5df-448d-aa00-03f14749eb61" - - if($state -eq "Enabled"){ - Write-Host "Adding Ultimate Performance Profile" - [scriptblock]$command = {powercfg -duplicatescheme $guid} - - } - if($state -eq "Disabled"){ - Write-Host "Removing Ultimate Performance Profile" - [scriptblock]$command = {powercfg -delete $guid} - } - - $output = Invoke-Command -ScriptBlock $command - if($output -like "*does not exist*"){ - throw [GenericException]::new('Failed to modify profile') - } - } - Catch{ - Write-Warning $psitem.Exception.Message - } -} -function Invoke-WPFundoall { - <# - - .DESCRIPTION - PlaceHolder - - #> - - if($sync.ProcessRunning){ - $msg = "Install process is currently running." - [System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning) - return - } - - $Tweaks = Get-WinUtilCheckBoxes -Group "WPFTweaks" - - if ($tweaks.count -eq 0){ - $msg = "Please check the tweaks you wish to undo." - [System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning) - return - } - - Invoke-WPFRunspace -ArgumentList $Tweaks -ScriptBlock { - param($Tweaks) - - $sync.ProcessRunning = $true - - Foreach ($tweak in $tweaks){ - Invoke-WinUtilTweaks $tweak -undo $true - } - - $sync.ProcessRunning = $false - Write-Host "==================================" - Write-Host "--- Undo Tweaks are Finished ---" - Write-Host "==================================" - - $ButtonType = [System.Windows.MessageBoxButton]::OK - $MessageboxTitle = "Tweaks are Finished " - $Messageboxbody = ("Done") - $MessageIcon = [System.Windows.MessageBoxImage]::Information - - [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon) - } - -<# - - Write-Host "Creating Restore Point in case something bad happens" - Enable-ComputerRestore -Drive "$env:SystemDrive" - Checkpoint-Computer -Description "RestorePoint1" -RestorePointType "MODIFY_SETTINGS" - - Write-Host "Enabling Telemetry..." - Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\DataCollection" -Name "AllowTelemetry" -Type DWord -Value 1 - Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\DataCollection" -Name "AllowTelemetry" -Type DWord -Value 1 - Write-Host "Enabling Wi-Fi Sense" - Set-ItemProperty -Path "HKLM:\Software\Microsoft\PolicyManager\default\WiFi\AllowWiFiHotSpotReporting" -Name "Value" -Type DWord -Value 1 - Set-ItemProperty -Path "HKLM:\Software\Microsoft\PolicyManager\default\WiFi\AllowAutoConnectToWiFiSenseHotspots" -Name "Value" -Type DWord -Value 1 - Write-Host "Enabling Application suggestions..." - Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" -Name "ContentDeliveryAllowed" -Type DWord -Value 1 - Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" -Name "OemPreInstalledAppsEnabled" -Type DWord -Value 1 - Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" -Name "PreInstalledAppsEnabled" -Type DWord -Value 1 - Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" -Name "PreInstalledAppsEverEnabled" -Type DWord -Value 1 - Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" -Name "SilentInstalledAppsEnabled" -Type DWord -Value 1 - Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" -Name "SubscribedContent-338387Enabled" -Type DWord -Value 1 - Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" -Name "SubscribedContent-338388Enabled" -Type DWord -Value 1 - Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" -Name "SubscribedContent-338389Enabled" -Type DWord -Value 1 - Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" -Name "SubscribedContent-353698Enabled" -Type DWord -Value 1 - Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" -Name "SystemPaneSuggestionsEnabled" -Type DWord -Value 1 - If (Test-Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\CloudContent") { - Remove-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\CloudContent" -Recurse -ErrorAction SilentlyContinue - } - Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\CloudContent" -Name "DisableWindowsConsumerFeatures" -Type DWord -Value 0 - Write-Host "Enabling Activity History..." - Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System" -Name "EnableActivityFeed" -Type DWord -Value 1 - Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System" -Name "PublishUserActivities" -Type DWord -Value 1 - Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System" -Name "UploadUserActivities" -Type DWord -Value 1 - Write-Host "Enable Location Tracking..." - If (Test-Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\location") { - Remove-Item -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\location" -Recurse -ErrorAction SilentlyContinue - } - Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\location" -Name "Value" -Type String -Value "Allow" - Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Sensor\Overrides\{BFA794E4-F964-4FDB-90F6-51056BFE4B44}" -Name "SensorPermissionState" -Type DWord -Value 1 - Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\lfsvc\Service\Configuration" -Name "Status" -Type DWord -Value 1 - Write-Host "Enabling automatic Maps updates..." - Set-ItemProperty -Path "HKLM:\SYSTEM\Maps" -Name "AutoUpdateEnabled" -Type DWord -Value 1 - Write-Host "Enabling Feedback..." - If (Test-Path "HKCU:\SOFTWARE\Microsoft\Siuf\Rules") { - Remove-Item -Path "HKCU:\SOFTWARE\Microsoft\Siuf\Rules" -Recurse -ErrorAction SilentlyContinue - } - Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Siuf\Rules" -Name "NumberOfSIUFInPeriod" -Type DWord -Value 0 - Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\DataCollection" -Name "DoNotShowFeedbackNotifications" -Type DWord -Value 0 - Write-Host "Enabling Tailored Experiences..." - If (Test-Path "HKCU:\SOFTWARE\Policies\Microsoft\Windows\CloudContent") { - Remove-Item -Path "HKCU:\SOFTWARE\Policies\Microsoft\Windows\CloudContent" -Recurse -ErrorAction SilentlyContinue - } - Set-ItemProperty -Path "HKCU:\SOFTWARE\Policies\Microsoft\Windows\CloudContent" -Name "DisableTailoredExperiencesWithDiagnosticData" -Type DWord -Value 0 - Write-Host "Disabling Advertising ID..." - If (Test-Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\AdvertisingInfo") { - Remove-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\AdvertisingInfo" -Recurse -ErrorAction SilentlyContinue - } - Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\AdvertisingInfo" -Name "DisabledByGroupPolicy" -Type DWord -Value 0 - Write-Host "Allow Error reporting..." - Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting" -Name "Disabled" -Type DWord -Value 0 - Write-Host "Allowing Diagnostics Tracking Service..." - Stop-Service "DiagTrack" -WarningAction SilentlyContinue - Set-Service "DiagTrack" -StartupType Manual - Write-Host "Allowing WAP Push Service..." - Stop-Service "dmwappushservice" -WarningAction SilentlyContinue - Set-Service "dmwappushservice" -StartupType Manual - Write-Host "Allowing Home Groups services..." - Stop-Service "HomeGroupListener" -WarningAction SilentlyContinue - Set-Service "HomeGroupListener" -StartupType Manual - Stop-Service "HomeGroupProvider" -WarningAction SilentlyContinue - Set-Service "HomeGroupProvider" -StartupType Manual - Write-Host "Enabling Storage Sense..." - New-Item -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\StorageSense\Parameters\StoragePolicy" | Out-Null - Write-Host "Allowing Superfetch service..." - Stop-Service "SysMain" -WarningAction SilentlyContinue - Set-Service "SysMain" -StartupType Manual - Write-Host "Setting BIOS time to Local Time instead of UTC..." - Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\TimeZoneInformation" -Name "RealTimeIsUniversal" -Type DWord -Value 0 - Write-Host "Enabling Hibernation..." - Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Session Manager\Power" -Name "HibernteEnabled" -Type Dword -Value 1 - Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FlyoutMenuSettings" -Name "ShowHibernateOption" -Type Dword -Value 1 - Remove-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Personalization" -Name "NoLockScreen" -ErrorAction SilentlyContinue - - Write-Host "Hiding file operations details..." - If (Test-Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\OperationStatusManager") { - Remove-Item -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\OperationStatusManager" -Recurse -ErrorAction SilentlyContinue - } - Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\OperationStatusManager" -Name "EnthusiastMode" -Type DWord -Value 0 - Write-Host "Showing Task View button..." - Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -Name "ShowTaskViewButton" -Type DWord -Value 1 - Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\People" -Name "PeopleBand" -Type DWord -Value 1 - - Write-Host "Changing default Explorer view to Quick Access..." - Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -Name "LaunchTo" -Type DWord -Value 0 - - Write-Host "Unrestricting AutoLogger directory" - $autoLoggerDir = "$env:PROGRAMDATA\Microsoft\Diagnosis\ETLLogs\AutoLogger" - icacls $autoLoggerDir /grant:r SYSTEM:`(OI`)`(CI`)F | Out-Null - - Write-Host "Enabling and starting Diagnostics Tracking Service" - Set-Service "DiagTrack" -StartupType Automatic - Start-Service "DiagTrack" - - Write-Host "Hiding known file extensions" - Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -Name "HideFileExt" -Type DWord -Value 1 - - Write-Host "Reset Local Group Policies to Stock Defaults" - # cmd /c secedit /configure /cfg %windir%\inf\defltbase.inf /db defltbase.sdb /verbose - cmd /c RD /S /Q "%WinDir%\System32\GroupPolicyUsers" - cmd /c RD /S /Q "%WinDir%\System32\GroupPolicy" - cmd /c gpupdate /force - # Considered using Invoke-GPUpdate but requires module most people won't have installed - - Write-Host "Adjusting visual effects for appearance..." - Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name "DragFullWindows" -Type String -Value 1 - Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name "MenuShowDelay" -Type String -Value 400 - Set-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name "UserPreferencesMask" -Type Binary -Value ([byte[]](158, 30, 7, 128, 18, 0, 0, 0)) - Set-ItemProperty -Path "HKCU:\Control Panel\Desktop\WindowMetrics" -Name "MinAnimate" -Type String -Value 1 - Set-ItemProperty -Path "HKCU:\Control Panel\Keyboard" -Name "KeyboardDelay" -Type DWord -Value 1 - Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -Name "ListviewAlphaSelect" -Type DWord -Value 1 - Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -Name "ListviewShadow" -Type DWord -Value 1 - Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -Name "TaskbarAnimations" -Type DWord -Value 1 - Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\VisualEffects" -Name "VisualFXSetting" -Type DWord -Value 3 - Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\DWM" -Name "EnableAeroPeek" -Type DWord -Value 1 - Remove-ItemProperty -Path "HKCU:\Control Panel\Desktop" -Name "HungAppTimeout" -ErrorAction SilentlyContinue - Write-Host "Restoring Clipboard History..." - Remove-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Clipboard" -Name "EnableClipboardHistory" -ErrorAction SilentlyContinue - Remove-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System" -Name "AllowClipboardHistory" -ErrorAction SilentlyContinue - Write-Host "Enabling Notifications and Action Center" - Remove-Item -Path HKCU:\SOFTWARE\Policies\Microsoft\Windows\Explorer -Force - Remove-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\PushNotifications" -Name "ToastEnabled" - Write-Host "Restoring Default Right Click Menu Layout" - Remove-Item -Path "HKCU:\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}" -Recurse -Confirm:$false -Force - - Write-Host "Reset News and Interests" - Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Windows Feeds" -Name "EnableFeeds" -Type DWord -Value 1 - # Remove "News and Interest" from taskbar - Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Feeds" -Name "ShellFeedsTaskbarViewMode" -Type DWord -Value 0 - Write-Host "Done - Reverted to Stock Settings" - - Write-Host "Essential Undo Completed" - - $ButtonType = [System.Windows.MessageBoxButton]::OK - $MessageboxTitle = "Undo All" - $Messageboxbody = ("Done") - $MessageIcon = [System.Windows.MessageBoxImage]::Information - - [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon) - - Write-Host "=================================" - Write-Host "--- Undo All is Finished ---" - Write-Host "=================================" - #> -} -function Invoke-WPFUnInstall { - <# - - .DESCRIPTION - PlaceHolder - - #> - - if($sync.ProcessRunning){ - $msg = "Install process is currently running." - [System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning) - return - } - - $WingetInstall = Get-WinUtilCheckBoxes -Group "WPFInstall" - - if ($wingetinstall.Count -eq 0) { - $WarningMsg = "Please select the program(s) to install" - [System.Windows.MessageBox]::Show($WarningMsg, $AppTitle, [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning) - return - } - - $ButtonType = [System.Windows.MessageBoxButton]::YesNo - $MessageboxTitle = "Are you sure?" - $Messageboxbody = ("This will uninstall the following applications `n $WingetInstall") - $MessageIcon = [System.Windows.MessageBoxImage]::Information - - $confirm = [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon) - - if($confirm -eq "No"){return} - - Invoke-WPFRunspace -ArgumentList $WingetInstall -scriptblock { - param($WingetInstall) - try{ - $sync.ProcessRunning = $true - - # Install all winget programs in new window - Install-WinUtilProgramWinget -ProgramsToInstall $WingetInstall -Manage "Uninstalling" - - $ButtonType = [System.Windows.MessageBoxButton]::OK - $MessageboxTitle = "Uninstalls are Finished " - $Messageboxbody = ("Done") - $MessageIcon = [System.Windows.MessageBoxImage]::Information - - [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon) - - Write-Host "===========================================" - Write-Host "-- Uninstalls have finished ---" - Write-Host "===========================================" - } - Catch { - Write-Host "===========================================" - Write-Host "-- Winget failed to install ---" - Write-Host "===========================================" - } - $sync.ProcessRunning = $False - } -} -function Invoke-WPFUpdatesdefault { - <# - - .DESCRIPTION - PlaceHolder - - #> - If (!(Test-Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU")) { - New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Force | Out-Null - } - Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "NoAutoUpdate" -Type DWord -Value 0 - Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "AUOptions" -Type DWord -Value 3 - If (!(Test-Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DeliveryOptimization\Config")) { - New-Item -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DeliveryOptimization\Config" -Force | Out-Null - } - Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DeliveryOptimization\Config" -Name "DODownloadMode" -Type DWord -Value 1 - - $services = @( - "BITS" - "wuauserv" - ) - - foreach ($service in $services) { - # -ErrorAction SilentlyContinue is so it doesn't write an error to stdout if a service doesn't exist - - Write-Host "Setting $service StartupType to Automatic" - Get-Service -Name $service -ErrorAction SilentlyContinue | Set-Service -StartupType Automatic - } - Write-Host "Enabling driver offering through Windows Update..." - Remove-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Device Metadata" -Name "PreventDeviceMetadataFromNetwork" -ErrorAction SilentlyContinue - Remove-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\DriverSearching" -Name "DontPromptForWindowsUpdate" -ErrorAction SilentlyContinue - Remove-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\DriverSearching" -Name "DontSearchWindowsUpdate" -ErrorAction SilentlyContinue - Remove-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\DriverSearching" -Name "DriverUpdateWizardWuSearchEnabled" -ErrorAction SilentlyContinue - Remove-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" -Name "ExcludeWUDriversInQualityUpdate" -ErrorAction SilentlyContinue - Write-Host "Enabling Windows Update automatic restart..." - Remove-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "NoAutoRebootWithLoggedOnUsers" -ErrorAction SilentlyContinue - Remove-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "AUPowerManagement" -ErrorAction SilentlyContinue - Write-Host "Enabled driver offering through Windows Update" - 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 "DeferQualityUpdatesPeriodInDays " -ErrorAction SilentlyContinue - Write-Host "=================================" - Write-Host "--- Updates Set to Default ---" - Write-Host "=================================" -} -function Invoke-WPFUpdatesdisable { - <# - - .DESCRIPTION - PlaceHolder - - #> - If (!(Test-Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU")) { - New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Force | Out-Null - } - Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "NoAutoUpdate" -Type DWord -Value 1 - Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "AUOptions" -Type DWord -Value 1 - If (!(Test-Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DeliveryOptimization\Config")) { - New-Item -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DeliveryOptimization\Config" -Force | Out-Null - } - Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DeliveryOptimization\Config" -Name "DODownloadMode" -Type DWord -Value 0 - - $services = @( - "BITS" - "wuauserv" - ) - - foreach ($service in $services) { - # -ErrorAction SilentlyContinue is so it doesn't write an error to stdout if a service doesn't exist - - Write-Host "Setting $service StartupType to Disabled" - Get-Service -Name $service -ErrorAction SilentlyContinue | Set-Service -StartupType Disabled - } - Write-Host "=================================" - Write-Host "--- Updates ARE DISABLED ---" - Write-Host "=================================" -} -function Invoke-WPFUpdatessecurity { - <# - - .DESCRIPTION - PlaceHolder - - #> - Write-Host "Disabling driver offering through Windows Update..." - If (!(Test-Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Device Metadata")) { - New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Device Metadata" -Force | Out-Null - } - Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Device Metadata" -Name "PreventDeviceMetadataFromNetwork" -Type DWord -Value 1 - If (!(Test-Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\DriverSearching")) { - New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\DriverSearching" -Force | Out-Null - } - Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\DriverSearching" -Name "DontPromptForWindowsUpdate" -Type DWord -Value 1 - Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\DriverSearching" -Name "DontSearchWindowsUpdate" -Type DWord -Value 1 - Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\DriverSearching" -Name "DriverUpdateWizardWuSearchEnabled" -Type DWord -Value 0 - If (!(Test-Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate")) { - New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" | Out-Null - } - Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" -Name "ExcludeWUDriversInQualityUpdate" -Type DWord -Value 1 - Write-Host "Disabling Windows Update automatic restart..." - If (!(Test-Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU")) { - New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Force | Out-Null - } - Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "NoAutoRebootWithLoggedOnUsers" -Type DWord -Value 1 - Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "AUPowerManagement" -Type DWord -Value 0 - Write-Host "Disabled driver offering through Windows Update" - Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings" -Name "BranchReadinessLevel" -Type DWord -Value 20 - Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings" -Name "DeferFeatureUpdatesPeriodInDays" -Type DWord -Value 365 - Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings" -Name "DeferQualityUpdatesPeriodInDays " -Type DWord -Value 4 - - $ButtonType = [System.Windows.MessageBoxButton]::OK - $MessageboxTitle = "Set Security Updates" - $Messageboxbody = ("Recommended Update settings loaded") - $MessageIcon = [System.Windows.MessageBoxImage]::Information - - [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon) - Write-Host "=================================" - Write-Host "-- Updates Set to Recommended ---" - Write-Host "=================================" -} -$inputXML = ' - - - - - - - - - - - - - - - -