diff --git a/.github/workflows/close-old-issues.yaml b/.github/workflows/close-old-issues.yaml index 1b129a0a..3050c4b1 100644 --- a/.github/workflows/close-old-issues.yaml +++ b/.github/workflows/close-old-issues.yaml @@ -25,6 +25,8 @@ jobs: const inactivityPeriod = new Date(); inactivityPeriod.setDate(inactivityPeriod.getDate() - 14); + const labelKeepIssue = 'Keep Issue Open'; + try { // Get all open issues with pagination for await (const response of octokit.paginate.iterator(octokit.rest.issues.listForRepo, { @@ -36,6 +38,33 @@ jobs: // Close issues inactive for more than the inactivity period for (const issue of issues) { + const closeIssue = true; + + // Get all Labels of issue, and compared each label with the labelKeepIssue const variable + try { + const respondIssueLabels = await octokit.request("GET /repos/{owner}/{repo}/issues/{issue_number}/labels", { + owner: owner, + repo: repo, + issue_number: issue.number + }); + const labels = respondIssueLabels.data; + + for (let i = 0; i < labels.length; i++) { + const label = labels[i] + if (label.name === labelKeepIssue) { + console.log(`Issue #${issue.number} will not be closed`); + closeIssue = false; + break; // Break from the loop, no need to check the remaining Labels. + } + } + } catch (error) { + console.error(`Error while Fetching Labels for Issue #${issue.number}, Error: ${error}`); + } + + if (!closeIssue) { + continue; // Skip the next bit of code + } + const lastCommentDate = issue.updated_at; if (new Date(lastCommentDate) < inactivityPeriod) { try { diff --git a/README.md b/README.md index c93e6a43..60c4fec2 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ Some features are avaliable through automation. This allows you to save your con 5. Install the Windows image. 6. In the new Windows, Open PowerShell in the admin mode and run command to automatically apply tweaks and install apps from the config file. ``` -irm https://christitus.com/win -Config [path-to-your-config] -Run | iex +iex "& { $(irm christitus.com/win) } -Config [path-to-your-config] -Run" ``` 7. Have a cup of coffee! Come back when it's done. diff --git a/config/applications.json b/config/applications.json index 03600bab..ec8b079a 100644 --- a/config/applications.json +++ b/config/applications.json @@ -111,6 +111,14 @@ "link": "https://www.autohotkey.com/", "winget": "AutoHotkey.AutoHotkey" }, + "WPFInstallazuredatastudio": { + "category": "Microsoft Tools", + "choco": "azure-data-studio", + "content": "Microsoft Azure Data Studio", + "description": "Azure Data Studio is a data management tool that enables you to work with SQL Server, Azure SQL DB and SQL DW from Windows, macOS and Linux.", + "link": "https://docs.microsoft.com/sql/azure-data-studio/what-is-azure-data-studio", + "winget": "Microsoft.AzureDataStudio" + }, "WPFInstallbarrier": { "category": "Utilities", "choco": "barrier", @@ -279,6 +287,14 @@ "link": "https://crystalmark.info/en/software/crystaldiskinfo/", "winget": "CrystalDewWorld.CrystalDiskInfo" }, + "WPFInstallcapframex": { + "category": "Utilities", + "choco": "na", + "content": "CapFrameX", + "description": "Frametimes capture and analysis tool based on Intel's PresentMon. Overlay provided by Rivatuner Statistics Server.", + "link": "https://www.capframex.com/", + "winget": "CXWorld.CapFrameX" + }, "WPFInstallcrystaldiskmark": { "category": "Utilities", "choco": "crystaldiskmark", @@ -607,6 +623,14 @@ "link": "https://www.freecadweb.org/", "winget": "FreeCAD.FreeCAD" }, + "WPFInstallorcaslicer": { + "category": "Multimedia Tools", + "choco": "orcaslicer", + "content": "OrcaSlicer", + "description": "G-code generator for 3D printers (Bambu, Prusa, Voron, VzBot, RatRig, Creality, etc.)", + "link": "https://github.com/SoftFever/OrcaSlicer", + "winget": "SoftFever.OrcaSlicer" + }, "WPFInstallfzf": { "category": "Utilities", "choco": "fzf", @@ -863,6 +887,38 @@ "link": "https://adoptopenjdk.net/", "winget": "EclipseAdoptium.Temurin.8.JRE" }, + "WPFInstalljava11runtime": { + "category": "Development", + "choco": "na", + "content": "Eclipse Temurin JRE 11", + "description": "Eclipse Temurin JRE is the open source Java SE build based upon OpenJRE.", + "link": "https://adoptium.net/", + "winget": "EclipseAdoptium.Temurin.11.JRE" + }, + "WPFInstalljava17runtime": { + "category": "Development", + "choco": "na", + "content": "Eclipse Temurin JRE 17", + "description": "Eclipse Temurin JRE is the open source Java SE build based upon OpenJRE.", + "link": "https://adoptium.net/", + "winget": "EclipseAdoptium.Temurin.17.JRE" + }, + "WPFInstalljava18runtime": { + "category": "Development", + "choco": "na", + "content": "Eclipse Temurin JRE 18", + "description": "Eclipse Temurin JRE is the open source Java SE build based upon OpenJRE.", + "link": "https://adoptium.net/", + "winget": "EclipseAdoptium.Temurin.18.JRE" + }, + "WPFInstalljava19runtime": { + "category": "Development", + "choco": "na", + "content": "Eclipse Temurin JRE 19", + "description": "Eclipse Temurin JRE is the open source Java SE build based upon OpenJRE.", + "link": "https://adoptium.net/", + "winget": "EclipseAdoptium.Temurin.19.JRE" + }, "WPFInstalljdownloader": { "category": "Utilities", "choco": "jdownloader", @@ -1423,6 +1479,14 @@ "link": "https://www.postman.com/", "winget": "Postman.Postman" }, + "WPFInstallpowerautomate": { + "category": "Microsoft Tools", + "choco": "powerautomatedesktop", + "content": "Power Automate", + "description": "Using Power Automate Desktop you can automate tasks on the desktop as well as the Web.", + "link": "https://www.microsoft.com/en-us/power-platform/products/power-automate", + "winget": "Microsoft.PowerAutomateDesktop" + }, "WPFInstallpowerbi": { "category": "Microsoft Tools", "choco": "powerbi", @@ -1511,6 +1575,14 @@ "link": "https://www.qbittorrent.org/", "winget": "qBittorrent.qBittorrent" }, + "WPFInstalltixati": { + "category": "Utilities", + "choco": "tixati.portable", + "content": "Tixati", + "description": "Tixati is a cross-platform BitTorrent client written in C++ that has been designed to be light on system resources.", + "link": "https://www.tixati.com/", + "winget": "Tixati.Tixati.Portable" + }, "WPFInstallqtox": { "category": "Communications", "choco": "qtox", @@ -1727,6 +1799,14 @@ "link": "https://www.sumatrapdfreader.org/free-pdf-reader.html", "winget": "SumatraPDF.SumatraPDF" }, + "WPFInstallpdfgear": { + "category": "Document", + "choco": "na", + "content": "PDFgear", + "description": "PDFgear is a piece of full-featured PDF management software for Windows, Mac, and mobile, and it's completely free to use.", + "link": "https://www.pdfgear.com/", + "winget": "PDFgear.PDFgear" + }, "WPFInstallsunshine": { "category": "Games", "choco": "sunshine", @@ -1743,6 +1823,14 @@ "link": "https://stefansundin.github.io/superf4/", "winget": "StefanSundin.Superf4" }, + "WPFInstallswift": { + "category": "Development", + "choco": "na", + "content": "Swift toolchain", + "description": "Swift is a general-purpose programming language that’s approachable for newcomers and powerful for experts.", + "link": "https://www.swift.org/", + "winget": "Swift.Toolchain" + }, "WPFInstallsynctrayzor": { "category": "Utilities", "choco": "synctrayzor", @@ -1751,6 +1839,14 @@ "link": "https://github.com/canton7/SyncTrayzor/", "winget": "SyncTrayzor.SyncTrayzor" }, + "WPFInstallsqlmanagementstudio": { + "category": "Microsoft Tools", + "choco": "sql-server-management-studio", + "content": "Microsoft SQL Server Management Studio", + "description": "SQL Server Management Studio (SSMS) is an integrated environment for managing any SQL infrastructure, from SQL Server to Azure SQL Database. SSMS provides tools to configure, monitor, and administer instances of SQL Server and databases.", + "link": "https://learn.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver16", + "winget": "Microsoft.SQLServerManagementStudio" + }, "WPFInstalltailscale": { "category": "Utilities", "choco": "tailscale", @@ -1799,6 +1895,14 @@ "link": "https://telegram.org/", "winget": "Telegram.TelegramDesktop" }, + "WPFInstallunigram": { + "category": "Communications", + "choco": "na", + "content": "Unigram", + "description": "Unigram - Telegram for Windows", + "link": "https://unigramdev.github.io/", + "winget": "Telegram.Unigram" + }, "WPFInstallterminal": { "category": "Microsoft Tools", "choco": "microsoft-windows-terminal", @@ -2294,5 +2398,45 @@ "description": "TightVNC is a free and Open Source remote desktop software that lets you access and control a computer over the network. With its intuitive interface, you can interact with the remote screen as if you were sitting in front of it. You can open files, launch applications, and perform other actions on the remote desktop almost as if you were physically there", "link": "https://www.tightvnc.com/", "winget": "GlavSoft.TightVNC" + }, + "WPFInstallultravnc": { + "category": "Utilities", + "choco": "ultravnc", + "content": "UltraVNC", + "description": "UltraVNC is a powerful, easy to use and free - remote pc access softwares - that can display the screen of another computer (via internet or network) on your own screen. The program allows you to use your mouse and keyboard to control the other PC remotely. It means that you can work on a remote computer, as if you were sitting in front of it, right from your current location.", + "link": "https://uvnc.com/", + "winget": "uvncbvba.UltraVnc" + }, + "WPFInstallwindowsfirewallcontrol": { + "category": "Utilities", + "choco": "windowsfirewallcontrol", + "content": "Windows Firewall Control", + "description": "Windows Firewall Control is a powerful tool which extends the functionality of Windows Firewall and provides new extra features which makes Windows Firewall better.", + "link": "https://www.binisoft.org/wfc", + "winget": "BiniSoft.WindowsFirewallControl" + }, + "WPFInstallvistaswitcher": { + "category": "Utilities", + "choco": "na", + "content": "VistaSwitcher", + "description": "VistaSwitcher makes it easier for you to locate windows and switch focus, even on multi-monitor systems. The switcher window consists of an easy-to-read list of all tasks running with clearly shown titles and a full-sized preview of the selected task.", + "link": "https://www.ntwind.com/freeware/vistaswitcher.html", + "winget": "ntwind.VistaSwitcher" + }, + "WPFInstallautodarkmode": { + "category": "Utilities", + "choco": "auto-dark-mode", + "content": "Windows Auto Dark Mode", + "description": "Automatically switches between the dark and light theme of Windows 10 and Windows 11", + "link": "https://github.com/AutoDarkMode/Windows-Auto-Night-Mode", + "winget": "Armin2208.WindowsAutoNightMode" + }, + "WPFInstallmagicwormhole": { + "category": "Utilities", + "choco": "magic-wormhole", + "content": "Magic Wormhole", + "description": "get things from one computer to another, safely", + "link": "https://github.com/magic-wormhole/magic-wormhole", + "winget": "magic-wormhole.magic-wormhole" } } diff --git a/config/tweaks.json b/config/tweaks.json index cd074d65..e59eabea 100644 --- a/config/tweaks.json +++ b/config/tweaks.json @@ -53,6 +53,9 @@ ], "InvokeScript": [ "powercfg.exe /hibernate off" + ], + "UndoScript": [ + "powercfg.exe /hibernate on" ] }, "WPFTweaksHome": { @@ -1889,6 +1892,13 @@ "Name": "Scheduling Category", "Value": "High", "Type": "String" + }, + { + "Path": "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\UserProfileEngagement", + "OriginalValue": "1", + "Name": "ScoobeSystemSettingEnabled", + "Value": "0", + "Type": "DWord" } ], "InvokeScript": [ @@ -2234,6 +2244,23 @@ " ] }, + "WPFTweaksEndTaskOnTaskbar": { + "Content": "Enable End Task With Right Click", + "Description": "Enables option to end task when right clicking a program in the taskbar", + "category": "Essential Tweaks", + "panel": "1", + "Order": "a002_", + "InvokeScript": [ + " + Set-ItemProperty -Path \"HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\TaskbarDeveloperSettings\" -Name \"TaskbarEndTask\" -Type \"DWord\" -Value \"1\" + " + ], + "UndoScript": [ + " + Set-ItemProperty -Path \"HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\TaskbarDeveloperSettings\" -Name \"TaskbarEndTask\" -Type \"DWord\" -Value \"0\" + " + ] + }, "WPFTweaksOO": { "Content": "Run OO Shutup", "Description": "Runs OO Shutup from https://www.oo-software.com/en/shutup10", @@ -2256,11 +2283,10 @@ "panel": "1", "Order": "a010_", "InvokeScript": [ - "Remove-Item -Path \"HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\StorageSense\\Parameters\\StoragePolicy\" -Recurse -ErrorAction SilentlyContinue" + "Set-ItemProperty -Path \"HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\StorageSense\\Parameters\\StoragePolicy\" -Name \"01\" -Value 0 -Type Dword -Force" ], "UndoScript": [ - "New-Item -Path \"HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\StorageSense\\Parameters\\StoragePolicy\" | Out-Null - " + "Set-ItemProperty -Path \"HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\StorageSense\\Parameters\\StoragePolicy\" -Name \"01\" -Value 1 -Type Dword -Force" ] }, "WPFTweaksRemoveEdge": { @@ -2398,12 +2424,20 @@ "panel": "1", "Order": "a028_", "InvokeScript": [ - "New-Item -Path \"HKCU:\\Software\\Classes\\CLSID\\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\" -Name \"InprocServer32\" -force -value \"\" " + " + New-Item -Path \"HKCU:\\Software\\Classes\\CLSID\\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\" -Name \"InprocServer32\" -force -value \"\" + Write-Host Restarting explorer.exe ... + $process = Get-Process -Name \"explorer\" + Stop-Process -InputObject $process + " ], "UndoScript": [ " Remove-Item -Path \"HKCU:\\Software\\Classes\\CLSID\\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\" -Recurse -Confirm:$false -Force - Write-Host Restart Needed for change + # Restarting Explorer in the Undo Script might not be necessary, as the Registry change without restarting Explorer does work, but just to make sure. + Write-Host Restarting explorer.exe ... + $process = Get-Process -Name \"explorer\" + Stop-Process -InputObject $process " ] }, @@ -2613,6 +2647,14 @@ "Order": "a067_", "Type": "Toggle" }, + "WPFToggleTaskbarWidgets": { + "Content": "Taskbar Widgets", + "Description": "If Enabled then Widgets Icon in Taskbar will be shown.", + "category": "Customize Preferences", + "panel": "2", + "Order": "a068_", + "Type": "Toggle" + }, "WPFchangedns": { "Content": "DNS", "category": "z__Advanced Tweaks - CAUTION", diff --git a/edgeremoval.ps1 b/edgeremoval.ps1 index 3f698087..5f3a7a3c 100644 --- a/edgeremoval.ps1 +++ b/edgeremoval.ps1 @@ -15,11 +15,6 @@ if ($also_remove_webview -eq 1) { } # 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', @@ -27,44 +22,34 @@ $privileges = @( 'SeRestorePrivilege' ) -# Invoke the method for each privilege foreach ($privilege in $privileges) { - $setPrivilegeMethod.Invoke($null, @($privilege, 2)) + [System.Diagnostics.Process]::SetPrivilege($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) { @@ -84,7 +69,6 @@ foreach ($base in $registryBases) { } } -# Clear specific registry keys $registryPaths = @('HKCU:', 'HKLM:') $nodes = @('', '\Wow6432Node') foreach ($regPath in $registryPaths) { @@ -97,7 +81,6 @@ foreach ($regPath in $registryPaths) { } } -# Locate setup.exe and ie_to_edge_stub.exe $foldersToSearch = @('LocalApplicationData', 'ProgramFilesX86', 'ProgramFiles') | ForEach-Object { [Environment]::GetFolderPath($_) } @@ -112,7 +95,6 @@ foreach ($folder in $foldersToSearch) { 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 @@ -125,342 +107,147 @@ foreach ($bhoFile in $bhoFiles) { } ## 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 +$store = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Store' +$storeP = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Store\InstalledApplications' +foreach ($app in $appxpackage) { + $name = $app.Name + if ($app.Name -eq "Microsoft.Edge") { + $eol += $name + } elseif ($app.Name -eq "Microsoft.EdgeBeta" -or $app.Name -eq "Microsoft.EdgeDev" -or $app.Name -eq "Microsoft.EdgeCanary" -or $app.Name -eq "Microsoft.MicrosoftEdge") { + $eol += $name } } -## Run Edge setup uninstaller +$eolApps = $provisioned | Where-Object { $eol -contains $_.DisplayName } -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" - +foreach ($edge in $eolApps) { + $edgeName = $edge.DisplayName + if (-not ($skip -contains $edgeName)) { 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 + Remove-AppxProvisionedPackage -Online -PackageName $edgeName -ErrorAction SilentlyContinue + } catch { } + } +} + +foreach ($edge in $appxpackage) { + $edgeName = $edge.Name + if ($eol -contains $edgeName) { + if (-not ($skip -contains $edgeName)) { + try { + Remove-AppxPackage -Package $edgeName -AllUsers -ErrorAction SilentlyContinue + } catch { } } } } -## Cleanup +## Redirect shortcuts +$shortcut_path = "$env:Public\Desktop" +$shortcut_file = 'Microsoft Edge.lnk' +$full_path = Join-Path -Path $shortcut_path -ChildPath $shortcut_file -# Define necessary paths and variables -$edgePaths = $env:ProgramFiles, ${env:ProgramFiles(x86)} -$appDataPath = [Environment]::GetFolderPath('ApplicationData') +if (Test-Path $full_path) { + Remove-Item -Path $full_path -Force -ErrorAction SilentlyContinue +} -# 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 +$shortcut_path = "$env:ProgramData\Microsoft\Windows\Start Menu\Programs" +$shortcut_file = 'Microsoft Edge.lnk' +$full_path = Join-Path -Path $shortcut_path -ChildPath $shortcut_file + +if (Test-Path $full_path) { + Remove-Item -Path $full_path -Force -ErrorAction SilentlyContinue +} + +$edgePolicy = 'HKLM:\SOFTWARE\Policies\Microsoft\Edge' +if (-not (Test-Path $edgePolicy)) { + New-Item -Path $edgePolicy -Force | Out-Null +} + +$edgePrefs = @{ + 'Dword' = @{ + 'BrowserReplacementEnabled' = 1 + 'HideFirstRunExperience' = 1 + 'HideImportEdgeFavoritesPrompt' = 1 + 'HideSyncSetupExperience' = 1 + 'FavoritesBarVisibility' = 1 + } + 'String' = @{ + 'AutoplayAllowed' = 'AllowOnce' + } +} + +foreach ($entryType in $edgePrefs.Keys) { + foreach ($prefName in $edgePrefs[$entryType].Keys) { + Set-ItemProperty -Path $edgePolicy -Name $prefName -Value $edgePrefs[$entryType][$prefName] -Type $entryType -Force + } +} + +# Output Results +Write-Host "Edge Removal Complete" -ForegroundColor Green + +# Define constants and initial configuration +$ScriptVersion = "2023.05.10" +$EdgeProcessesToShutdown = @('explorer', 'Widgets', 'widgetservice', 'msedgewebview2', 'MicrosoftEdge*', 'chredge', 'msedge', 'edge', 'msteams', 'msfamily', 'WebViewHost', 'Clipchamp') +$EdgeRemovalOptions = @{ + RemoveWin32 = @("Microsoft Edge", "Microsoft Edge Update") + RemoveAppx = @("MicrosoftEdge") + Skip = @() # Optional: @("DevTools") + AlsoRemoveWebView = $false +} + +# Define main function to remove Microsoft Edge components +function Remove-MicrosoftEdge { + [CmdletBinding()] + param() + + # Function to shutdown processes related to Microsoft Edge + function Stop-EdgeProcesses { + $EdgeProcessesToShutdown | ForEach-Object { + Stop-Process -Name $_ -Force -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 + # Function to remove registry entries related to Microsoft Edge + function Remove-EdgeRegistryEntries { + # 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 -# Revert settings related to Microsoft Edge -foreach ($sid in $users) { - foreach ($packageName in $eol) { - Remove-Item -Path "$store\EndOfLife\$sid\$packageName" -Force -ErrorAction SilentlyContinue + # Create new registry entries + $EdgeExecutablePath = ($env:ProgramFiles, ${env:ProgramFiles(x86)})[[Environment]::Is64BitOperatingSystem] + '\Microsoft\Edge\Application\msedge.exe' + 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 "`"$EdgeExecutablePath`" --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 "`"$EdgeExecutablePath`" --single-argument %%1" -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; -} + # Function to remove Microsoft Edge AppX packages + function Remove-EdgeAppxPackages { + $EdgeRemovalOptions.RemoveAppx | ForEach-Object { + # Remove provisioned packages + Get-AppxProvisionedPackage -Online | Where-Object { $_.PackageName -like "*$_*" -and $EdgeRemovalOptions.Skip -notcontains $_.PackageName } | Remove-AppxProvisionedPackage -Online -AllUsers -ErrorAction SilentlyContinue -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 + # Remove installed packages + Get-AppxPackage -AllUsers | Where-Object { $_.PackageFullName -like "*$_*" -and $EdgeRemovalOptions.Skip -notcontains $_.PackageFullName } | Remove-AppxPackage -AllUsers -ErrorAction SilentlyContinue } } + + # Function to remove Microsoft Edge processes, registry entries, and AppX packages + try { + Stop-EdgeProcesses + Remove-EdgeRegistryEntries + Remove-EdgeAppxPackages + Write-Output "Microsoft Edge components have been successfully removed." + } catch { + Write-Error "Failed to remove Microsoft Edge components: $_" + } } -## 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' -} - - - +# Execute the main function +Remove-MicrosoftEdge \ No newline at end of file diff --git a/functions/private/Get-WinUtilToggleStatus.ps1 b/functions/private/Get-WinUtilToggleStatus.ps1 index cc5b5090..95160ef6 100644 --- a/functions/private/Get-WinUtilToggleStatus.ps1 +++ b/functions/private/Get-WinUtilToggleStatus.ps1 @@ -89,4 +89,13 @@ Function Get-WinUtilToggleStatus { return $true } } -} \ No newline at end of file + if ($ToggleSwitch -eq "WPFToggleTaskbarWidgets") { + $TaskbarWidgets = (Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced").TaskBarDa + if($TaskbarWidgets -eq 0) { + return $false + } + else{ + return $true + } + } +} diff --git a/functions/private/Install-WinUtilWinget.ps1 b/functions/private/Install-WinUtilWinget.ps1 index d5e00dd1..093a5c35 100644 --- a/functions/private/Install-WinUtilWinget.ps1 +++ b/functions/private/Install-WinUtilWinget.ps1 @@ -40,6 +40,8 @@ function Install-WinUtilWinget { Get-WinUtilWingetLatest Write-Host "Installing Winget w/ Prerequsites`r" Add-AppxProvisionedPackage -Online -PackagePath $ENV:TEMP\Microsoft.DesktopAppInstaller.msixbundle -DependencyPackagePath $ENV:TEMP\Microsoft.VCLibs.x64.Desktop.appx, $ENV:TEMP\Microsoft.UI.Xaml.x64.appx -LicensePath $ENV:TEMP\License1.xml + Write-Host "Manually adding Winget Sources, from Winget CDN." + Add-AppxPackage -Path https://cdn.winget.microsoft.com/cache/source.msix #Seems some installs of Winget don't add the repo source, this should makes sure that it's installed every time. Write-Host "Winget Installed" -ForegroundColor Green Write-Host "Enabling NuGet and Module..." Install-PackageProvider -Name NuGet -Force diff --git a/functions/private/Invoke-MicroWin-Helper.ps1 b/functions/private/Invoke-MicroWin-Helper.ps1 index 3ae08d49..f34adb35 100644 --- a/functions/private/Invoke-MicroWin-Helper.ps1 +++ b/functions/private/Invoke-MicroWin-Helper.ps1 @@ -54,38 +54,39 @@ function Remove-Features([switch] $dumpFeatures = $false, [switch] $keepDefender Remove-Features -keepDefender:$false #> - $appxlist = dism /English /image:$scratchDir /Get-Features | Select-String -Pattern "Feature Name : " -CaseSensitive -SimpleMatch - $appxlist = $appxlist -split "Feature Name : " | Where-Object {$_} + $featlist = (Get-WindowsOptionalFeature -Path $scratchDir).FeatureName if ($dumpFeatures) { - $appxlist > allfeaturesdump.txt + $featlist > allfeaturesdump.txt } - $appxlist = $appxlist | Where-Object { + $featlist = $featlist | Where-Object { $_ -NotLike "*Printing*" -AND $_ -NotLike "*TelnetClient*" -AND $_ -NotLike "*PowerShell*" -AND - $_ -NotLike "*NetFx*" + $_ -NotLike "*NetFx*" -AND + $_ -NotLike "*Media*" -AND + $_ -NotLike "*NFS*" } - if ($keepDefender) { $appxlist = $appxlist | Where-Object { $_ -NotLike "*Defender*" }} + if ($keepDefender) { $featlist = $featlist | Where-Object { $_ -NotLike "*Defender*" }} - foreach($feature in $appxlist) + foreach($feature in $featlist) { $status = "Removing feature $feature" - Write-Progress -Activity "Removing features" -Status $status -PercentComplete ($counter++/$appxlist.Count*100) + Write-Progress -Activity "Removing features" -Status $status -PercentComplete ($counter++/$featlist.Count*100) Write-Debug "Removing feature $feature" - # dism /image:$scratchDir /Disable-Feature /FeatureName:$feature /Remove /NoRestart > $null + Disable-WindowsOptionalFeature -Path "$scratchDir" -FeatureName $feature -Remove -ErrorAction SilentlyContinue -NoRestart } Write-Progress -Activity "Removing features" -Status "Ready" -Completed + Write-Host "You can re-enable the disabled features at any time, using either Windows Update or the SxS folder in \Sources." } function Remove-Packages { - $appxlist = dism /English /Image:$scratchDir /Get-Packages | Select-String -Pattern "Package Identity : " -CaseSensitive -SimpleMatch - $appxlist = $appxlist -split "Package Identity : " | Where-Object {$_} + $pkglist = (Get-WindowsPackage -Path "$scratchDir").PackageName - $appxlist = $appxlist | Where-Object { + $pkglist = $pkglist | Where-Object { $_ -NotLike "*ApplicationModel*" -AND $_ -NotLike "*indows-Client-LanguagePack*" -AND $_ -NotLike "*LanguageFeatures-Basic*" -AND @@ -123,11 +124,18 @@ function Remove-Packages $_ -NotLike "*UI.XaML*" } - foreach ($appx in $appxlist) + foreach ($pkg in $pkglist) { - $status = "Removing $appx" - Write-Progress -Activity "Removing Apps" -Status $status -PercentComplete ($counter++/$appxlist.Count*100) - dism /English /image:$scratchDir /Remove-Package /PackageName:$appx /NoRestart + try { + $status = "Removing $pkg" + Write-Progress -Activity "Removing Apps" -Status $status -PercentComplete ($counter++/$pkglist.Count*100) + Remove-WindowsPackage -Path "$scratchDir" -PackageName $pkg -NoRestart -ErrorAction SilentlyContinue + } + catch { + # This can happen if the package that is being removed is a permanent one, like FodMetadata + Write-Host "Could not remove OS package $($pkg)" + continue + } } Write-Progress -Activity "Removing Apps" -Status "Ready" -Completed } @@ -167,7 +175,7 @@ function Remove-ProvisionedPackages([switch] $keepSecurity = $false) { $status = "Removing Provisioned $($appx.PackageName)" Write-Progress -Activity "Removing Provisioned Apps" -Status $status -PercentComplete ($counter++/$appxProvisionedPackages.Count*100) - dism /English /image:$scratchDir /Remove-ProvisionedAppxPackage /PackageName:$($appx.PackageName) /NoRestart + Remove-AppxProvisionedPackage -Path $scratchDir -PackageName $appx.PackageName -ErrorAction SilentlyContinue } Write-Progress -Activity "Removing Provisioned Apps" -Status "Ready" -Completed } diff --git a/functions/private/Invoke-WinUtilTaskbarWidgets.ps1 b/functions/private/Invoke-WinUtilTaskbarWidgets.ps1 new file mode 100644 index 00000000..27077f55 --- /dev/null +++ b/functions/private/Invoke-WinUtilTaskbarWidgets.ps1 @@ -0,0 +1,34 @@ +function Invoke-WinUtilTaskbarWidgets { + <# + + .SYNOPSIS + Enable/Disable Taskbar Widgets + + .PARAMETER Enabled + Indicates whether to enable or disable Taskbar Widgets + + #> + Param($Enabled) + Try{ + if ($Enabled -eq $false){ + Write-Host "Enabling Taskbar Widgets" + $value = 1 + } + else { + Write-Host "Disabling Taskbar Widgets" + $value = 0 + } + $Path = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" + Set-ItemProperty -Path $Path -Name TaskbarDa -Value $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 + } +} diff --git a/functions/private/Test-WinUtilPackageManager.ps1 b/functions/private/Test-WinUtilPackageManager.ps1 index 768c671c..ca269fc3 100644 --- a/functions/private/Test-WinUtilPackageManager.ps1 +++ b/functions/private/Test-WinUtilPackageManager.ps1 @@ -38,10 +38,12 @@ function Test-WinUtilPackageManager { # Check if Winget's Version is too old. $wingetCurrentVersion = [System.Version]::Parse($wingetVersion.Trim('v')) - $wingetBadVersion = [System.Version]::Parse("1.2.10691") # Windows 11 (22H2) comes with v1.2.10691, which is bugged. - $wingetOutdated = $wingetCurrentVersion -le $wingetBadVersion + # Grabs the latest release of Winget from the Github API for version check process. + $response = Invoke-RestMethod -Uri "https://api.github.com/repos/microsoft/Winget-cli/releases/latest" -Method Get -ErrorAction Stop + $wingetLatestVersion = [System.Version]::Parse(($response.tag_name).Trim('v')) #Stores version number of latest release. + $wingetOutdated = $wingetCurrentVersion -lt $wingetLatestVersion Write-Host "===========================================" -ForegroundColor Green - Write-Host "-- Winget is installed ---" -ForegroundColor Green + Write-Host "--- Winget is installed ---" -ForegroundColor Green Write-Host "===========================================" -ForegroundColor Green Write-Host "Version: $wingetVersionFull" -ForegroundColor White @@ -61,7 +63,7 @@ function Test-WinUtilPackageManager { } } else { Write-Host "===========================================" -ForegroundColor Red - Write-Host "-- Winget is not installed ---" -ForegroundColor Red + Write-Host "--- Winget is not installed ---" -ForegroundColor Red Write-Host "===========================================" -ForegroundColor Red $status = "not-installed" } @@ -70,13 +72,13 @@ function Test-WinUtilPackageManager { if ($choco) { if ((Get-Command -Name choco -ErrorAction Ignore) -and ($chocoVersion = (Get-Item "$env:ChocolateyInstall\choco.exe" -ErrorAction Ignore).VersionInfo.ProductVersion)) { Write-Host "===========================================" -ForegroundColor Green - Write-Host "-- Chocolatey is installed ---" -ForegroundColor Green + Write-Host "--- Chocolatey is installed ---" -ForegroundColor Green Write-Host "===========================================" -ForegroundColor Green Write-Host "Version: v$chocoVersion" -ForegroundColor White $status = "installed" } else { Write-Host "===========================================" -ForegroundColor Red - Write-Host "-- Chocolatey is not installed ---" -ForegroundColor Red + Write-Host "--- Chocolatey is not installed ---" -ForegroundColor Red Write-Host "===========================================" -ForegroundColor Red $status = "not-installed" } diff --git a/functions/public/Invoke-WPFMicrowin.ps1 b/functions/public/Invoke-WPFMicrowin.ps1 index 6c8a2d6a..89d15872 100644 --- a/functions/public/Invoke-WPFMicrowin.ps1 +++ b/functions/public/Invoke-WPFMicrowin.ps1 @@ -117,7 +117,7 @@ public class PowerManagement { if (Test-Path $driverPath) { Write-Host "Adding Windows Drivers image($scratchDir) drivers($driverPath) " - dism /English /image:$scratchDir /add-driver /driver:$driverPath /recurse | Out-Host + Add-WindowsDriver -Path "$scratchDir" -Recurse -Driver "$driverPath" } else { @@ -335,7 +335,7 @@ public class PowerManagement { if (Test-Path $driverPath) { Write-Host "Adding Windows Drivers image($scratchDir) drivers($driverPath) " - dism /English /image:$scratchDir /add-driver /driver:$driverPath /recurse | Out-Host + Add-WindowsDriver -Path "$scratchDir" -Driver "$driverPath" -Recurse } else { diff --git a/functions/public/Invoke-WPFToggle.ps1 b/functions/public/Invoke-WPFToggle.ps1 index 1a60217e..fd8a82f4 100644 --- a/functions/public/Invoke-WPFToggle.ps1 +++ b/functions/public/Invoke-WPFToggle.ps1 @@ -25,5 +25,6 @@ function Invoke-WPFToggle { "WPFToggleSnapFlyout" {Invoke-WinUtilSnapFlyout $(Get-WinUtilToggleStatus WPFToggleSnapFlyout)} "WPFToggleMouseAcceleration" {Invoke-WinUtilMouseAcceleration $(Get-WinUtilToggleStatus WPFToggleMouseAcceleration)} "WPFToggleStickyKeys" {Invoke-WinUtilStickyKeys $(Get-WinUtilToggleStatus WPFToggleStickyKeys)} + "WPFToggleTaskbarWidgets" {Invoke-WinUtilTaskbarWidgets $(Get-WinUtilToggleStatus WPFToggleTaskbarWidgets)} } -} \ No newline at end of file +} diff --git a/scripts/main.ps1 b/scripts/main.ps1 index 4a722022..38007969 100644 --- a/scripts/main.ps1 +++ b/scripts/main.ps1 @@ -381,7 +381,7 @@ $sync["CheckboxFilter"].Add_TextChanged({ continue } - $textToSearch = $sync.CheckboxFilter.Text + $textToSearch = $sync.CheckboxFilter.Text.ToLower() $checkBoxName = $CheckBox.Key $textBlockName = $checkBoxName + "Link" diff --git a/winutil.ps1 b/winutil.ps1 index 2f5d7f82..d0ba4f9c 100644 --- a/winutil.ps1 +++ b/winutil.ps1 @@ -10,7 +10,7 @@ Author : Chris Titus @christitustech Runspace Author: @DeveloperDurp GitHub : https://github.com/ChrisTitusTech - Version : 24.03.30 + Version : 24.04.17 #> param ( [switch]$Debug, @@ -47,7 +47,7 @@ Add-Type -AssemblyName System.Windows.Forms # Variable to sync between runspaces $sync = [Hashtable]::Synchronized(@{}) $sync.PSScriptRoot = $PSScriptRoot -$sync.version = "24.03.30" +$sync.version = "24.04.17" $sync.configs = @{} $sync.ProcessRunning = $false @@ -575,6 +575,15 @@ Function Get-WinUtilToggleStatus { return $true } } + if ($ToggleSwitch -eq "WPFToggleTaskbarWidgets") { + $TaskbarWidgets = (Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced").TaskBarDa + if($TaskbarWidgets -eq 0) { + return $false + } + else{ + return $true + } + } } function Get-WinUtilVariables { @@ -777,6 +786,8 @@ function Install-WinUtilWinget { Get-WinUtilWingetLatest Write-Host "Installing Winget w/ Prerequsites`r" Add-AppxProvisionedPackage -Online -PackagePath $ENV:TEMP\Microsoft.DesktopAppInstaller.msixbundle -DependencyPackagePath $ENV:TEMP\Microsoft.VCLibs.x64.Desktop.appx, $ENV:TEMP\Microsoft.UI.Xaml.x64.appx -LicensePath $ENV:TEMP\License1.xml + Write-Host "Manually adding Winget Sources, from Winget CDN." + Add-AppxPackage -Path https://cdn.winget.microsoft.com/cache/source.msix #Seems some installs of Winget don't add the repo source, this should makes sure that it's installed every time. Write-Host "Winget Installed" -ForegroundColor Green # Winget only needs a refresh of the environment variables to be used. Write-Output "Refreshing Environment Variables...`n" @@ -850,38 +861,39 @@ function Remove-Features([switch] $dumpFeatures = $false, [switch] $keepDefender Remove-Features -keepDefender:$false #> - $appxlist = dism /English /image:$scratchDir /Get-Features | Select-String -Pattern "Feature Name : " -CaseSensitive -SimpleMatch - $appxlist = $appxlist -split "Feature Name : " | Where-Object {$_} + $featlist = (Get-WindowsOptionalFeature -Path $scratchDir).FeatureName if ($dumpFeatures) { - $appxlist > allfeaturesdump.txt + $featlist > allfeaturesdump.txt } - $appxlist = $appxlist | Where-Object { + $featlist = $featlist | Where-Object { $_ -NotLike "*Printing*" -AND $_ -NotLike "*TelnetClient*" -AND $_ -NotLike "*PowerShell*" -AND - $_ -NotLike "*NetFx*" + $_ -NotLike "*NetFx*" -AND + $_ -NotLike "*Media*" -AND + $_ -NotLike "*NFS*" } - if ($keepDefender) { $appxlist = $appxlist | Where-Object { $_ -NotLike "*Defender*" }} + if ($keepDefender) { $featlist = $featlist | Where-Object { $_ -NotLike "*Defender*" }} - foreach($feature in $appxlist) + foreach($feature in $featlist) { $status = "Removing feature $feature" - Write-Progress -Activity "Removing features" -Status $status -PercentComplete ($counter++/$appxlist.Count*100) + Write-Progress -Activity "Removing features" -Status $status -PercentComplete ($counter++/$featlist.Count*100) Write-Debug "Removing feature $feature" - # dism /image:$scratchDir /Disable-Feature /FeatureName:$feature /Remove /NoRestart > $null + Disable-WindowsOptionalFeature -Path "$scratchDir" -FeatureName $feature -Remove -ErrorAction SilentlyContinue -NoRestart } Write-Progress -Activity "Removing features" -Status "Ready" -Completed + Write-Host "You can re-enable the disabled features at any time, using either Windows Update or the SxS folder in \Sources." } function Remove-Packages { - $appxlist = dism /English /Image:$scratchDir /Get-Packages | Select-String -Pattern "Package Identity : " -CaseSensitive -SimpleMatch - $appxlist = $appxlist -split "Package Identity : " | Where-Object {$_} + $pkglist = (Get-WindowsPackage -Path "$scratchDir").PackageName - $appxlist = $appxlist | Where-Object { + $pkglist = $pkglist | Where-Object { $_ -NotLike "*ApplicationModel*" -AND $_ -NotLike "*indows-Client-LanguagePack*" -AND $_ -NotLike "*LanguageFeatures-Basic*" -AND @@ -919,11 +931,18 @@ function Remove-Packages $_ -NotLike "*UI.XaML*" } - foreach ($appx in $appxlist) + foreach ($pkg in $pkglist) { - $status = "Removing $appx" - Write-Progress -Activity "Removing Apps" -Status $status -PercentComplete ($counter++/$appxlist.Count*100) - dism /English /image:$scratchDir /Remove-Package /PackageName:$appx /NoRestart + try { + $status = "Removing $pkg" + Write-Progress -Activity "Removing Apps" -Status $status -PercentComplete ($counter++/$pkglist.Count*100) + Remove-WindowsPackage -Path "$scratchDir" -PackageName $pkg -NoRestart -ErrorAction SilentlyContinue + } + catch { + # This can happen if the package that is being removed is a permanent one, like FodMetadata + Write-Host "Could not remove OS package $($pkg)" + continue + } } Write-Progress -Activity "Removing Apps" -Status "Ready" -Completed } @@ -963,7 +982,7 @@ function Remove-ProvisionedPackages([switch] $keepSecurity = $false) { $status = "Removing Provisioned $($appx.PackageName)" Write-Progress -Activity "Removing Provisioned Apps" -Status $status -PercentComplete ($counter++/$appxProvisionedPackages.Count*100) - dism /English /image:$scratchDir /Remove-ProvisionedAppxPackage /PackageName:$($appx.PackageName) /NoRestart + Remove-AppxProvisionedPackage -Path $scratchDir -PackageName $appx.PackageName -ErrorAction SilentlyContinue } Write-Progress -Activity "Removing Provisioned Apps" -Status "Ready" -Completed } @@ -1919,6 +1938,40 @@ Function Invoke-WinUtilStickyKeys { Write-Warning $psitem.Exception.StackTrace } } +function Invoke-WinUtilTaskbarWidgets { + <# + + .SYNOPSIS + Enable/Disable Taskbar Widgets + + .PARAMETER Enabled + Indicates whether to enable or disable Taskbar Widgets + + #> + Param($Enabled) + Try{ + if ($Enabled -eq $false){ + Write-Host "Enabling Taskbar Widgets" + $value = 1 + } + else { + Write-Host "Disabling Taskbar Widgets" + $value = 0 + } + $Path = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" + Set-ItemProperty -Path $Path -Name TaskbarDa -Value $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 Invoke-WinUtilTweaks { <# @@ -2566,10 +2619,12 @@ function Test-WinUtilPackageManager { # Check if Winget's Version is too old. $wingetCurrentVersion = [System.Version]::Parse($wingetVersion.Trim('v')) - $wingetBadVersion = [System.Version]::Parse("1.2.10691") # Windows 11 (22H2) comes with v1.2.10691, which is bugged. - $wingetOutdated = $wingetCurrentVersion -le $wingetBadVersion + # Grabs the latest release of Winget from the Github API for version check process. + $response = Invoke-RestMethod -Uri "https://api.github.com/repos/microsoft/Winget-cli/releases/latest" -Method Get -ErrorAction Stop + $wingetLatestVersion = [System.Version]::Parse(($response.tag_name).Trim('v')) #Stores version number of latest release. + $wingetOutdated = $wingetCurrentVersion -lt $wingetLatestVersion Write-Host "===========================================" -ForegroundColor Green - Write-Host "-- Winget is installed ---" -ForegroundColor Green + Write-Host "--- Winget is installed ---" -ForegroundColor Green Write-Host "===========================================" -ForegroundColor Green Write-Host "Version: $wingetVersionFull" -ForegroundColor White @@ -2589,7 +2644,7 @@ function Test-WinUtilPackageManager { } } else { Write-Host "===========================================" -ForegroundColor Red - Write-Host "-- Winget is not installed ---" -ForegroundColor Red + Write-Host "--- Winget is not installed ---" -ForegroundColor Red Write-Host "===========================================" -ForegroundColor Red $status = "not-installed" } @@ -2598,13 +2653,13 @@ function Test-WinUtilPackageManager { if ($choco) { if ((Get-Command -Name choco -ErrorAction Ignore) -and ($chocoVersion = (Get-Item "$env:ChocolateyInstall\choco.exe" -ErrorAction Ignore).VersionInfo.ProductVersion)) { Write-Host "===========================================" -ForegroundColor Green - Write-Host "-- Chocolatey is installed ---" -ForegroundColor Green + Write-Host "--- Chocolatey is installed ---" -ForegroundColor Green Write-Host "===========================================" -ForegroundColor Green Write-Host "Version: v$chocoVersion" -ForegroundColor White $status = "installed" } else { Write-Host "===========================================" -ForegroundColor Red - Write-Host "-- Chocolatey is not installed ---" -ForegroundColor Red + Write-Host "--- Chocolatey is not installed ---" -ForegroundColor Red Write-Host "===========================================" -ForegroundColor Red $status = "not-installed" } @@ -3694,7 +3749,7 @@ public class PowerManagement { if (Test-Path $driverPath) { Write-Host "Adding Windows Drivers image($scratchDir) drivers($driverPath) " - dism /English /image:$scratchDir /add-driver /driver:$driverPath /recurse | Out-Host + Add-WindowsDriver -Path "$scratchDir" -Recurse -Driver "$driverPath" } else { @@ -3912,7 +3967,7 @@ public class PowerManagement { if (Test-Path $driverPath) { Write-Host "Adding Windows Drivers image($scratchDir) drivers($driverPath) " - dism /English /image:$scratchDir /add-driver /driver:$driverPath /recurse | Out-Host + Add-WindowsDriver -Path "$scratchDir" -Driver "$driverPath" -Recurse } else { @@ -4310,6 +4365,7 @@ function Invoke-WPFToggle { "WPFToggleSnapFlyout" {Invoke-WinUtilSnapFlyout $(Get-WinUtilToggleStatus WPFToggleSnapFlyout)} "WPFToggleMouseAcceleration" {Invoke-WinUtilMouseAcceleration $(Get-WinUtilToggleStatus WPFToggleMouseAcceleration)} "WPFToggleStickyKeys" {Invoke-WinUtilStickyKeys $(Get-WinUtilToggleStatus WPFToggleStickyKeys)} + "WPFToggleTaskbarWidgets" {Invoke-WinUtilTaskbarWidgets $(Get-WinUtilToggleStatus WPFToggleTaskbarWidgets)} } } function Invoke-WPFtweaksbutton { @@ -4943,6 +4999,14 @@ $sync.configs.applications = '{ "link": "https://www.autohotkey.com/", "winget": "AutoHotkey.AutoHotkey" }, + "WPFInstallazuredatastudio": { + "category": "Microsoft Tools", + "choco": "azure-data-studio", + "content": "Microsoft Azure Data Studio", + "description": "Azure Data Studio is a data management tool that enables you to work with SQL Server, Azure SQL DB and SQL DW from Windows, macOS and Linux.", + "link": "https://docs.microsoft.com/sql/azure-data-studio/what-is-azure-data-studio", + "winget": "Microsoft.AzureDataStudio" + }, "WPFInstallbarrier": { "category": "Utilities", "choco": "barrier", @@ -5111,6 +5175,14 @@ $sync.configs.applications = '{ "link": "https://crystalmark.info/en/software/crystaldiskinfo/", "winget": "CrystalDewWorld.CrystalDiskInfo" }, + "WPFInstallcapframex": { + "category": "Utilities", + "choco": "na", + "content": "CapFrameX", + "description": "Frametimes capture and analysis tool based on Intel''s PresentMon. Overlay provided by Rivatuner Statistics Server.", + "link": "https://www.capframex.com/", + "winget": "CXWorld.CapFrameX" + }, "WPFInstallcrystaldiskmark": { "category": "Utilities", "choco": "crystaldiskmark", @@ -5439,6 +5511,14 @@ $sync.configs.applications = '{ "link": "https://www.freecadweb.org/", "winget": "FreeCAD.FreeCAD" }, + "WPFInstallorcaslicer": { + "category": "Multimedia Tools", + "choco": "orcaslicer", + "content": "OrcaSlicer", + "description": "G-code generator for 3D printers (Bambu, Prusa, Voron, VzBot, RatRig, Creality, etc.)", + "link": "https://github.com/SoftFever/OrcaSlicer", + "winget": "SoftFever.OrcaSlicer" + }, "WPFInstallfzf": { "category": "Utilities", "choco": "fzf", @@ -5695,6 +5775,38 @@ $sync.configs.applications = '{ "link": "https://adoptopenjdk.net/", "winget": "EclipseAdoptium.Temurin.8.JRE" }, + "WPFInstalljava11runtime": { + "category": "Development", + "choco": "na", + "content": "Eclipse Temurin JRE 11", + "description": "Eclipse Temurin JRE is the open source Java SE build based upon OpenJRE.", + "link": "https://adoptium.net/", + "winget": "EclipseAdoptium.Temurin.11.JRE" + }, + "WPFInstalljava17runtime": { + "category": "Development", + "choco": "na", + "content": "Eclipse Temurin JRE 17", + "description": "Eclipse Temurin JRE is the open source Java SE build based upon OpenJRE.", + "link": "https://adoptium.net/", + "winget": "EclipseAdoptium.Temurin.17.JRE" + }, + "WPFInstalljava18runtime": { + "category": "Development", + "choco": "na", + "content": "Eclipse Temurin JRE 18", + "description": "Eclipse Temurin JRE is the open source Java SE build based upon OpenJRE.", + "link": "https://adoptium.net/", + "winget": "EclipseAdoptium.Temurin.18.JRE" + }, + "WPFInstalljava19runtime": { + "category": "Development", + "choco": "na", + "content": "Eclipse Temurin JRE 19", + "description": "Eclipse Temurin JRE is the open source Java SE build based upon OpenJRE.", + "link": "https://adoptium.net/", + "winget": "EclipseAdoptium.Temurin.19.JRE" + }, "WPFInstalljdownloader": { "category": "Utilities", "choco": "jdownloader", @@ -6255,6 +6367,14 @@ $sync.configs.applications = '{ "link": "https://www.postman.com/", "winget": "Postman.Postman" }, + "WPFInstallpowerautomate": { + "category": "Microsoft Tools", + "choco": "powerautomatedesktop", + "content": "Power Automate", + "description": "Using Power Automate Desktop you can automate tasks on the desktop as well as the Web.", + "link": "https://www.microsoft.com/en-us/power-platform/products/power-automate", + "winget": "Microsoft.PowerAutomateDesktop" + }, "WPFInstallpowerbi": { "category": "Microsoft Tools", "choco": "powerbi", @@ -6343,6 +6463,14 @@ $sync.configs.applications = '{ "link": "https://www.qbittorrent.org/", "winget": "qBittorrent.qBittorrent" }, + "WPFInstalltixati": { + "category": "Utilities", + "choco": "tixati.portable", + "content": "Tixati", + "description": "Tixati is a cross-platform BitTorrent client written in C++ that has been designed to be light on system resources.", + "link": "https://www.tixati.com/", + "winget": "Tixati.Tixati.Portable" + }, "WPFInstallqtox": { "category": "Communications", "choco": "qtox", @@ -6559,6 +6687,14 @@ $sync.configs.applications = '{ "link": "https://www.sumatrapdfreader.org/free-pdf-reader.html", "winget": "SumatraPDF.SumatraPDF" }, + "WPFInstallpdfgear": { + "category": "Document", + "choco": "na", + "content": "PDFgear", + "description": "PDFgear is a piece of full-featured PDF management software for Windows, Mac, and mobile, and it''s completely free to use.", + "link": "https://www.pdfgear.com/", + "winget": "PDFgear.PDFgear" + }, "WPFInstallsunshine": { "category": "Games", "choco": "sunshine", @@ -6575,6 +6711,14 @@ $sync.configs.applications = '{ "link": "https://stefansundin.github.io/superf4/", "winget": "StefanSundin.Superf4" }, + "WPFInstallswift": { + "category": "Development", + "choco": "na", + "content": "Swift toolchain", + "description": "Swift is a general-purpose programming language that???s approachable for newcomers and powerful for experts.", + "link": "https://www.swift.org/", + "winget": "Swift.Toolchain" + }, "WPFInstallsynctrayzor": { "category": "Utilities", "choco": "synctrayzor", @@ -6583,6 +6727,14 @@ $sync.configs.applications = '{ "link": "https://github.com/canton7/SyncTrayzor/", "winget": "SyncTrayzor.SyncTrayzor" }, + "WPFInstallsqlmanagementstudio": { + "category": "Microsoft Tools", + "choco": "sql-server-management-studio", + "content": "Microsoft SQL Server Management Studio", + "description": "SQL Server Management Studio (SSMS) is an integrated environment for managing any SQL infrastructure, from SQL Server to Azure SQL Database. SSMS provides tools to configure, monitor, and administer instances of SQL Server and databases.", + "link": "https://learn.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver16", + "winget": "Microsoft.SQLServerManagementStudio" + }, "WPFInstalltailscale": { "category": "Utilities", "choco": "tailscale", @@ -6631,6 +6783,14 @@ $sync.configs.applications = '{ "link": "https://telegram.org/", "winget": "Telegram.TelegramDesktop" }, + "WPFInstallunigram": { + "category": "Communications", + "choco": "na", + "content": "Unigram", + "description": "Unigram - Telegram for Windows", + "link": "https://unigramdev.github.io/", + "winget": "Telegram.Unigram" + }, "WPFInstallterminal": { "category": "Microsoft Tools", "choco": "microsoft-windows-terminal", @@ -7126,6 +7286,46 @@ $sync.configs.applications = '{ "description": "TightVNC is a free and Open Source remote desktop software that lets you access and control a computer over the network. With its intuitive interface, you can interact with the remote screen as if you were sitting in front of it. You can open files, launch applications, and perform other actions on the remote desktop almost as if you were physically there", "link": "https://www.tightvnc.com/", "winget": "GlavSoft.TightVNC" + }, + "WPFInstallultravnc": { + "category": "Utilities", + "choco": "ultravnc", + "content": "UltraVNC", + "description": "UltraVNC is a powerful, easy to use and free - remote pc access softwares - that can display the screen of another computer (via internet or network) on your own screen. The program allows you to use your mouse and keyboard to control the other PC remotely. It means that you can work on a remote computer, as if you were sitting in front of it, right from your current location.", + "link": "https://uvnc.com/", + "winget": "uvncbvba.UltraVnc" + }, + "WPFInstallwindowsfirewallcontrol": { + "category": "Utilities", + "choco": "windowsfirewallcontrol", + "content": "Windows Firewall Control", + "description": "Windows Firewall Control is a powerful tool which extends the functionality of Windows Firewall and provides new extra features which makes Windows Firewall better.", + "link": "https://www.binisoft.org/wfc", + "winget": "BiniSoft.WindowsFirewallControl" + }, + "WPFInstallvistaswitcher": { + "category": "Utilities", + "choco": "na", + "content": "VistaSwitcher", + "description": "VistaSwitcher makes it easier for you to locate windows and switch focus, even on multi-monitor systems. The switcher window consists of an easy-to-read list of all tasks running with clearly shown titles and a full-sized preview of the selected task.", + "link": "https://www.ntwind.com/freeware/vistaswitcher.html", + "winget": "ntwind.VistaSwitcher" + }, + "WPFInstallautodarkmode": { + "category": "Utilities", + "choco": "auto-dark-mode", + "content": "Windows Auto Dark Mode", + "description": "Automatically switches between the dark and light theme of Windows 10 and Windows 11", + "link": "https://github.com/AutoDarkMode/Windows-Auto-Night-Mode", + "winget": "Armin2208.WindowsAutoNightMode" + }, + "WPFInstallmagicwormhole": { + "category": "Utilities", + "choco": "magic-wormhole", + "content": "Magic Wormhole", + "description": "get things from one computer to another, safely", + "link": "https://github.com/magic-wormhole/magic-wormhole", + "winget": "magic-wormhole.magic-wormhole" } }' | convertfrom-json $sync.configs.dns = '{ @@ -7612,6 +7812,9 @@ $sync.configs.tweaks = '{ ], "InvokeScript": [ "powercfg.exe /hibernate off" + ], + "UndoScript": [ + "powercfg.exe /hibernate on" ] }, "WPFTweaksHome": { @@ -9448,6 +9651,13 @@ $sync.configs.tweaks = '{ "Name": "Scheduling Category", "Value": "High", "Type": "String" + }, + { + "Path": "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\UserProfileEngagement", + "OriginalValue": "1", + "Name": "ScoobeSystemSettingEnabled", + "Value": "0", + "Type": "DWord" } ], "InvokeScript": [ @@ -9793,6 +10003,23 @@ $sync.configs.tweaks = '{ " ] }, + "WPFTweaksEndTaskOnTaskbar": { + "Content": "Enable End Task With Right Click", + "Description": "Enables option to end task when right clicking a program in the taskbar", + "category": "Essential Tweaks", + "panel": "1", + "Order": "a002_", + "InvokeScript": [ + " + Set-ItemProperty -Path \"HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\TaskbarDeveloperSettings\" -Name \"TaskbarEndTask\" -Type \"DWord\" -Value \"1\" + " + ], + "UndoScript": [ + " + Set-ItemProperty -Path \"HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\TaskbarDeveloperSettings\" -Name \"TaskbarEndTask\" -Type \"DWord\" -Value \"0\" + " + ] + }, "WPFTweaksOO": { "Content": "Run OO Shutup", "Description": "Runs OO Shutup from https://www.oo-software.com/en/shutup10", @@ -9815,11 +10042,10 @@ $sync.configs.tweaks = '{ "panel": "1", "Order": "a010_", "InvokeScript": [ - "Remove-Item -Path \"HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\StorageSense\\Parameters\\StoragePolicy\" -Recurse -ErrorAction SilentlyContinue" + "Set-ItemProperty -Path \"HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\StorageSense\\Parameters\\StoragePolicy\" -Name \"01\" -Value 0 -Type Dword -Force" ], "UndoScript": [ - "New-Item -Path \"HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\StorageSense\\Parameters\\StoragePolicy\" | Out-Null - " + "Set-ItemProperty -Path \"HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\StorageSense\\Parameters\\StoragePolicy\" -Name \"01\" -Value 1 -Type Dword -Force" ] }, "WPFTweaksRemoveEdge": { @@ -9957,12 +10183,20 @@ $sync.configs.tweaks = '{ "panel": "1", "Order": "a028_", "InvokeScript": [ - "New-Item -Path \"HKCU:\\Software\\Classes\\CLSID\\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\" -Name \"InprocServer32\" -force -value \"\" " + " + New-Item -Path \"HKCU:\\Software\\Classes\\CLSID\\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\" -Name \"InprocServer32\" -force -value \"\" + Write-Host Restarting explorer.exe ... + $process = Get-Process -Name \"explorer\" + Stop-Process -InputObject $process + " ], "UndoScript": [ " Remove-Item -Path \"HKCU:\\Software\\Classes\\CLSID\\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\" -Recurse -Confirm:$false -Force - Write-Host Restart Needed for change + # Restarting Explorer in the Undo Script might not be necessary, as the Registry change without restarting Explorer does work, but just to make sure. + Write-Host Restarting explorer.exe ... + $process = Get-Process -Name \"explorer\" + Stop-Process -InputObject $process " ] }, @@ -10172,6 +10406,14 @@ $sync.configs.tweaks = '{ "Order": "a067_", "Type": "Toggle" }, + "WPFToggleTaskbarWidgets": { + "Content": "Taskbar Widgets", + "Description": "If Enabled then Widgets Icon in Taskbar will be shown.", + "category": "Customize Preferences", + "panel": "2", + "Order": "a068_", + "Type": "Toggle" + }, "WPFchangedns": { "Content": "DNS", "category": "z__Advanced Tweaks - CAUTION", @@ -11023,6 +11265,9 @@ $inputXML = ' + + + @@ -11072,12 +11317,24 @@ $inputXML = ' + + + + + + + + + + + + @@ -11095,17 +11352,17 @@ $inputXML = ' + + + + + - - - - - @@ -11137,6 +11394,9 @@ $inputXML = ' + + + @@ -11213,6 +11473,9 @@ $inputXML = ' + + + @@ -11276,15 +11539,15 @@ $inputXML = ' - - - + + + @@ -11307,6 +11570,9 @@ $inputXML = ' + + + - - - - - @@ -11549,6 +11824,9 @@ $inputXML = ' + + + @@ -11570,6 +11848,9 @@ $inputXML = ' + + + @@ -11638,15 +11919,15 @@ $inputXML = ' - - - + + + @@ -11659,6 +11940,9 @@ $inputXML = ' + + + @@ -11773,6 +12057,9 @@ $inputXML = ' + + + @@ -11785,9 +12072,18 @@ $inputXML = ' + + + + + + + + + @@ -11843,6 +12139,7 @@ $inputXML = ' + +