mirror of
https://github.com/ChrisTitusTech/winutil.git
synced 2025-07-01 10:32:35 -05:00
Compare commits
52 Commits
70ec481305
...
24.06.18
Author | SHA1 | Date | |
---|---|---|---|
9be030a4e2 | |||
4348f052c3 | |||
ad81bab274 | |||
3a83203298 | |||
09b1e56967 | |||
af94adbabe | |||
a609f771c8 | |||
2b80e14bf9 | |||
1325ef54b8 | |||
8a76641d20 | |||
3dca1ee43e | |||
7b6decb28a | |||
774b64b092 | |||
02ea93c80f | |||
5e10883547 | |||
a8af90a112 | |||
2354645b47 | |||
9ef050442d | |||
c8ae4a812e | |||
ad080f267e | |||
fec5b68b10 | |||
57ff8b0188 | |||
9eceae6751 | |||
88a622c368 | |||
4a7c8a35bf | |||
c3b12e89f8 | |||
f776717f67 | |||
54a575274d | |||
5cd75c0ed6 | |||
6e7c5336c2 | |||
ca9c764cd7 | |||
23af79852a | |||
7bfcd7cb25 | |||
4de1ac39ef | |||
4ac5b79fc8 | |||
420f37f205 | |||
c6c3f0cd03 | |||
532e40b1ab | |||
9291020d12 | |||
caeb89f5d0 | |||
c2be437624 | |||
93d517da44 | |||
f83d7126bc | |||
f6e9028fdb | |||
cfd2f54827 | |||
dd2e4fb337 | |||
31c6622926 | |||
e745d798b1 | |||
a29364984b | |||
07eeed310b | |||
8e00077e50 | |||
fc505872d2 |
55
.github/workflows/close-old-issues.yaml
vendored
55
.github/workflows/close-old-issues.yaml
vendored
@ -3,54 +3,21 @@ name: Close Inactive Issues
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 0 * * *' # Run daily
|
||||
workflow_dispatch: # This line enables manual triggering
|
||||
|
||||
jobs:
|
||||
close-issues:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
permissions:
|
||||
issues: write # Ensure necessary permissions for issues
|
||||
pull-requests: none
|
||||
contents: none
|
||||
steps:
|
||||
- name: Close inactive issues
|
||||
uses: actions/github-script@v7
|
||||
uses: actions/stale@v9.0.0
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
script: |
|
||||
const octokit = github.getOctokit();
|
||||
|
||||
// Get the repository owner and name
|
||||
const { owner, repo } = github.context.repo;
|
||||
|
||||
// Define the inactivity period (14 days)
|
||||
const inactivityPeriod = new Date();
|
||||
inactivityPeriod.setDate(inactivityPeriod.getDate() - 14);
|
||||
|
||||
async function run() {
|
||||
// Get all open issues
|
||||
const issues = await octokit.issues.listForRepo({
|
||||
owner,
|
||||
repo,
|
||||
state: 'open',
|
||||
});
|
||||
|
||||
// Close issues inactive for more than the inactivity period
|
||||
for (const issue of issues.data) {
|
||||
const lastCommentDate = issue.updated_at;
|
||||
if (new Date(lastCommentDate) < inactivityPeriod) {
|
||||
// Close the issue and add a comment
|
||||
await octokit.issues.update({
|
||||
owner,
|
||||
repo,
|
||||
issue_number: issue.number,
|
||||
state: 'closed',
|
||||
});
|
||||
|
||||
await octokit.issues.createComment({
|
||||
owner,
|
||||
repo,
|
||||
issue_number: issue.number,
|
||||
body: 'Closed due to inactivity',
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
run().catch(error => console.error(error));
|
||||
exempt-issue-labels: "Keep Issue Open"
|
||||
days-before-issue-close: 14
|
||||
close-issue-message: "This issue was closed because it has been inactive for 14 days"
|
||||
debug-only: false # Make this field equal true if you want to test your configuration if it works or not
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
24
.github/workflows/compile.yaml
vendored
Normal file
24
.github/workflows/compile.yaml
vendored
Normal file
@ -0,0 +1,24 @@
|
||||
name: Compile
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- test*
|
||||
|
||||
jobs:
|
||||
build-runspace:
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ github.head_ref }}
|
||||
- name: Compile project
|
||||
shell: pwsh
|
||||
run: |
|
||||
Set-ExecutionPolicy Bypass -Scope Process -Force; ./Compile.ps1
|
||||
continue-on-error: false # Directly fail the job on error, removing the need for a separate check
|
||||
- uses: stefanzweifel/git-auto-commit-action@v5
|
||||
with:
|
||||
commit_message: Compile Winutil
|
||||
if: success()
|
51
.github/workflows/release.yaml
vendored
51
.github/workflows/release.yaml
vendored
@ -1,21 +1,44 @@
|
||||
name: Update Branch
|
||||
name: Release WinUtil
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- test*
|
||||
workflow_run:
|
||||
workflows: ["Compile"] #Ensure Compile winget.ps1 is done
|
||||
types:
|
||||
- completed
|
||||
|
||||
jobs:
|
||||
build-runspace:
|
||||
runs-on: windows-latest
|
||||
outputs:
|
||||
version: ${{ steps.extract_version.outputs.version }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
ref: ${{ github.head_ref }}
|
||||
- name: Create local changes
|
||||
run: |
|
||||
powershell.exe -f Compile.ps1
|
||||
- uses: stefanzweifel/git-auto-commit-action@v4.16.0
|
||||
with:
|
||||
commit_message: Compile Winutil
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Extract Version from winutil.ps1
|
||||
id: extract_version
|
||||
run: |
|
||||
$version = ''
|
||||
Get-Content ./winutil.ps1 -TotalCount 30 | ForEach-Object {
|
||||
if ($_ -match 'Version\s*:\s*(\d{2}\.\d{2}\.\d{2})') {
|
||||
$version = $matches[1]
|
||||
echo "version=$version" >> $GITHUB_ENV
|
||||
echo "::set-output name=version::$version"
|
||||
break
|
||||
}
|
||||
}
|
||||
if (-not $version) {
|
||||
Write-Error "Version not found in winutil.ps1"
|
||||
exit 1
|
||||
}
|
||||
shell: pwsh
|
||||
|
||||
- name: Create and Upload Release
|
||||
id: create_release
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
tag_name: ${{ steps.extract_version.outputs.version }}
|
||||
name: Release ${{ steps.extract_version.outputs.version }}
|
||||
files: ./winutil.ps1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
4
.github/workflows/unittests.yaml
vendored
4
.github/workflows/unittests.yaml
vendored
@ -27,13 +27,13 @@ jobs:
|
||||
- name: Install Pester
|
||||
run: |
|
||||
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
|
||||
Install-Module -Name Pester -Force -AllowClobber
|
||||
Install-Module -Name Pester -Force -SkipPublisherCheck -AllowClobber
|
||||
shell: pwsh
|
||||
|
||||
- name: Run Pester tests
|
||||
run: |
|
||||
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
|
||||
Invoke-Pester -Path 'pester/*.Tests.ps1' -EnableExit
|
||||
Invoke-Pester -Path 'pester/*.Tests.ps1' -Output Detailed
|
||||
|
||||
shell: pwsh
|
||||
env:
|
||||
|
6
.gitignore
vendored
6
.gitignore
vendored
@ -15,6 +15,11 @@ winutil.pdb
|
||||
# Folder config file
|
||||
[Dd]esktop.ini
|
||||
|
||||
# Ignore Generated XAML Files
|
||||
xaml/inputApp.xaml
|
||||
xaml/inputFeatures.xaml
|
||||
xaml/inputTweaks.xaml
|
||||
|
||||
# Executables and Configs
|
||||
winget.msixbundle
|
||||
pester.ps1
|
||||
@ -39,3 +44,4 @@ Microsoft.PowerShell.ConsoleHost.dll
|
||||
microwin.log
|
||||
True
|
||||
test.ps1
|
||||
winutil.ps1
|
||||
|
110
Compile.ps1
110
Compile.ps1
@ -1,35 +1,109 @@
|
||||
param (
|
||||
[switch]$Debug
|
||||
)
|
||||
$OFS = "`r`n"
|
||||
$scriptname = "winutil.ps1"
|
||||
|
||||
# Variable to sync between runspaces
|
||||
$sync = [Hashtable]::Synchronized(@{})
|
||||
$sync.PSScriptRoot = $PSScriptRoot
|
||||
$sync.configs = @{}
|
||||
|
||||
if (Test-Path -Path "$($scriptname)")
|
||||
{
|
||||
Remove-Item -Force "$($scriptname)"
|
||||
}
|
||||
|
||||
Write-output '
|
||||
$header = @"
|
||||
################################################################################################################
|
||||
### ###
|
||||
### WARNING: This file is automatically generated DO NOT modify this file directly as it will be overwritten ###
|
||||
### ###
|
||||
################################################################################################################
|
||||
' | Out-File ./$scriptname -Append -Encoding ascii
|
||||
"@
|
||||
|
||||
(Get-Content .\scripts\start.ps1).replace('#{replaceme}',"$(Get-Date -Format yy.MM.dd)") | Out-File ./$scriptname -Append -Encoding ascii
|
||||
# Create the script in memory.
|
||||
$script_content = [System.Collections.Generic.List[string]]::new()
|
||||
|
||||
Write-Progress -Activity "Compiling" -Status "Adding: Header" -PercentComplete 5
|
||||
$script_content.Add($header)
|
||||
|
||||
Write-Progress -Activity "Compiling" -Status "Adding: Version" -PercentComplete 10
|
||||
$script_content.Add($(Get-Content .\scripts\start.ps1).replace('#{replaceme}',"$(Get-Date -Format yy.MM.dd)"))
|
||||
|
||||
Write-Progress -Activity "Compiling" -Status "Adding: Functions" -PercentComplete 20
|
||||
Get-ChildItem .\functions -Recurse -File | ForEach-Object {
|
||||
Get-Content $psitem.FullName | Out-File ./$scriptname -Append -Encoding ascii
|
||||
}
|
||||
|
||||
Get-ChildItem .\xaml | ForEach-Object {
|
||||
$xaml = (Get-Content $psitem.FullName).replace("'","''")
|
||||
Write-output "`$$($psitem.BaseName) = '$xaml'" | Out-File ./$scriptname -Append -Encoding ascii
|
||||
}
|
||||
|
||||
$script_content.Add($(Get-Content $psitem.FullName))
|
||||
}
|
||||
Write-Progress -Activity "Compiling" -Status "Adding: Config *.json" -PercentComplete 40
|
||||
Get-ChildItem .\config | Where-Object {$psitem.extension -eq ".json"} | ForEach-Object {
|
||||
|
||||
$json = (Get-Content $psitem.FullName).replace("'","''")
|
||||
|
||||
Write-output "`$sync.configs.$($psitem.BaseName) = '$json' `| convertfrom-json" | Out-File ./$scriptname -Append -Encoding ascii
|
||||
# Replace every XML Special Character so it'll render correctly in final build
|
||||
# Only do so if json files has content to be displayed (for example the applications, tweaks, features json files)
|
||||
# Some Type Convertion using Casting and Cleaning Up of the convertion result using 'Replace' Method
|
||||
$jsonAsObject = $json | convertfrom-json
|
||||
$firstLevelJsonList = ([System.String]$jsonAsObject).split('=;') | ForEach-Object {
|
||||
$_.Replace('=}','').Replace('@{','').Replace(' ','')
|
||||
}
|
||||
|
||||
for ($i = 0; $i -lt $firstLevelJsonList.Count; $i += 1) {
|
||||
$firstLevelName = $firstLevelJsonList[$i]
|
||||
# Note: Avoid using HTML Entity Codes (for example '”' (stands for "Right Double Quotation Mark")), and use HTML decimal/hex codes instead.
|
||||
# as using HTML Entity Codes will result in XML parse Error when running the compiled script.
|
||||
if ($jsonAsObject.$firstLevelName.content -ne $null) {
|
||||
$jsonAsObject.$firstLevelName.content = $jsonAsObject.$firstLevelName.content.replace('&','&').replace('“','“').replace('”','”').replace("'",''').replace('<','<').replace('>','>')
|
||||
$jsonAsObject.$firstLevelName.content = $jsonAsObject.$firstLevelName.content.replace('''',"'") # resolves the Double Apostrophe caused by the first replace function in the main loop
|
||||
}
|
||||
if ($jsonAsObject.$firstLevelName.description -ne $null) {
|
||||
$jsonAsObject.$firstLevelName.description = $jsonAsObject.$firstLevelName.description.replace('&','&').replace('“','“').replace('”','”').replace("'",''').replace('<','<').replace('>','>')
|
||||
$jsonAsObject.$firstLevelName.description = $jsonAsObject.$firstLevelName.description.replace('''',"'") # resolves the Double Apostrophe caused by the first replace function in the main loop
|
||||
}
|
||||
}
|
||||
# The replace at the end is required, as without it the output of converto-json will be somewhat weird for Multiline String
|
||||
# Most Notably is the scripts in json files, making it harder for users who want to review these scripts that are found in the final compiled script
|
||||
$json = ($jsonAsObject | convertto-json -Depth 3).replace('\r\n',"`r`n")
|
||||
|
||||
$sync.configs.$($psitem.BaseName) = $json | convertfrom-json
|
||||
$script_content.Add($(Write-output "`$sync.configs.$($psitem.BaseName) = '$json' `| convertfrom-json" ))
|
||||
}
|
||||
Write-Progress -Activity "Compiling" -Status "Adding: Config *.cfg" -PercentComplete 45
|
||||
Get-ChildItem .\config | Where-Object {$PSItem.Extension -eq ".cfg"} | ForEach-Object {
|
||||
$script_content.Add($(Write-output "`$sync.configs.$($psitem.BaseName) = '$(Get-Content $PSItem.FullName)'"))
|
||||
}
|
||||
Get-ChildItem .\config | Where-Object {$PSItem.Extension -eq ".cfg"} | ForEach-Object {
|
||||
$script_content.Add($(Write-output "`$sync.configs.$($psitem.BaseName) = '$(Get-Content $PSItem.FullName)'"))
|
||||
}
|
||||
|
||||
Get-Content .\scripts\main.ps1 | Out-File ./$scriptname -Append -Encoding ascii
|
||||
$xaml = (Get-Content .\xaml\inputXML.xaml).replace("'","''")
|
||||
|
||||
# Dot-source the Get-TabXaml function
|
||||
. .\functions\private\Get-TabXaml.ps1
|
||||
|
||||
Write-Progress -Activity "Compiling" -Status "Building: Xaml " -PercentComplete 75
|
||||
$appXamlContent = Get-TabXaml "applications" 5
|
||||
$tweaksXamlContent = Get-TabXaml "tweaks"
|
||||
$featuresXamlContent = Get-TabXaml "feature"
|
||||
|
||||
|
||||
Write-Progress -Activity "Compiling" -Status "Adding: Xaml " -PercentComplete 90
|
||||
# Replace the placeholder in $inputXML with the content of inputApp.xaml
|
||||
$xaml = $xaml -replace "{{InstallPanel_applications}}", $appXamlContent
|
||||
$xaml = $xaml -replace "{{InstallPanel_tweaks}}", $tweaksXamlContent
|
||||
$xaml = $xaml -replace "{{InstallPanel_features}}", $featuresXamlContent
|
||||
|
||||
$script_content.Add($(Write-output "`$inputXML = '$xaml'"))
|
||||
|
||||
$script_content.Add($(Get-Content .\scripts\main.ps1))
|
||||
|
||||
if ($Debug){
|
||||
Write-Progress -Activity "Compiling" -Status "Writing debug files" -PercentComplete 95
|
||||
$appXamlContent | Out-File -FilePath ".\xaml\inputApp.xaml" -Encoding ascii
|
||||
$tweaksXamlContent | Out-File -FilePath ".\xaml\inputTweaks.xaml" -Encoding ascii
|
||||
$featuresXamlContent | Out-File -FilePath ".\xaml\inputFeatures.xaml" -Encoding ascii
|
||||
}
|
||||
else {
|
||||
Write-Progress -Activity "Compiling" -Status "Removing temporary files" -PercentComplete 99
|
||||
Remove-Item ".\xaml\inputApp.xaml" -ErrorAction SilentlyContinue
|
||||
Remove-Item ".\xaml\inputTweaks.xaml" -ErrorAction SilentlyContinue
|
||||
Remove-Item ".\xaml\inputFeatures.xaml" -ErrorAction SilentlyContinue
|
||||
}
|
||||
|
||||
Set-Content -Path $scriptname -Value ($script_content -join "`r`n") -Encoding ascii
|
||||
Write-Progress -Activity "Compiling" -Completed
|
26
README.md
26
README.md
@ -10,7 +10,7 @@ Winutil must be run in Admin mode because it performs system-wide tweaks. To ach
|
||||
|
||||
1. **Right-Click Method:**
|
||||
- Right-click on the start menu.
|
||||
- Choose "PowerShell As Admin" (for Windows 10) or "Windows Terminal As Admin" (for Windows 11).
|
||||
- Choose "Windows PowerShell (Admin)" (for Windows 10) or "Terminal (Admin)" (for Windows 11).
|
||||
|
||||
2. **Search and Launch Method:**
|
||||
- Press the Windows key.
|
||||
@ -22,19 +22,19 @@ Winutil must be run in Admin mode because it performs system-wide tweaks. To ach
|
||||
|
||||
#### Simple way
|
||||
|
||||
```
|
||||
iwr -useb https://christitus.com/win | iex
|
||||
```
|
||||
or by executing:
|
||||
```
|
||||
irm https://christitus.com/win | iex
|
||||
```
|
||||
Courtesy of the issue raised at: [#144](/../../issues/144)
|
||||
|
||||
if for some reason this site is not reachable from your country please try running it directly from github
|
||||
|
||||
or by executing:
|
||||
```
|
||||
irm https://raw.githubusercontent.com/ChrisTitusTech/winutil/main/winutil.ps1 | iex
|
||||
iwr -useb https://christitus.com/win | iex
|
||||
```
|
||||
|
||||
if for some reason this site is not reachable from your country please try running it directly from github (replace `RELEASE_TAG` with current release that you are interested in, for example `v2024.06.05`)
|
||||
```
|
||||
irm "https://github.com/ChrisTitusTech/winutil/releases/download/RELEASE_TAG/winutil.ps1" | iex
|
||||
```
|
||||
|
||||
#### Automation
|
||||
@ -50,7 +50,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.
|
||||
|
||||
@ -97,7 +97,9 @@ If you are still having issues try changing your DNS provider to 1.1.1.1 || 1.0.
|
||||
|
||||
- Essential Tweaks: Offers a collection of essential tweaks aimed at improving system performance, privacy, and resource utilization. These tweaks include creating a system restore point, disabling telemetry, Wi-Fi Sense, setting services to manual, disabling location tracking, and HomeGroup, among others.
|
||||
|
||||
- Misc. Tweaks: Encompasses a range of various tweaks to further optimize the system. These tweaks include enabling/disabling power throttling, enabling num lock on startup, removing Cortana and Edge, disabling User Account Control (UAC), notification panel, and configuring TPM during updates, among others.
|
||||
- Advanced Tweaks: Encompasses a range of various advanced power user tweaks to further optimize the system. These tweaks include removing OneDrive and Edge, disabling User Account Control (UAC), notification panel, among others.
|
||||
|
||||
- Toggles: Adds easy to use, one click shortcuts for toggling dark mode, NumLock on startup, file extensions, sticky keys, among others.
|
||||
|
||||
- Additional Tweaks: Introduces various other tweaks such as enabling dark mode, changing DNS settings, adding an Ultimate Performance mode, and creating shortcuts for WinUtil tools. These tweaks provide users with additional customization options to tailor their system to their preferences.
|
||||
|
||||
@ -125,7 +127,9 @@ If you encounter any challenges or problems with the script, I kindly request th
|
||||
|
||||
## Contribute Code
|
||||
|
||||
To contribute new code, please ensure that it is submitted to the **TEST BRANCH**. Please note that merges will not be performed directly on the MAIN branch.
|
||||
Pull Requests are now handled directly on the MAIN branch. This was done since we can now select specific releases to launch via releases in GitHub.
|
||||
|
||||
If doing a code change and you can submit a PR to main branch, but I am very selective about these. Do not use a code formatter, massive amounts of line changes, and make multiple feature changes. EACH FEATURE CHANGE SHOULD BE IT'S OWN Pull Request!
|
||||
|
||||
When creating pull requests, it is essential to thoroughly document all changes made. This includes documenting any additions made to the tweaks section and ensuring that corresponding undo measures are in place to remove the newly added tweaks if necessary. Failure to adhere to this format may result in denial of the pull request. Additionally, comprehensive documentation is required for all code changes. Any code lacking sufficient documentation may also be denied.
|
||||
|
||||
|
744
config/applications.json
Executable file → Normal file
744
config/applications.json
Executable file → Normal file
File diff suppressed because it is too large
Load Diff
227
config/ooshutup10_factory.cfg
Normal file
227
config/ooshutup10_factory.cfg
Normal file
@ -0,0 +1,227 @@
|
||||
############################################################################
|
||||
# This file was created with O&O ShutUp10++ V1.9.1436
|
||||
# and can be imported onto another computer.
|
||||
#
|
||||
# Download the application at https://www.oo-software.com/shutup10
|
||||
# You can then import the file from within the program.
|
||||
#
|
||||
# Alternatively you can import it automatically over a command line.
|
||||
# Simply use the following parameter:
|
||||
# OOSU10.exe <path to file>
|
||||
#
|
||||
# Selecting the Option /quiet ends the app right after the import and the
|
||||
# user does not get any feedback about the import.
|
||||
#
|
||||
# We are always happy to answer any questions you may have!
|
||||
# © 2015-2023 O&O Software GmbH, Berlin. All rights reserved.
|
||||
# https://www.oo-software.com/
|
||||
############################################################################
|
||||
|
||||
P001 -
|
||||
P002 -
|
||||
P003 -
|
||||
P004 -
|
||||
P005 -
|
||||
P006 -
|
||||
P008 -
|
||||
P026 -
|
||||
P027 -
|
||||
P028 -
|
||||
P064 -
|
||||
P065 -
|
||||
P066 -
|
||||
P067 -
|
||||
P070 -
|
||||
P069 -
|
||||
P009 -
|
||||
P010 -
|
||||
P015 -
|
||||
P068 -
|
||||
P016 -
|
||||
A001 -
|
||||
A002 -
|
||||
A003 -
|
||||
A004 -
|
||||
A006 -
|
||||
A005 -
|
||||
P007 -
|
||||
P036 -
|
||||
P025 -
|
||||
P033 -
|
||||
P023 -
|
||||
P056 -
|
||||
P057 -
|
||||
P012 -
|
||||
P034 -
|
||||
P013 -
|
||||
P035 -
|
||||
P062 -
|
||||
P063 -
|
||||
P081 -
|
||||
P047 -
|
||||
P019 -
|
||||
P048 -
|
||||
P049 -
|
||||
P020 -
|
||||
P037 -
|
||||
P011 -
|
||||
P038 -
|
||||
P050 -
|
||||
P051 -
|
||||
P018 -
|
||||
P039 -
|
||||
P021 -
|
||||
P040 -
|
||||
P022 -
|
||||
P041 -
|
||||
P014 -
|
||||
P042 -
|
||||
P052 -
|
||||
P053 -
|
||||
P054 -
|
||||
P055 -
|
||||
P029 -
|
||||
P043 -
|
||||
P030 -
|
||||
P044 -
|
||||
P031 -
|
||||
P045 -
|
||||
P032 -
|
||||
P046 -
|
||||
P058 -
|
||||
P059 -
|
||||
P060 -
|
||||
P061 -
|
||||
P071 -
|
||||
P072 -
|
||||
P073 -
|
||||
P074 -
|
||||
P075 -
|
||||
P076 -
|
||||
P077 -
|
||||
P078 -
|
||||
P079 -
|
||||
P080 -
|
||||
P024 -
|
||||
S001 -
|
||||
S002 -
|
||||
S003 -
|
||||
S008 -
|
||||
E101 -
|
||||
E201 -
|
||||
E115 -
|
||||
E215 -
|
||||
E118 -
|
||||
E218 -
|
||||
E107 -
|
||||
E207 -
|
||||
E111 -
|
||||
E211 -
|
||||
E112 -
|
||||
E212 -
|
||||
E109 -
|
||||
E209 -
|
||||
E121 -
|
||||
E221 -
|
||||
E103 -
|
||||
E203 -
|
||||
E123 -
|
||||
E223 -
|
||||
E124 -
|
||||
E224 -
|
||||
E128 -
|
||||
E228 -
|
||||
E119 -
|
||||
E219 -
|
||||
E120 -
|
||||
E220 -
|
||||
E122 -
|
||||
E222 -
|
||||
E125 -
|
||||
E225 -
|
||||
E126 -
|
||||
E226 -
|
||||
E106 -
|
||||
E206 -
|
||||
E127 -
|
||||
E227 -
|
||||
E001 -
|
||||
E002 -
|
||||
E003 -
|
||||
E008 -
|
||||
E007 -
|
||||
E010 -
|
||||
E011 +
|
||||
E012 +
|
||||
E009 -
|
||||
E004 -
|
||||
E005 -
|
||||
E013 -
|
||||
E014 -
|
||||
E006 -
|
||||
Y001 -
|
||||
Y002 -
|
||||
Y003 -
|
||||
Y004 -
|
||||
Y005 -
|
||||
Y006 -
|
||||
Y007 -
|
||||
C012 -
|
||||
C002 -
|
||||
C013 -
|
||||
C007 -
|
||||
C008 -
|
||||
C009 -
|
||||
C010 -
|
||||
C011 -
|
||||
C014 -
|
||||
C015 -
|
||||
C101 -
|
||||
C201 -
|
||||
C102 -
|
||||
L001 -
|
||||
L003 -
|
||||
L004 -
|
||||
L005 -
|
||||
U001 -
|
||||
U004 -
|
||||
U005 -
|
||||
U006 -
|
||||
U007 -
|
||||
W001 -
|
||||
W011 -
|
||||
W004 -
|
||||
W005 -
|
||||
W010 -
|
||||
W009 -
|
||||
P017 -
|
||||
W006 -
|
||||
W008 -
|
||||
M006 -
|
||||
M011 -
|
||||
M010 -
|
||||
O003 -
|
||||
O001 -
|
||||
S012 -
|
||||
S013 -
|
||||
S014 -
|
||||
K001 -
|
||||
K002 -
|
||||
K005 -
|
||||
M003 -
|
||||
M015 -
|
||||
M016 -
|
||||
M017 -
|
||||
M018 -
|
||||
M019 -
|
||||
M020 -
|
||||
M021 -
|
||||
M022 -
|
||||
M001 -
|
||||
M004 -
|
||||
M005 -
|
||||
M024 -
|
||||
M012 -
|
||||
M013 -
|
||||
M014 -
|
||||
N001 -
|
@ -1,222 +1,231 @@
|
||||
############################################################################
|
||||
# This file was created with O&O ShutUp10++ V1.9.1435
|
||||
# and can be imported onto another computer.
|
||||
#
|
||||
# Download the application at https://www.oo-software.com/shutup10
|
||||
# You can then import the file from within the program.
|
||||
#
|
||||
# Alternatively you can import it automatically over a command line.
|
||||
# Simply use the following parameter:
|
||||
# OOSU10.exe <path to file>
|
||||
#
|
||||
# Selecting the Option /quiet ends the app right after the import and the
|
||||
# user does not get any feedback about the import.
|
||||
#
|
||||
# We are always happy to answer any questions you may have!
|
||||
# © 2015-2023 O&O Software GmbH, Berlin. All rights reserved.
|
||||
# https://www.oo-software.com/
|
||||
############################################################################
|
||||
|
||||
P001 +
|
||||
P002 +
|
||||
P003 +
|
||||
P004 +
|
||||
P005 +
|
||||
P006 +
|
||||
P008 +
|
||||
P026 +
|
||||
P027 +
|
||||
P028 +
|
||||
P064 +
|
||||
P065 +
|
||||
P066 +
|
||||
P067 +
|
||||
P070 +
|
||||
P069 +
|
||||
P009 -
|
||||
P010 -
|
||||
P015 +
|
||||
P068 -
|
||||
P016 -
|
||||
A001 +
|
||||
A002 +
|
||||
A003 +
|
||||
A004 -
|
||||
A006 -
|
||||
A005 +
|
||||
P007 +
|
||||
P036 +
|
||||
P025 +
|
||||
P033 +
|
||||
P023 +
|
||||
P056 +
|
||||
P057 -
|
||||
P012 -
|
||||
P034 -
|
||||
P013 -
|
||||
P035 -
|
||||
P062 -
|
||||
P063 -
|
||||
P081 -
|
||||
P047 -
|
||||
P019 -
|
||||
P048 -
|
||||
P049 -
|
||||
P020 -
|
||||
P037 -
|
||||
P011 -
|
||||
P038 -
|
||||
P050 -
|
||||
P051 -
|
||||
P018 -
|
||||
P039 -
|
||||
P021 -
|
||||
P040 -
|
||||
P022 -
|
||||
P041 -
|
||||
P014 -
|
||||
P042 -
|
||||
P052 -
|
||||
P053 -
|
||||
P054 -
|
||||
P055 -
|
||||
P029 -
|
||||
P043 -
|
||||
P030 -
|
||||
P044 -
|
||||
P031 -
|
||||
P045 -
|
||||
P032 -
|
||||
P046 -
|
||||
P058 -
|
||||
P059 -
|
||||
P060 -
|
||||
P061 -
|
||||
P071 -
|
||||
P072 -
|
||||
P073 -
|
||||
P074 -
|
||||
P075 -
|
||||
P076 -
|
||||
P077 -
|
||||
P078 -
|
||||
P079 -
|
||||
P080 -
|
||||
P024 -
|
||||
S001 +
|
||||
S002 +
|
||||
S003 +
|
||||
S008 -
|
||||
E101 +
|
||||
E201 -
|
||||
E115 +
|
||||
E215 -
|
||||
E118 +
|
||||
E218 -
|
||||
E107 +
|
||||
E207 -
|
||||
E111 +
|
||||
E211 -
|
||||
E112 +
|
||||
E212 +
|
||||
E109 +
|
||||
E209 +
|
||||
E121 +
|
||||
E221 -
|
||||
E103 -
|
||||
E203 -
|
||||
E123 -
|
||||
E223 +
|
||||
E124 -
|
||||
E224 -
|
||||
E128 -
|
||||
E228 -
|
||||
E119 -
|
||||
E219 -
|
||||
E120 -
|
||||
E220 -
|
||||
E122 -
|
||||
E222 -
|
||||
E125 -
|
||||
E225 -
|
||||
E126 -
|
||||
E226 -
|
||||
E106 -
|
||||
E206 -
|
||||
E127 -
|
||||
E227 -
|
||||
E001 +
|
||||
E002 +
|
||||
E003 -
|
||||
E008 +
|
||||
E007 +
|
||||
E010 -
|
||||
E011 +
|
||||
E012 +
|
||||
E009 -
|
||||
E004 -
|
||||
E005 -
|
||||
E013 -
|
||||
E014 -
|
||||
E006 -
|
||||
Y001 +
|
||||
Y002 +
|
||||
Y003 +
|
||||
Y004 +
|
||||
Y005 +
|
||||
Y006 +
|
||||
Y007 +
|
||||
C012 +
|
||||
C002 +
|
||||
C013 +
|
||||
C007 +
|
||||
C008 +
|
||||
C009 +
|
||||
C010 +
|
||||
C011 +
|
||||
C014 +
|
||||
L001 +
|
||||
L003 +
|
||||
L004 -
|
||||
L005 -
|
||||
U001 +
|
||||
U004 +
|
||||
U005 +
|
||||
U006 -
|
||||
U007 +
|
||||
W001 +
|
||||
W011 +
|
||||
W004 -
|
||||
W005 -
|
||||
W010 -
|
||||
W009 -
|
||||
P017 +
|
||||
W006 -
|
||||
W008 -
|
||||
M006 +
|
||||
M011 -
|
||||
M010 +
|
||||
O003 -
|
||||
O001 -
|
||||
S012 -
|
||||
S013 -
|
||||
S014 -
|
||||
K001 +
|
||||
K002 +
|
||||
K005 +
|
||||
M022 +
|
||||
M001 +
|
||||
M004 +
|
||||
M005 +
|
||||
M024 -
|
||||
M003 -
|
||||
M012 -
|
||||
M013 -
|
||||
M014 -
|
||||
M015 +
|
||||
M017 +
|
||||
M018 +
|
||||
M019 -
|
||||
M020 +
|
||||
M021 -
|
||||
N001 -
|
||||
############################################################################
|
||||
# This file was created with O&O ShutUp10++ V1.9.1438
|
||||
# and can be imported onto another computer.
|
||||
#
|
||||
# Download the application at https://www.oo-software.com/shutup10
|
||||
# You can then import the file from within the program.
|
||||
#
|
||||
# Alternatively you can import it automatically over a command line.
|
||||
# Simply use the following parameter:
|
||||
# OOSU10.exe <path to file>
|
||||
#
|
||||
# Selecting the Option /quiet ends the app right after the import and the
|
||||
# user does not get any feedback about the import.
|
||||
#
|
||||
# We are always happy to answer any questions you may have!
|
||||
# © 2015-2024 O&O Software GmbH, Berlin. All rights reserved.
|
||||
# https://www.oo-software.com/
|
||||
############################################################################
|
||||
|
||||
P001 +
|
||||
P002 +
|
||||
P003 +
|
||||
P004 +
|
||||
P005 +
|
||||
P006 +
|
||||
P008 +
|
||||
P026 +
|
||||
P027 +
|
||||
P028 +
|
||||
P064 +
|
||||
P065 +
|
||||
P066 +
|
||||
P067 +
|
||||
P070 +
|
||||
P069 +
|
||||
P009 -
|
||||
P010 +
|
||||
P015 +
|
||||
P068 -
|
||||
P016 -
|
||||
A001 +
|
||||
A002 +
|
||||
A003 +
|
||||
A004 +
|
||||
A006 +
|
||||
A005 +
|
||||
P007 +
|
||||
P036 +
|
||||
P025 +
|
||||
P033 +
|
||||
P023 +
|
||||
P056 +
|
||||
P057 -
|
||||
P012 -
|
||||
P034 -
|
||||
P013 -
|
||||
P035 -
|
||||
P062 -
|
||||
P063 -
|
||||
P081 -
|
||||
P047 -
|
||||
P019 -
|
||||
P048 -
|
||||
P049 -
|
||||
P020 -
|
||||
P037 -
|
||||
P011 -
|
||||
P038 -
|
||||
P050 -
|
||||
P051 -
|
||||
P018 -
|
||||
P039 -
|
||||
P021 -
|
||||
P040 -
|
||||
P022 -
|
||||
P041 -
|
||||
P014 -
|
||||
P042 -
|
||||
P052 -
|
||||
P053 -
|
||||
P054 -
|
||||
P055 -
|
||||
P029 -
|
||||
P043 -
|
||||
P030 -
|
||||
P044 -
|
||||
P031 -
|
||||
P045 -
|
||||
P032 -
|
||||
P046 -
|
||||
P058 -
|
||||
P059 -
|
||||
P060 -
|
||||
P061 -
|
||||
P071 -
|
||||
P072 -
|
||||
P073 -
|
||||
P074 -
|
||||
P075 -
|
||||
P076 -
|
||||
P077 -
|
||||
P078 -
|
||||
P079 -
|
||||
P080 -
|
||||
P024 +
|
||||
S001 +
|
||||
S002 +
|
||||
S003 +
|
||||
S008 -
|
||||
E101 +
|
||||
E201 +
|
||||
E115 +
|
||||
E215 +
|
||||
E118 +
|
||||
E218 +
|
||||
E107 +
|
||||
E207 +
|
||||
E111 +
|
||||
E211 +
|
||||
E112 +
|
||||
E212 +
|
||||
E109 +
|
||||
E209 +
|
||||
E121 +
|
||||
E221 +
|
||||
E103 +
|
||||
E203 +
|
||||
E123 +
|
||||
E223 +
|
||||
E124 +
|
||||
E224 +
|
||||
E128 +
|
||||
E228 +
|
||||
E119 -
|
||||
E219 -
|
||||
E120 -
|
||||
E220 -
|
||||
E122 -
|
||||
E222 -
|
||||
E125 -
|
||||
E225 -
|
||||
E126 -
|
||||
E226 -
|
||||
E106 -
|
||||
E206 -
|
||||
E127 -
|
||||
E227 -
|
||||
E001 +
|
||||
E002 +
|
||||
E003 +
|
||||
E008 +
|
||||
E007 +
|
||||
E010 +
|
||||
E011 +
|
||||
E012 +
|
||||
E009 -
|
||||
E004 -
|
||||
E005 -
|
||||
E013 -
|
||||
E014 -
|
||||
E006 -
|
||||
Y001 +
|
||||
Y002 +
|
||||
Y003 +
|
||||
Y004 +
|
||||
Y005 +
|
||||
Y006 +
|
||||
Y007 +
|
||||
C012 +
|
||||
C002 +
|
||||
C013 +
|
||||
C007 +
|
||||
C008 +
|
||||
C009 +
|
||||
C010 +
|
||||
C011 +
|
||||
C014 +
|
||||
C015 +
|
||||
C101 +
|
||||
C201 +
|
||||
C102 +
|
||||
C103 +
|
||||
C203 +
|
||||
L001 +
|
||||
L003 +
|
||||
L004 -
|
||||
L005 -
|
||||
U001 +
|
||||
U004 +
|
||||
U005 +
|
||||
U006 +
|
||||
U007 +
|
||||
W001 +
|
||||
W011 +
|
||||
W004 -
|
||||
W005 -
|
||||
W010 -
|
||||
W009 -
|
||||
P017 +
|
||||
W006 -
|
||||
W008 -
|
||||
M006 +
|
||||
M011 -
|
||||
M010 +
|
||||
O003 -
|
||||
O001 -
|
||||
S012 -
|
||||
S013 -
|
||||
S014 -
|
||||
K001 +
|
||||
K002 +
|
||||
K005 +
|
||||
M003 +
|
||||
M015 +
|
||||
M016 +
|
||||
M017 -
|
||||
M018 +
|
||||
M019 -
|
||||
M020 +
|
||||
M021 +
|
||||
M022 +
|
||||
M001 +
|
||||
M004 +
|
||||
M005 +
|
||||
M024 +
|
||||
M026 +
|
||||
M027 +
|
||||
M012 -
|
||||
M013 -
|
||||
M014 -
|
||||
N001 -
|
@ -1,5 +1,5 @@
|
||||
{
|
||||
"desktop": [
|
||||
"Standard": [
|
||||
"WPFTweaksAH",
|
||||
"WPFTweaksDVR",
|
||||
"WPFTweaksHiber",
|
||||
@ -10,21 +10,13 @@
|
||||
"WPFTweaksStorage",
|
||||
"WPFTweaksTele",
|
||||
"WPFTweaksWifi",
|
||||
"WPFMiscTweaksPower"
|
||||
"WPFTweaksDiskCleanup",
|
||||
"WPFTweaksDeleteTempFiles",
|
||||
"WPFTweaksEndTaskOnTaskbar",
|
||||
"WPFTweaksRestorePoint",
|
||||
"WPFTweaksTeredo"
|
||||
],
|
||||
"laptop": [
|
||||
"WPFTweaksAH",
|
||||
"WPFTweaksDVR",
|
||||
"WPFTweaksHome",
|
||||
"WPFTweaksLoc",
|
||||
"WPFTweaksOO",
|
||||
"WPFTweaksServices",
|
||||
"WPFTweaksStorage",
|
||||
"WPFTweaksTele",
|
||||
"WPFTweaksWifi",
|
||||
"WPFMiscTweaksLapPower"
|
||||
],
|
||||
"minimal": [
|
||||
"Minimal": [
|
||||
"WPFTweaksHome",
|
||||
"WPFTweaksOO",
|
||||
"WPFTweaksServices",
|
||||
|
@ -1,5 +1,5 @@
|
||||
{
|
||||
"Classic": {
|
||||
"Classic": {
|
||||
"ComboBoxBackgroundColor": "#FFFFFF",
|
||||
"LabelboxForegroundColor": "#000000",
|
||||
"MainForegroundColor": "#000000",
|
||||
@ -23,6 +23,7 @@
|
||||
"ButtonBackgroundMouseoverColor": "#C2C2C2",
|
||||
"ButtonBackgroundSelectedColor": "#F0F0F0",
|
||||
"ButtonForegroundColor": "#000000",
|
||||
"ToggleButtonOnColor": "#2e77ff",
|
||||
"ButtonBorderThickness": "1",
|
||||
"ButtonMargin": "1",
|
||||
"ButtonCornerRadius": "2",
|
||||
@ -53,6 +54,7 @@
|
||||
"ButtonBackgroundMouseoverColor": "#A55A64",
|
||||
"ButtonBackgroundSelectedColor": "#FF5733",
|
||||
"ButtonForegroundColor": "#9CCC65",
|
||||
"ToggleButtonOnColor": "#2e77ff",
|
||||
"ButtonBorderThickness": "1",
|
||||
"ButtonMargin": "1",
|
||||
"ButtonCornerRadius": "2",
|
||||
@ -60,5 +62,36 @@
|
||||
"BorderColor": "#FFAC1C",
|
||||
"BorderOpacity": "0.8",
|
||||
"ShadowPulse": "0:0:3"
|
||||
},
|
||||
"Dark": {
|
||||
"ComboBoxBackgroundColor": "#000000",
|
||||
"LabelboxForegroundColor": "#FFEE58",
|
||||
"MainForegroundColor": "#9CCC65",
|
||||
"MainBackgroundColor": "#000000",
|
||||
"LabelBackgroundColor": "#000000",
|
||||
"LinkForegroundColor": "#add8e6",
|
||||
"LinkHoverForegroundColor": "#FFFFFF",
|
||||
"ComboBoxForegroundColor": "#FFEE58",
|
||||
"ButtonInstallBackgroundColor": "#222222",
|
||||
"ButtonTweaksBackgroundColor": "#333333",
|
||||
"ButtonConfigBackgroundColor": "#444444",
|
||||
"ButtonUpdatesBackgroundColor": "#555555",
|
||||
"ButtonInstallForegroundColor": "#FFFFFF",
|
||||
"ButtonTweaksForegroundColor": "#FFFFFF",
|
||||
"ButtonConfigForegroundColor": "#FFFFFF",
|
||||
"ButtonUpdatesForegroundColor": "#FFFFFF",
|
||||
"ButtonBackgroundColor": "#000019",
|
||||
"ButtonBackgroundPressedColor": "#9CCC65",
|
||||
"ButtonBackgroundMouseoverColor": "#FF5733",
|
||||
"ButtonBackgroundSelectedColor": "#FF5733",
|
||||
"ButtonForegroundColor": "#9CCC65",
|
||||
"ToggleButtonOnColor": "#2e77ff",
|
||||
"ButtonBorderThickness": "1",
|
||||
"ButtonMargin": "1",
|
||||
"ButtonCornerRadius": "2",
|
||||
"ToggleButtonHeight": "25",
|
||||
"BorderColor": "#FFAC1C",
|
||||
"BorderOpacity": "0.2",
|
||||
"ShadowPulse": "Forever"
|
||||
}
|
||||
}
|
||||
}
|
@ -34,7 +34,7 @@
|
||||
"Description": "Hibernation is really meant for laptops as it saves what's in memory before turning the pc off. It really should never be used, but some people are lazy and rely on it. Don't be like Bob. Bob likes hibernation.",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"Order": "a011_",
|
||||
"Order": "a005_",
|
||||
"registry": [
|
||||
{
|
||||
"Path": "HKLM:\\System\\CurrentControlSet\\Control\\Session Manager\\Power",
|
||||
@ -53,14 +53,64 @@
|
||||
],
|
||||
"InvokeScript": [
|
||||
"powercfg.exe /hibernate off"
|
||||
],
|
||||
"UndoScript": [
|
||||
"powercfg.exe /hibernate on"
|
||||
]
|
||||
},
|
||||
"WPFToggleTweaksLaptopHybernation": {
|
||||
"Content": "Set Hibernation as default (good for laptops)",
|
||||
"Description": "Most modern laptops have connected stadby enabled which drains the battery, this sets hibernation as default which will not drain the battery. See issue https://github.com/ChrisTitusTech/winutil/issues/1399",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"Order": "a014_",
|
||||
"registry": [
|
||||
{
|
||||
"Path": "HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Power\\PowerSettings\\238C9FA8-0AAD-41ED-83F4-97BE242C8F20\\7bc4a2f9-d8fc-4469-b07b-33eb785aaca0",
|
||||
"OriginalValue": "1",
|
||||
"Name": "Attributes",
|
||||
"Value": "2",
|
||||
"Type": "DWord"
|
||||
},
|
||||
{
|
||||
"Path": "HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Power\\PowerSettings\\abfc2519-3608-4c2a-94ea-171b0ed546ab\\94ac6d29-73ce-41a6-809f-6363ba21b47e",
|
||||
"OriginalValue": "0",
|
||||
"Name": "Attributes ",
|
||||
"Value": "2",
|
||||
"Type": "DWord"
|
||||
}
|
||||
],
|
||||
"InvokeScript": [
|
||||
"
|
||||
Write-Host \"Turn on Hibernation\"
|
||||
Start-Process -FilePath powercfg -ArgumentList \"/hibernate on\" -NoNewWindow -Wait
|
||||
|
||||
# Set hibernation as the default action
|
||||
Start-Process -FilePath powercfg -ArgumentList \"/change standby-timeout-ac 60\" -NoNewWindow -Wait
|
||||
Start-Process -FilePath powercfg -ArgumentList \"/change standby-timeout-dc 60\" -NoNewWindow -Wait
|
||||
Start-Process -FilePath powercfg -ArgumentList \"/change monitor-timeout-ac 10\" -NoNewWindow -Wait
|
||||
Start-Process -FilePath powercfg -ArgumentList \"/change monitor-timeout-dc 1\" -NoNewWindow -Wait
|
||||
"
|
||||
],
|
||||
"UndoScript": [
|
||||
"
|
||||
Write-Host \"Turn off Hibernation\"
|
||||
Start-Process -FilePath powercfg -ArgumentList \"/hibernate off\" -NoNewWindow -Wait
|
||||
|
||||
# Set standby to detault values
|
||||
Start-Process -FilePath powercfg -ArgumentList \"/change standby-timeout-ac 15\" -NoNewWindow -Wait
|
||||
Start-Process -FilePath powercfg -ArgumentList \"/change standby-timeout-dc 15\" -NoNewWindow -Wait
|
||||
Start-Process -FilePath powercfg -ArgumentList \"/change monitor-timeout-ac 15\" -NoNewWindow -Wait
|
||||
Start-Process -FilePath powercfg -ArgumentList \"/change monitor-timeout-dc 15\" -NoNewWindow -Wait
|
||||
"
|
||||
]
|
||||
},
|
||||
"WPFTweaksHome": {
|
||||
"Content": "Disable Homegroup",
|
||||
"Description": "Disables HomeGroup - HomeGroup is a password-protected home networking service that lets you share your stuff with other PCs that are currently running and connected to your network.",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"Order": "a009_",
|
||||
"Order": "a005_",
|
||||
"service": [
|
||||
{
|
||||
"Name": "HomeGroupListener",
|
||||
@ -79,7 +129,7 @@
|
||||
"Description": "Disables Location Tracking...DUH!",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"Order": "a008_",
|
||||
"Order": "a005_",
|
||||
"registry": [
|
||||
{
|
||||
"Path": "HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\CapabilityAccessManager\\ConsentStore\\location",
|
||||
@ -1870,25 +1920,11 @@
|
||||
"Type": "DWord"
|
||||
},
|
||||
{
|
||||
"Path": "HKLM:\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Multimedia\\SystemProfile\\Tasks\\Games",
|
||||
"Path": "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\UserProfileEngagement",
|
||||
"OriginalValue": "1",
|
||||
"Name": "GPU Priority",
|
||||
"Value": "8",
|
||||
"Name": "ScoobeSystemSettingEnabled",
|
||||
"Value": "0",
|
||||
"Type": "DWord"
|
||||
},
|
||||
{
|
||||
"Path": "HKLM:\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Multimedia\\SystemProfile\\Tasks\\Games",
|
||||
"OriginalValue": "1",
|
||||
"Name": "Priority",
|
||||
"Value": "6",
|
||||
"Type": "DWord"
|
||||
},
|
||||
{
|
||||
"Path": "HKLM:\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Multimedia\\SystemProfile\\Tasks\\Games",
|
||||
"OriginalValue": "High",
|
||||
"Name": "Scheduling Category",
|
||||
"Value": "High",
|
||||
"Type": "String"
|
||||
}
|
||||
],
|
||||
"InvokeScript": [
|
||||
@ -1932,7 +1968,7 @@
|
||||
"Description": "Wifi Sense is a spying service that phones home all nearby scanned wifi networks and your current geo location.",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"Order": "a004_",
|
||||
"Order": "a005_",
|
||||
"registry": [
|
||||
{
|
||||
"Path": "HKLM:\\Software\\Microsoft\\PolicyManager\\default\\WiFi\\AllowWiFiHotSpotReporting",
|
||||
@ -1955,7 +1991,7 @@
|
||||
"Description": "Essential for computers that are dual booting. Fixes the time sync with Linux Systems.",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"Order": "a022_",
|
||||
"Order": "a027_",
|
||||
"registry": [
|
||||
{
|
||||
"Path": "HKLM:\\SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation",
|
||||
@ -1971,7 +2007,7 @@
|
||||
"Description": "Sets the system preferences to performance. You can do this manually with sysdm.cpl as well.",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"Order": "a021_",
|
||||
"Order": "a027_",
|
||||
"registry": [
|
||||
{
|
||||
"Path": "HKCU:\\Control Panel\\Desktop",
|
||||
@ -2077,7 +2113,7 @@
|
||||
"Description": "USE WITH CAUTION!!!!! This will remove ALL Microsoft store apps other than the essentials to make winget work. Games installed by MS Store ARE INCLUDED!",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"Order": "a025_",
|
||||
"Order": "a028_",
|
||||
"appx": [
|
||||
"Microsoft.Microsoft3DViewer",
|
||||
"Microsoft.AppConnector",
|
||||
@ -2196,7 +2232,7 @@
|
||||
"Description": "Creates a restore point at runtime in case a revert is needed from WinUtil modifications",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"Checked": "True",
|
||||
"Checked": "False",
|
||||
"Order": "a001_",
|
||||
"InvokeScript": [
|
||||
"
|
||||
@ -2221,8 +2257,21 @@
|
||||
Set-ItemProperty -Path \"HKLM:\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SystemRestore\" -Name \"SystemRestorePointCreationFrequency\" -Value \"0\" -Type DWord -Force -ErrorAction Stop | Out-Null
|
||||
}
|
||||
|
||||
# Attempt to load the required module for Get-ComputerRestorePoint
|
||||
try {
|
||||
Import-Module Microsoft.PowerShell.Management -ErrorAction Stop
|
||||
} catch {
|
||||
Write-Host \"Failed to load the Microsoft.PowerShell.Management module: $_\"
|
||||
return
|
||||
}
|
||||
|
||||
# Get all the restore points for the current day
|
||||
$existingRestorePoints = Get-ComputerRestorePoint | Where-Object { $_.CreationTime.Date -eq (Get-Date).Date }
|
||||
try {
|
||||
$existingRestorePoints = Get-ComputerRestorePoint | Where-Object { $_.CreationTime.Date -eq (Get-Date).Date }
|
||||
} catch {
|
||||
Write-Host \"Failed to retrieve restore points: $_\"
|
||||
return
|
||||
}
|
||||
|
||||
# Check if there is already a restore point created today
|
||||
if ($existingRestorePoints.Count -eq 0) {
|
||||
@ -2234,19 +2283,48 @@
|
||||
"
|
||||
]
|
||||
},
|
||||
"WPFTweaksOO": {
|
||||
"Content": "Run OO Shutup",
|
||||
"Description": "Runs OO Shutup from https://www.oo-software.com/en/shutup10",
|
||||
"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_",
|
||||
"Content": "Run OO Shutup",
|
||||
"ToolTip": "Runs OO Shutup from https://www.oo-software.com/en/shutup10",
|
||||
"Order": "a006_",
|
||||
"InvokeScript": [
|
||||
"curl.exe -s \"https://raw.githubusercontent.com/ChrisTitusTech/winutil/main/ooshutup10_winutil_settings.cfg\" -o $ENV:temp\\ooshutup10.cfg
|
||||
curl.exe -s \"https://dl5.oo-software.com/files/ooshutup10/OOSU10.exe\" -o $ENV:temp\\OOSU10.exe
|
||||
Start-Process $ENV:temp\\OOSU10.exe -ArgumentList \"\"\"$ENV:temp\\ooshutup10.cfg\"\" /quiet\"
|
||||
"
|
||||
"
|
||||
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\"
|
||||
"
|
||||
]
|
||||
},
|
||||
"WPFTweaksPowershell7": {
|
||||
"Content": "Replace Default Powershell 5 to Powershell 7",
|
||||
"Description": "This will edit the config file of the Windows Terminal Replacing the Powershell 5 to Powershell 7 and install Powershell 7 if necessary",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"Order": "a009_",
|
||||
"InvokeScript": [
|
||||
"Invoke-WPFTweakPS7 -action \"PS7\""
|
||||
],
|
||||
"UndoScript": [
|
||||
"Invoke-WPFTweakPS7 -action \"PS5\""
|
||||
]
|
||||
},
|
||||
"WPFTweaksOO": {
|
||||
"Content": "Run OO Shutup",
|
||||
"Description": "Runs OO Shutup and applies the recommended Tweaks. https://www.oo-software.com/en/shutup10",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"Order": "a009_",
|
||||
"ToolTip": "Runs OO Shutup and applies the recommended Tweaks https://www.oo-software.com/en/shutup10",
|
||||
"InvokeScript": [
|
||||
"Invoke-WPFOOSU -action \"recommended\""
|
||||
],
|
||||
"UndoScript": [
|
||||
"Invoke-WPFOOSU -action \"undo\""
|
||||
]
|
||||
},
|
||||
"WPFTweaksStorage": {
|
||||
@ -2254,13 +2332,12 @@
|
||||
"Description": "Storage Sense deletes temp files automatically.",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"Order": "a010_",
|
||||
"Order": "a005_",
|
||||
"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": {
|
||||
@ -2268,7 +2345,7 @@
|
||||
"Description": "Removes MS Edge when it gets reinstalled by updates.",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"Order": "a026_",
|
||||
"Order": "a029_",
|
||||
"InvokeScript": [
|
||||
"
|
||||
#:: Standalone script by AveYo Source: https://raw.githubusercontent.com/AveYo/fox/main/Edge_Removal.bat
|
||||
@ -2285,12 +2362,113 @@
|
||||
"
|
||||
]
|
||||
},
|
||||
"WPFTweaksRemoveCopilot": {
|
||||
"Content": "Disable Microsoft Copilot",
|
||||
"Description": "Disables MS Copilot AI built into Windows since 23H2.",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"Order": "a025_",
|
||||
"registry": [
|
||||
{
|
||||
|
||||
"Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsCopilot",
|
||||
"Name": "TurnOffWindowsCopilot",
|
||||
"Type": "DWord",
|
||||
"Value": "1",
|
||||
"OriginalValue": "0"
|
||||
},
|
||||
{
|
||||
"Path": "HKCU:\\Software\\Policies\\Microsoft\\Windows\\WindowsCopilot",
|
||||
"Name": "TurnOffWindowsCopilot",
|
||||
"Type": "DWord",
|
||||
"Value": "1",
|
||||
"OriginalValue": "0"
|
||||
},
|
||||
{
|
||||
"Path": "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
|
||||
"Name": "ShowCopilotButton",
|
||||
"Type": "DWord",
|
||||
"Value": "0",
|
||||
"OriginalValue": "1"
|
||||
}
|
||||
],
|
||||
"InvokeScript": [
|
||||
"
|
||||
Write-Host \"Remove Copilot\"
|
||||
dism /online /remove-package /package-name:Microsoft.Windows.Copilot
|
||||
"
|
||||
],
|
||||
"UndoScript": [
|
||||
"
|
||||
Write-Host \"Install Copilot\"
|
||||
dism /online /add-package /package-name:Microsoft.Windows.Copilot
|
||||
"
|
||||
]
|
||||
},
|
||||
"WPFTweaksDisableLMS1": {
|
||||
"Content": "Disable Intel MM (vPro LMS)",
|
||||
"Description": "Intel LMS service is always listening on all ports and could be a huge security risk. There is no need to run LMS on home machines and even in the Enterprise there are better solutions.",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"Order": "a0015_",
|
||||
"InvokeScript": [
|
||||
"
|
||||
Write-Host \"Kill OneDrive process\"
|
||||
$serviceName = \"LMS\"
|
||||
Write-Host \"Stopping and disabling service: $serviceName\"
|
||||
Stop-Service -Name $serviceName -Force -ErrorAction SilentlyContinue;
|
||||
Set-Service -Name $serviceName -StartupType Disabled -ErrorAction SilentlyContinue;
|
||||
|
||||
Write-Host \"Removing service: $serviceName\";
|
||||
sc.exe delete $serviceName;
|
||||
|
||||
Write-Host \"Removing LMS driver packages\";
|
||||
$lmsDriverPackages = Get-ChildItem -Path \"C:\\Windows\\System32\\DriverStore\\FileRepository\" -Recurse -Filter \"lms.inf*\";
|
||||
foreach ($package in $lmsDriverPackages) {
|
||||
Write-Host \"Removing driver package: $($package.Name)\";
|
||||
pnputil /delete-driver $($package.Name) /uninstall /force;
|
||||
}
|
||||
if ($lmsDriverPackages.Count -eq 0) {
|
||||
Write-Host \"No LMS driver packages found in the driver store.\";
|
||||
} else {
|
||||
Write-Host \"All found LMS driver packages have been removed.\";
|
||||
}
|
||||
|
||||
Write-Host \"Searching and deleting LMS executable files\";
|
||||
$programFilesDirs = @(\"C:\\Program Files\", \"C:\\Program Files (x86)\");
|
||||
$lmsFiles = @();
|
||||
foreach ($dir in $programFilesDirs) {
|
||||
$lmsFiles += Get-ChildItem -Path $dir -Recurse -Filter \"LMS.exe\" -ErrorAction SilentlyContinue;
|
||||
}
|
||||
foreach ($file in $lmsFiles) {
|
||||
Write-Host \"Taking ownership of file: $($file.FullName)\";
|
||||
& icacls $($file.FullName) /grant Administrators:F /T /C /Q;
|
||||
& takeown /F $($file.FullName) /A /R /D Y;
|
||||
Write-Host \"Deleting file: $($file.FullName)\";
|
||||
Remove-Item $($file.FullName) -Force -ErrorAction SilentlyContinue;
|
||||
}
|
||||
if ($lmsFiles.Count -eq 0) {
|
||||
Write-Host \"No LMS.exe files found in Program Files directories.\";
|
||||
} else {
|
||||
Write-Host \"All found LMS.exe files have been deleted.\";
|
||||
}
|
||||
Write-Host 'Intel LMS vPro service has been disabled, removed, and blocked.';
|
||||
"
|
||||
],
|
||||
"UndoScript": [
|
||||
"
|
||||
Write-Host \"Install Microsoft Edge\"
|
||||
taskkill.exe /F /IM \"OneDrive.exe\"
|
||||
|
||||
"
|
||||
]
|
||||
},
|
||||
"WPFTweaksRemoveOnedrive": {
|
||||
"Content": "Remove OneDrive",
|
||||
"Description": "Copies OneDrive files to Default Home Folders and Uninstalls it.",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"Order": "a027_",
|
||||
"Order": "a030_",
|
||||
"InvokeScript": [
|
||||
"
|
||||
|
||||
@ -2299,13 +2477,14 @@
|
||||
taskkill.exe /F /IM \"explorer.exe\"
|
||||
|
||||
Write-Host \"Copy all OneDrive to Root UserProfile\"
|
||||
Start-Process -FilePath robocopy -ArgumentList \"$env:USERPROFILE\\OneDrive $env:USERPROFILE /e /xj\" -NoNewWindow -Wait
|
||||
Start-Process -FilePath powershell -ArgumentList \"robocopy '$($env:USERPROFILE.TrimEnd())\\OneDrive' '$($env:USERPROFILE.TrimEnd())\\' /e /xj\" -NoNewWindow -Wait
|
||||
|
||||
Write-Host \"Remove OneDrive\"
|
||||
Start-Process -FilePath winget -ArgumentList \"uninstall -e --purge --force --silent Microsoft.OneDrive \" -NoNewWindow -Wait
|
||||
|
||||
Write-Host \"Removing OneDrive leftovers\"
|
||||
Remove-Item -Recurse -Force -ErrorAction SilentlyContinue \"$env:localappdata\\Microsoft\\OneDrive\"
|
||||
Remove-Item -Recurse -Force -ErrorAction SilentlyContinue \"$env:localappdata\\OneDrive\"
|
||||
Remove-Item -Recurse -Force -ErrorAction SilentlyContinue \"$env:programdata\\Microsoft OneDrive\"
|
||||
Remove-Item -Recurse -Force -ErrorAction SilentlyContinue \"$env:systemdrive\\OneDriveTemp\"
|
||||
# check if directory is empty before removing:
|
||||
@ -2372,7 +2551,7 @@
|
||||
"Description": "Disables all Notifications INCLUDING Calendar",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"Order": "a024_",
|
||||
"Order": "a026_",
|
||||
"registry": [
|
||||
{
|
||||
"Path": "HKCU:\\Software\\Policies\\Microsoft\\Windows\\Explorer",
|
||||
@ -2390,19 +2569,288 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"WPFTweaksDebloatAdobe": {
|
||||
"Content": "Adobe Debloat",
|
||||
"Description": "Manages Adobe Services, Adobe Desktop Service, and Acrobat Updates",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"Order": "a021_",
|
||||
"InvokeScript": [
|
||||
"
|
||||
function CCStopper {
|
||||
$path = \"C:\\Program Files (x86)\\Common Files\\Adobe\\Adobe Desktop Common\\ADS\\Adobe Desktop Service.exe\"
|
||||
|
||||
# Test if the path exists before proceeding
|
||||
if (Test-Path $path) {
|
||||
Takeown /f $path
|
||||
$acl = Get-Acl $path
|
||||
$acl.SetOwner([System.Security.Principal.NTAccount]\"Administrators\")
|
||||
$acl | Set-Acl $path
|
||||
|
||||
Rename-Item -Path $path -NewName \"Adobe Desktop Service.exe.old\" -Force
|
||||
} else {
|
||||
Write-Host \"Adobe Desktop Service is not in the default location.\"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function AcrobatUpdates {
|
||||
# Editing Acrobat Updates. The last folder before the key is dynamic, therefore using a script.
|
||||
# Possible Values for the edited key:
|
||||
# 0 = Do not download or install updates automatically
|
||||
# 2 = Automatically download updates but let the user choose when to install them
|
||||
# 3 = Automatically download and install updates (default value)
|
||||
# 4 = Notify the user when an update is available but don't download or install it automatically
|
||||
# = It notifies the user using Windows Notifications. It runs on startup without having to have a Service/Acrobat/Reader running, therefore 0 is the next best thing.
|
||||
|
||||
$rootPath = \"HKLM:\\SOFTWARE\\WOW6432Node\\Adobe\\Adobe ARM\\Legacy\\Acrobat\"
|
||||
|
||||
# Get all subkeys under the specified root path
|
||||
$subKeys = Get-ChildItem -Path $rootPath | Where-Object { $_.PSChildName -like \"{*}\" }
|
||||
|
||||
# Loop through each subkey
|
||||
foreach ($subKey in $subKeys) {
|
||||
# Get the full registry path
|
||||
$fullPath = Join-Path -Path $rootPath -ChildPath $subKey.PSChildName
|
||||
try {
|
||||
Set-ItemProperty -Path $fullPath -Name Mode -Value 0
|
||||
Write-Host \"Acrobat Updates have been disabled.\"
|
||||
} catch {
|
||||
Write-Host \"Registry Key for changing Acrobat Updates does not exist in $fullPath\"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CCStopper
|
||||
AcrobatUpdates
|
||||
"
|
||||
],
|
||||
"UndoScript": [
|
||||
"
|
||||
function RestoreCCService {
|
||||
$originalPath = \"C:\\Program Files (x86)\\Common Files\\Adobe\\Adobe Desktop Common\\ADS\\Adobe Desktop Service.exe.old\"
|
||||
$newPath = \"C:\\Program Files (x86)\\Common Files\\Adobe\\Adobe Desktop Common\\ADS\\Adobe Desktop Service.exe\"
|
||||
|
||||
if (Test-Path -Path $originalPath) {
|
||||
Rename-Item -Path $originalPath -NewName \"Adobe Desktop Service.exe\" -Force
|
||||
Write-Host \"Adobe Desktop Service has been restored.\"
|
||||
} else {
|
||||
Write-Host \"Backup file does not exist. No changes were made.\"
|
||||
}
|
||||
}
|
||||
|
||||
function AcrobatUpdates {
|
||||
# Default Value:
|
||||
# 3 = Automatically download and install updates
|
||||
|
||||
$rootPath = \"HKLM:\\SOFTWARE\\WOW6432Node\\Adobe\\Adobe ARM\\Legacy\\Acrobat\"
|
||||
|
||||
# Get all subkeys under the specified root path
|
||||
$subKeys = Get-ChildItem -Path $rootPath | Where-Object { $_.PSChildName -like \"{*}\" }
|
||||
|
||||
# Loop through each subkey
|
||||
foreach ($subKey in $subKeys) {
|
||||
# Get the full registry path
|
||||
$fullPath = Join-Path -Path $rootPath -ChildPath $subKey.PSChildName
|
||||
try {
|
||||
Set-ItemProperty -Path $fullPath -Name Mode -Value 3
|
||||
} catch {
|
||||
Write-Host \"Registry Key for changing Acrobat Updates does not exist in $fullPath\"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RestoreCCService
|
||||
AcrobatUpdates
|
||||
"
|
||||
],
|
||||
"service": [
|
||||
{
|
||||
"Name": "AGSService",
|
||||
"StartupType": "Disabled",
|
||||
"OriginalType": "Automatic"
|
||||
},
|
||||
{
|
||||
"Name": "AGMService",
|
||||
"StartupType": "Disabled",
|
||||
"OriginalType": "Automatic"
|
||||
},
|
||||
{
|
||||
"Name": "AdobeUpdateService",
|
||||
"StartupType": "Manual",
|
||||
"OriginalType": "Automatic"
|
||||
},
|
||||
{
|
||||
"Name": "Adobe Acrobat Update",
|
||||
"StartupType": "Manual",
|
||||
"OriginalType": "Automatic"
|
||||
},
|
||||
{
|
||||
"Name": "Adobe Genuine Monitor Service",
|
||||
"StartupType": "Disabled",
|
||||
"OriginalType": "Automatic"
|
||||
},
|
||||
{
|
||||
"Name": "AdobeARMservice",
|
||||
"StartupType": "Manual",
|
||||
"OriginalType": "Automatic"
|
||||
},
|
||||
{
|
||||
"Name": "Adobe Licensing Console",
|
||||
"StartupType": "Manual",
|
||||
"OriginalType": "Automatic"
|
||||
},
|
||||
{
|
||||
"Name": "CCXProcess",
|
||||
"StartupType": "Manual",
|
||||
"OriginalType": "Automatic"
|
||||
},
|
||||
{
|
||||
"Name": "AdobeIPCBroker",
|
||||
"StartupType": "Manual",
|
||||
"OriginalType": "Automatic"
|
||||
},
|
||||
{
|
||||
"Name": "CoreSync",
|
||||
"StartupType": "Manual",
|
||||
"OriginalType": "Automatic"
|
||||
}
|
||||
]
|
||||
},
|
||||
"WPFTweaksBlockAdobeNet": {
|
||||
"Content": "Adobe Network Block",
|
||||
"Description": "Reduce user interruptions by selectively blocking connections to Adobe's activation and telemetry servers. ",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"Order": "a021_",
|
||||
"InvokeScript": [
|
||||
"
|
||||
# Define the URL of the remote HOSTS file and the local paths
|
||||
$remoteHostsUrl = \"https://raw.githubusercontent.com/Ruddernation-Designs/Adobe-URL-Block-List/master/hosts\"
|
||||
$localHostsPath = \"C:\\Windows\\System32\\drivers\\etc\\hosts\"
|
||||
$tempHostsPath = \"C:\\Windows\\System32\\drivers\\etc\\temp_hosts\"
|
||||
|
||||
# Download the remote HOSTS file to a temporary location
|
||||
try {
|
||||
Invoke-WebRequest -Uri $remoteHostsUrl -OutFile $tempHostsPath
|
||||
Write-Output \"Downloaded the remote HOSTS file to a temporary location.\"
|
||||
}
|
||||
catch {
|
||||
Write-Error \"Failed to download the HOSTS file. Error: $_\"
|
||||
}
|
||||
|
||||
# Check if the AdobeNetBlock has already been started
|
||||
try {
|
||||
$localHostsContent = Get-Content $localHostsPath -ErrorAction Stop
|
||||
|
||||
# Check if AdobeNetBlock markers exist
|
||||
$blockStartExists = $localHostsContent -like \"*#AdobeNetBlock-start*\"
|
||||
if ($blockStartExists) {
|
||||
Write-Output \"AdobeNetBlock-start already exists. Skipping addition of new block.\"
|
||||
} else {
|
||||
# Load the new block from the downloaded file
|
||||
$newBlockContent = Get-Content $tempHostsPath -ErrorAction Stop
|
||||
$newBlockContent = $newBlockContent | Where-Object { $_ -notmatch \"^\\s*#\" -and $_ -ne \"\" } # Exclude empty lines and comments
|
||||
$newBlockHeader = \"#AdobeNetBlock-start\"
|
||||
$newBlockFooter = \"#AdobeNetBlock-end\"
|
||||
|
||||
# Combine the contents, ensuring new block is properly formatted
|
||||
$combinedContent = $localHostsContent + $newBlockHeader, $newBlockContent, $newBlockFooter | Out-String
|
||||
|
||||
# Write the combined content back to the original HOSTS file
|
||||
$combinedContent | Set-Content $localHostsPath -Encoding ASCII
|
||||
Write-Output \"Successfully added the AdobeNetBlock.\"
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-Error \"Error during processing: $_\"
|
||||
}
|
||||
|
||||
# Clean up temporary file
|
||||
Remove-Item $tempHostsPath -ErrorAction Ignore
|
||||
|
||||
# Flush the DNS resolver cache
|
||||
try {
|
||||
Invoke-Expression \"ipconfig /flushdns\"
|
||||
Write-Output \"DNS cache flushed successfully.\"
|
||||
}
|
||||
catch {
|
||||
Write-Error \"Failed to flush DNS cache. Error: $_\"
|
||||
}
|
||||
"
|
||||
],
|
||||
"UndoScript": [
|
||||
"
|
||||
# Define the local path of the HOSTS file
|
||||
$localHostsPath = \"C:\\Windows\\System32\\drivers\\etc\\hosts\"
|
||||
|
||||
# Load the content of the HOSTS file
|
||||
try {
|
||||
$hostsContent = Get-Content $localHostsPath -ErrorAction Stop
|
||||
}
|
||||
catch {
|
||||
Write-Error \"Failed to load the HOSTS file. Error: $_\"
|
||||
return
|
||||
}
|
||||
|
||||
# Initialize flags and buffer for new content
|
||||
$recording = $true
|
||||
$newContent = @()
|
||||
|
||||
# Iterate over each line of the HOSTS file
|
||||
foreach ($line in $hostsContent) {
|
||||
if ($line -match \"#AdobeNetBlock-start\") {
|
||||
$recording = $false
|
||||
}
|
||||
if ($recording) {
|
||||
$newContent += $line
|
||||
}
|
||||
if ($line -match \"#AdobeNetBlock-end\") {
|
||||
$recording = $true
|
||||
}
|
||||
}
|
||||
|
||||
# Write the filtered content back to the HOSTS file
|
||||
try {
|
||||
$newContent | Set-Content $localHostsPath -Encoding ASCII
|
||||
Write-Output \"Successfully removed the AdobeNetBlock section from the HOSTS file.\"
|
||||
}
|
||||
catch {
|
||||
Write-Error \"Failed to write back to the HOSTS file. Error: $_\"
|
||||
}
|
||||
|
||||
# Flush the DNS resolver cache
|
||||
try {
|
||||
Invoke-Expression \"ipconfig /flushdns\"
|
||||
Write-Output \"DNS cache flushed successfully.\"
|
||||
}
|
||||
catch {
|
||||
Write-Error \"Failed to flush DNS cache. Error: $_\"
|
||||
}
|
||||
"
|
||||
]
|
||||
},
|
||||
"WPFTweaksRightClickMenu": {
|
||||
"Content": "Set Classic Right-Click Menu ",
|
||||
"Description": "Great Windows 11 tweak to bring back good context menus when right clicking things in explorer.",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"Order": "a028_",
|
||||
"Order": "a027_",
|
||||
"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
|
||||
"
|
||||
]
|
||||
},
|
||||
@ -2411,7 +2859,7 @@
|
||||
"Description": "Runs Disk Cleanup on Drive C: and removes old Windows Updates.",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"Order": "a007_",
|
||||
"Order": "a009_",
|
||||
"InvokeScript": [
|
||||
"
|
||||
cleanmgr.exe /d C: /VERYLOWDISK
|
||||
@ -2419,28 +2867,12 @@
|
||||
"
|
||||
]
|
||||
},
|
||||
"WPFTweaksDisableUAC": {
|
||||
"Content": "Disable UAC",
|
||||
"Description": "Disables User Account Control. Only recommended for Expert Users.",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"Order": "a023_",
|
||||
"registry": [
|
||||
{
|
||||
"Path": "HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System",
|
||||
"OriginalValue": "5",
|
||||
"Name": "ConsentPromptBehaviorAdmin",
|
||||
"Value": "0",
|
||||
"Type": "DWord"
|
||||
}
|
||||
]
|
||||
},
|
||||
"WPFTweaksDeleteTempFiles": {
|
||||
"Content": "Delete Temporary Files",
|
||||
"Description": "Erases TEMP Folders",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"Order": "a006_",
|
||||
"Order": "a002_",
|
||||
"InvokeScript": [
|
||||
"Get-ChildItem -Path \"C:\\Windows\\Temp\" *.* -Recurse | Remove-Item -Force -Recurse
|
||||
Get-ChildItem -Path $env:TEMP *.* -Recurse | Remove-Item -Force -Recurse"
|
||||
@ -2451,7 +2883,7 @@
|
||||
"Description": "GameDVR is a Windows App that is a dependency for some Store Games. I've never met someone that likes it, but it's there for the XBOX crowd.",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"Order": "a012_",
|
||||
"Order": "a005_",
|
||||
"registry": [
|
||||
{
|
||||
"Path": "HKCU:\\System\\GameConfigStore",
|
||||
@ -2467,13 +2899,6 @@
|
||||
"OriginalValue": "1",
|
||||
"Type": "DWord"
|
||||
},
|
||||
{
|
||||
"Path": "HKCU:\\System\\GameConfigStore",
|
||||
"Name": "GameDVR_DXGIHonorFSEWindowsCompatible",
|
||||
"Value": "1",
|
||||
"OriginalValue": "0",
|
||||
"Type": "DWord"
|
||||
},
|
||||
{
|
||||
"Path": "HKCU:\\System\\GameConfigStore",
|
||||
"Name": "GameDVR_HonorUserFSEBehaviorMode",
|
||||
@ -2502,8 +2927,7 @@
|
||||
"Description": "Teredo network tunneling is a ipv6 feature that can cause additional latency.",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"Order": "a029_",
|
||||
"Order": "a013_",
|
||||
"Order": "a005_",
|
||||
"registry": [
|
||||
{
|
||||
"Path": "HKLM:\\SYSTEM\\CurrentControlSet\\Services\\Tcpip6\\Parameters",
|
||||
@ -2525,7 +2949,16 @@
|
||||
"Description": "Disables IPv6.",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"Order": "a031_",
|
||||
"Order": "a023_",
|
||||
"registry": [
|
||||
{
|
||||
"Path": "HKLM:\\SYSTEM\\CurrentControlSet\\Services\\Tcpip6\\Parameters",
|
||||
"Name": "DisabledComponents",
|
||||
"Value": "255",
|
||||
"OriginalValue": "0",
|
||||
"Type": "DWord"
|
||||
}
|
||||
],
|
||||
"InvokeScript": [
|
||||
"Disable-NetAdapterBinding -Name \"*\" -ComponentID ms_tcpip6"
|
||||
],
|
||||
@ -2533,12 +2966,37 @@
|
||||
"Enable-NetAdapterBinding -Name \"*\" -ComponentID ms_tcpip6"
|
||||
]
|
||||
},
|
||||
"WPFTweaksDisableFSO": {
|
||||
"Content": "Disable Fullscreen Optimizations",
|
||||
"Description": "Disables FSO in all applications. NOTE: This will disable Color Management in Exclusive Fullscreen",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"Order": "a024_",
|
||||
"registry": [
|
||||
{
|
||||
"Path": "HKCU:\\System\\GameConfigStore",
|
||||
"Name": "GameDVR_DXGIHonorFSEWindowsCompatible",
|
||||
"Value": "1",
|
||||
"OriginalValue": "0",
|
||||
"Type": "DWord"
|
||||
}
|
||||
]
|
||||
},
|
||||
"WPFTweaksEnableipsix": {
|
||||
"Content": "Enable IPv6",
|
||||
"Description": "Enables IPv6.",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"Order": "a030_",
|
||||
"Order": "a023_",
|
||||
"registry": [
|
||||
{
|
||||
"Path": "HKLM:\\SYSTEM\\CurrentControlSet\\Services\\Tcpip6\\Parameters",
|
||||
"Name": "DisabledComponents",
|
||||
"Value": "0",
|
||||
"OriginalValue": "0",
|
||||
"Type": "DWord"
|
||||
}
|
||||
],
|
||||
"InvokeScript": [
|
||||
"Enable-NetAdapterBinding -Name \"*\" -ComponentID ms_tcpip6"
|
||||
],
|
||||
@ -2586,12 +3044,28 @@
|
||||
"Order": "a064_",
|
||||
"Type": "Toggle"
|
||||
},
|
||||
"WPFToggleSnapWindow": {
|
||||
"Content": "Snap Window",
|
||||
"Description": "If enabled you can align windows by dragging them. | Relogin Required",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Order": "a065_",
|
||||
"Type": "Toggle"
|
||||
},
|
||||
"WPFToggleSnapFlyout": {
|
||||
"Content": "Snap Assist Flyout",
|
||||
"Description": "If enabled then Snap preview is disabled when maximize button is hovered.",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Order": "a065_",
|
||||
"Order": "a066_",
|
||||
"Type": "Toggle"
|
||||
},
|
||||
"WPFToggleSnapSuggestion": {
|
||||
"Content": "Snap Assist Suggestion",
|
||||
"Description": "If enabled then you will get suggestions to snap other applications in the left over spaces.",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Order": "a067_",
|
||||
"Type": "Toggle"
|
||||
},
|
||||
"WPFToggleMouseAcceleration": {
|
||||
@ -2599,7 +3073,7 @@
|
||||
"Description": "If Enabled then Cursor movement is affected by the speed of your physical mouse movements.",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Order": "a066_",
|
||||
"Order": "a068_",
|
||||
"Type": "Toggle"
|
||||
},
|
||||
"WPFToggleStickyKeys": {
|
||||
@ -2607,7 +3081,22 @@
|
||||
"Description": "If Enabled then Sticky Keys is activated - Sticky keys is an accessibility feature of some graphical user interfaces which assists users who have physical disabilities or help users reduce repetitive strain injury.",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Order": "a067_",
|
||||
"Order": "a069_",
|
||||
"Type": "Toggle"
|
||||
},
|
||||
"WPFOOSUbutton": {
|
||||
"Content": "Customize OO Shutup Tweaks",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"Order": "a039_",
|
||||
"Type": "220"
|
||||
},
|
||||
"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": {
|
||||
|
451
edgeremoval.ps1
451
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
|
@ -2,7 +2,7 @@ function Get-Oscdimg {
|
||||
<#
|
||||
|
||||
.DESCRIPTION
|
||||
This function will get oscdimg file for from github Release foldersand put it into env:temp
|
||||
This function will download oscdimg file from github Release folders and put it into env:temp folder
|
||||
|
||||
.EXAMPLE
|
||||
Get-Oscdimg
|
||||
|
131
functions/private/Get-TabXaml.ps1
Normal file
131
functions/private/Get-TabXaml.ps1
Normal file
@ -0,0 +1,131 @@
|
||||
function Get-TabXaml {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Generates XAML for a tab in the WinUtil GUI
|
||||
This function is used to generate the XAML for the applications tab in the WinUtil GUI
|
||||
It takes the tabname and the number of columns to display the applications in as input and returns the XAML for the tab as output
|
||||
.PARAMETER tabname
|
||||
The name of the tab to generate XAML for
|
||||
.PARAMETER columncount
|
||||
The number of columns to display the applications in
|
||||
.OUTPUTS
|
||||
The XAML for the tab
|
||||
.EXAMPLE
|
||||
Get-TabXaml "applications" 3
|
||||
#>
|
||||
|
||||
|
||||
param( [Parameter(Mandatory=$true)]
|
||||
$tabname,
|
||||
$columncount = 0
|
||||
)
|
||||
$organizedData = @{}
|
||||
# Iterate through JSON data and organize by panel and category
|
||||
foreach ($appName in $sync.configs.$tabname.PSObject.Properties.Name) {
|
||||
$appInfo = $sync.configs.$tabname.$appName
|
||||
|
||||
# Create an object for the application
|
||||
$appObject = [PSCustomObject]@{
|
||||
Name = $appName
|
||||
Category = $appInfo.Category
|
||||
Content = $appInfo.Content
|
||||
Choco = $appInfo.choco
|
||||
Winget = $appInfo.winget
|
||||
Panel = if ($columncount -gt 0 ) { "0" } else {$appInfo.panel}
|
||||
Link = $appInfo.link
|
||||
Description = $appInfo.description
|
||||
# Type is (Checkbox,Toggle,Button,Combobox ) (Default is Checkbox)
|
||||
Type = $appInfo.type
|
||||
ComboItems = $appInfo.ComboItems
|
||||
# Checked is the property to set startup checked status of checkbox (Default is false)
|
||||
Checked = $appInfo.Checked
|
||||
}
|
||||
|
||||
if (-not $organizedData.ContainsKey($appObject.panel)) {
|
||||
$organizedData[$appObject.panel] = @{}
|
||||
}
|
||||
|
||||
if (-not $organizedData[$appObject.panel].ContainsKey($appObject.Category)) {
|
||||
$organizedData[$appObject.panel][$appObject.Category] = @{}
|
||||
}
|
||||
|
||||
# Store application data in a sub-array under the category
|
||||
# Add Order property to keep the original order of tweaks and features
|
||||
$organizedData[$appObject.panel][$appInfo.Category]["$($appInfo.order)$appName"] = $appObject
|
||||
}
|
||||
$panelcount=0
|
||||
$paneltotal = $organizedData.Keys.Count
|
||||
if ($columncount -gt 0) {
|
||||
$appcount = $sync.configs.$tabname.PSObject.Properties.Name.count + $organizedData["0"].Keys.count
|
||||
$maxcount = [Math]::Round( $appcount / $columncount + 0.5)
|
||||
$paneltotal = $columncount
|
||||
}
|
||||
# add ColumnDefinitions to evenly draw colums
|
||||
$blockXml="<Grid.ColumnDefinitions>`n"+("<ColumnDefinition Width=""*""/>`n"*($paneltotal))+"</Grid.ColumnDefinitions>`n"
|
||||
# Iterate through organizedData by panel, category, and application
|
||||
$count = 0
|
||||
foreach ($panel in ($organizedData.Keys | Sort-Object)) {
|
||||
$blockXml += "<Border Grid.Row=""1"" Grid.Column=""$panelcount"">`n<StackPanel Background=""{MainBackgroundColor}"" SnapsToDevicePixels=""True"">`n"
|
||||
$panelcount++
|
||||
foreach ($category in ($organizedData[$panel].Keys | Sort-Object)) {
|
||||
$count++
|
||||
if ($columncount -gt 0) {
|
||||
$panelcount2 = [Int](($count)/$maxcount-0.5)
|
||||
if ($panelcount -eq $panelcount2 ) {
|
||||
$blockXml +="`n</StackPanel>`n</Border>`n"
|
||||
$blockXml += "<Border Grid.Row=""1"" Grid.Column=""$panelcount"">`n<StackPanel Background=""{MainBackgroundColor}"" SnapsToDevicePixels=""True"">`n"
|
||||
$panelcount++
|
||||
}
|
||||
}
|
||||
|
||||
# Dot-source the Get-WPFObjectName function
|
||||
. .\functions\private\Get-WPFObjectName
|
||||
|
||||
$categorycontent = $($category -replace '^.__', '')
|
||||
$categoryname = Get-WPFObjectName -type "Label" -name $categorycontent
|
||||
$blockXml += "<Label Name=""$categoryname"" Content=""$categorycontent"" FontSize=""16""/>`n"
|
||||
$sortedApps = $organizedData[$panel][$category].Keys | Sort-Object
|
||||
foreach ($appName in $sortedApps) {
|
||||
$count++
|
||||
if ($columncount -gt 0) {
|
||||
$panelcount2 = [Int](($count)/$maxcount-0.5)
|
||||
if ($panelcount -eq $panelcount2 ) {
|
||||
$blockXml +="`n</StackPanel>`n</Border>`n"
|
||||
$blockXml += "<Border Grid.Row=""1"" Grid.Column=""$panelcount"">`n<StackPanel Background=""{MainBackgroundColor}"" SnapsToDevicePixels=""True"">`n"
|
||||
$panelcount++
|
||||
}
|
||||
}
|
||||
$appInfo = $organizedData[$panel][$category][$appName]
|
||||
if ("Toggle" -eq $appInfo.Type) {
|
||||
$blockXml += "<DockPanel LastChildFill=`"True`">`n<Label Content=`"$($appInfo.Content)`" ToolTip=`"$($appInfo.Description)`" HorizontalAlignment=`"Left`"/>`n"
|
||||
$blockXml += "<CheckBox Name=`"$($appInfo.Name)`" Style=`"{StaticResource ColorfulToggleSwitchStyle}`" Margin=`"2.5,0`" HorizontalAlignment=`"Right`"/>`n</DockPanel>`n"
|
||||
} elseif ("Combobox" -eq $appInfo.Type) {
|
||||
$blockXml += "<StackPanel Orientation=`"Horizontal`" Margin=`"0,5,0,0`">`n<Label Content=`"$($appInfo.Content)`" HorizontalAlignment=`"Left`" VerticalAlignment=`"Center`"/>`n"
|
||||
$blockXml += "<ComboBox Name=`"$($appInfo.Name)`" Height=`"32`" Width=`"186`" HorizontalAlignment=`"Left`" VerticalAlignment=`"Center`" Margin=`"5,5`">`n"
|
||||
$addfirst="IsSelected=`"True`""
|
||||
foreach ($comboitem in ($appInfo.ComboItems -split " ")) {
|
||||
$blockXml += "<ComboBoxItem $addfirst Content=`"$comboitem`"/>`n"
|
||||
$addfirst=""
|
||||
}
|
||||
$blockXml += "</ComboBox>`n</StackPanel>"
|
||||
# If it is a digit, type is button and button length is digits
|
||||
} elseif ($appInfo.Type -match "^[\d\.]+$") {
|
||||
$blockXml += "<Button Name=`"$($appInfo.Name)`" Content=`"$($appInfo.Content)`" HorizontalAlignment = `"Left`" Width=`"$($appInfo.Type)`" Margin=`"5`" Padding=`"20,5`" />`n"
|
||||
# else it is a checkbox
|
||||
} else {
|
||||
$checkedStatus = If ($null -eq $appInfo.Checked) {""} Else {"IsChecked=`"$($appInfo.Checked)`" "}
|
||||
if ($null -eq $appInfo.Link)
|
||||
{
|
||||
$blockXml += "<CheckBox Name=`"$($appInfo.Name)`" Content=`"$($appInfo.Content)`" $($checkedStatus)Margin=`"5,0`" ToolTip=`"$($appInfo.Description)`"/>`n"
|
||||
}
|
||||
else
|
||||
{
|
||||
$blockXml += "<StackPanel Orientation=""Horizontal"">`n<CheckBox Name=""$($appInfo.Name)"" Content=""$($appInfo.Content)"" $($checkedStatus)ToolTip=""$($appInfo.Description)"" Margin=""0,0,2,0""/><TextBlock Name=""$($appInfo.Name)Link"" Style=""{StaticResource HoverTextBlockStyle}"" Text=""(?)"" ToolTip=""$($appInfo.Link)"" />`n</StackPanel>`n"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$blockXml +="`n</StackPanel>`n</Border>`n"
|
||||
}
|
||||
return ($blockXml)
|
||||
}
|
27
functions/private/Get-WPFObjectName.ps1
Normal file
27
functions/private/Get-WPFObjectName.ps1
Normal file
@ -0,0 +1,27 @@
|
||||
function Get-WPFObjectName {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
This is a helper function that generates an objectname with the prefix WPF that can be used as a Powershell Variable after compilation.
|
||||
To achieve this, all characters that are not a-z, A-Z or 0-9 are simply removed from the name.
|
||||
.PARAMETER type
|
||||
The type of object for which the name should be generated. (e.g. Label, Button, CheckBox...)
|
||||
.PARAMETER name
|
||||
The name or description to be used for the object. (invalid characters are removed)
|
||||
.OUTPUTS
|
||||
A string that can be used as a object/variable name in powershell.
|
||||
For example: WPFLabelMicrosoftTools
|
||||
|
||||
.EXAMPLE
|
||||
Get-WPFObjectName -type Label -name "Microsoft Tools"
|
||||
#>
|
||||
|
||||
param( [Parameter(Mandatory=$true)]
|
||||
$type,
|
||||
$name
|
||||
)
|
||||
|
||||
$Output = $("WPF"+$type+$name) -replace '[^a-zA-Z0-9]', ''
|
||||
|
||||
return $Output
|
||||
|
||||
}
|
@ -5,9 +5,6 @@ Function Get-WinUtilCheckBoxes {
|
||||
.SYNOPSIS
|
||||
Finds all checkboxes that are checked on the specific tab and inputs them into a script.
|
||||
|
||||
.PARAMETER Group
|
||||
The group of checkboxes to check
|
||||
|
||||
.PARAMETER unCheck
|
||||
Whether to uncheck the checkboxes that are checked. Defaults to true
|
||||
|
||||
@ -32,23 +29,33 @@ Function Get-WinUtilCheckBoxes {
|
||||
|
||||
$CheckBoxes = $sync.GetEnumerator() | Where-Object { $_.Value -is [System.Windows.Controls.CheckBox] }
|
||||
|
||||
# First check and add WPFTweaksRestorePoint if checked
|
||||
$RestorePoint = $CheckBoxes | Where-Object { $_.Key -eq 'WPFTweaksRestorePoint' -and $_.Value.IsChecked -eq $true }
|
||||
if ($RestorePoint) {
|
||||
$Output["WPFTweaks"] = @('WPFTweaksRestorePoint')
|
||||
Write-Debug "Adding WPFTweaksRestorePoint as first in WPFTweaks"
|
||||
|
||||
if ($unCheck) {
|
||||
$RestorePoint.Value.IsChecked = $false
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($CheckBox in $CheckBoxes) {
|
||||
if ($CheckBox.Key -eq 'WPFTweaksRestorePoint') { continue } # Skip since it's already handled
|
||||
|
||||
$group = if ($CheckBox.Key.StartsWith("WPFInstall")) { "Install" }
|
||||
elseif ($CheckBox.Key.StartsWith("WPFTweaks")) { "WPFTweaks" }
|
||||
elseif ($CheckBox.Key.StartsWith("WPFFeature")) { "WPFFeature" }
|
||||
|
||||
if ($group) {
|
||||
if ($CheckBox.Value.IsChecked -eq $true) {
|
||||
$feature = switch ($group) {
|
||||
"Install" {
|
||||
# Get the winget value
|
||||
$wingetValue = $sync.configs.applications.$($CheckBox.Name).winget
|
||||
|
||||
if (-not [string]::IsNullOrWhiteSpace($wingetValue) -and $wingetValue -ne "na") {
|
||||
$wingetValue -split ";"
|
||||
} else {
|
||||
$sync.configs.applications.$($CheckBox.Name).choco
|
||||
[PsCustomObject]@{
|
||||
winget="$($sync.configs.applications.$($CheckBox.Name).winget)";
|
||||
choco="$($sync.configs.applications.$($CheckBox.Name).choco)";
|
||||
}
|
||||
|
||||
}
|
||||
default {
|
||||
$CheckBox.Name
|
||||
@ -66,12 +73,11 @@ Function Get-WinUtilCheckBoxes {
|
||||
Write-Debug "Adding: $($feature) under: $($group)"
|
||||
$Output[$group] += $feature
|
||||
|
||||
if ($uncheck -eq $true) {
|
||||
if ($unCheck) {
|
||||
$CheckBox.Value.IsChecked = $false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $Output
|
||||
}
|
||||
|
@ -59,6 +59,15 @@ Function Get-WinUtilToggleStatus {
|
||||
return $false
|
||||
}
|
||||
}
|
||||
if($ToggleSwitch -eq "WPFToggleSnapWindow"){
|
||||
$hidesnap = (Get-ItemProperty -path 'HKCU:\Control Panel\Desktop').WindowArrangementActive
|
||||
if($hidesnap -eq 0){
|
||||
return $false
|
||||
}
|
||||
else{
|
||||
return $true
|
||||
}
|
||||
}
|
||||
if($ToggleSwitch -eq "WPFToggleSnapFlyout"){
|
||||
$hidesnap = (Get-ItemProperty -path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced').EnableSnapAssistFlyout
|
||||
if($hidesnap -eq 0){
|
||||
@ -68,6 +77,15 @@ Function Get-WinUtilToggleStatus {
|
||||
return $true
|
||||
}
|
||||
}
|
||||
if($ToggleSwitch -eq "WPFToggleSnapSuggestion"){
|
||||
$hidesnap = (Get-ItemProperty -path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced').SnapAssist
|
||||
if($hidesnap -eq 0){
|
||||
return $false
|
||||
}
|
||||
else{
|
||||
return $true
|
||||
}
|
||||
}
|
||||
if($ToggleSwitch -eq "WPFToggleMouseAcceleration"){
|
||||
$MouseSpeed = (Get-ItemProperty -path 'HKCU:\Control Panel\Mouse').MouseSpeed
|
||||
$MouseThreshold1 = (Get-ItemProperty -path 'HKCU:\Control Panel\Mouse').MouseThreshold1
|
||||
@ -89,4 +107,13 @@ 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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
27
functions/private/Get-WinUtilWingetLatest.ps1
Normal file
27
functions/private/Get-WinUtilWingetLatest.ps1
Normal file
@ -0,0 +1,27 @@
|
||||
function Get-WinUtilWingetLatest {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Uses GitHub API to check for the latest release of Winget.
|
||||
.DESCRIPTION
|
||||
This function grabs the latest version of Winget and returns the download path to Install-WinUtilWinget for installation.
|
||||
#>
|
||||
# Invoke-WebRequest is notoriously slow when the byte progress is displayed. The following lines disable the progress bar and reset them at the end of the function
|
||||
$PreviousProgressPreference = $ProgressPreference
|
||||
$ProgressPreference = "silentlyContinue"
|
||||
Try{
|
||||
# Grabs the latest release of Winget from the Github API for the install process.
|
||||
$response = Invoke-RestMethod -Uri "https://api.github.com/repos/microsoft/Winget-cli/releases/latest" -Method Get -ErrorAction Stop
|
||||
$latestVersion = $response.tag_name #Stores version number of latest release.
|
||||
$licenseWingetUrl = $response.assets.browser_download_url | Where-Object {$_ -like "*License1.xml"} #Index value for License file.
|
||||
Write-Host "Latest Version:`t$($latestVersion)`n"
|
||||
Write-Host "Downloading..."
|
||||
$assetUrl = $response.assets.browser_download_url | Where-Object {$_ -like "*Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle"}
|
||||
Invoke-WebRequest -Uri $licenseWingetUrl -OutFile $ENV:TEMP\License1.xml
|
||||
# The only pain is that the msixbundle for winget-cli is 246MB. In some situations this can take a bit, with slower connections.
|
||||
Invoke-WebRequest -Uri $assetUrl -OutFile $ENV:TEMP\Microsoft.DesktopAppInstaller.msixbundle
|
||||
}
|
||||
Catch{
|
||||
throw [WingetFailedInstall]::new('Failed to get latest Winget release and license')
|
||||
}
|
||||
$ProgressPreference = $PreviousProgressPreference
|
||||
}
|
29
functions/private/Get-WinUtilWingetPrerequisites.ps1
Normal file
29
functions/private/Get-WinUtilWingetPrerequisites.ps1
Normal file
@ -0,0 +1,29 @@
|
||||
function Get-WinUtilWingetPrerequisites {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Downloads the Winget Prereqs.
|
||||
.DESCRIPTION
|
||||
Downloads Prereqs for Winget. Version numbers are coded as variables and can be updated as uncommonly as Microsoft updates the prereqs.
|
||||
#>
|
||||
|
||||
# I don't know of a way to detect the prereqs automatically, so if someone has a better way of defining these, that would be great.
|
||||
# Microsoft.VCLibs version rarely changes, but for future compatibility I made it a variable.
|
||||
$versionVCLibs = "14.00"
|
||||
$fileVCLibs = "https://aka.ms/Microsoft.VCLibs.x64.${versionVCLibs}.Desktop.appx"
|
||||
# Write-Host "$fileVCLibs"
|
||||
# Microsoft.UI.Xaml version changed recently, so I made the version numbers variables.
|
||||
$versionUIXamlMinor = "2.8"
|
||||
$versionUIXamlPatch = "2.8.6"
|
||||
$fileUIXaml = "https://github.com/microsoft/microsoft-ui-xaml/releases/download/v${versionUIXamlPatch}/Microsoft.UI.Xaml.${versionUIXamlMinor}.x64.appx"
|
||||
# Write-Host "$fileUIXaml"
|
||||
|
||||
Try{
|
||||
Write-Host "Downloading Microsoft.VCLibs Dependency..."
|
||||
Invoke-WebRequest -Uri $fileVCLibs -OutFile $ENV:TEMP\Microsoft.VCLibs.x64.Desktop.appx
|
||||
Write-Host "Downloading Microsoft.UI.Xaml Dependency...`n"
|
||||
Invoke-WebRequest -Uri $fileUIXaml -OutFile $ENV:TEMP\Microsoft.UI.Xaml.x64.appx
|
||||
}
|
||||
Catch{
|
||||
throw [WingetFailedInstall]::new('Failed to install prerequsites')
|
||||
}
|
||||
}
|
@ -10,20 +10,19 @@ function Install-WinUtilChoco {
|
||||
try {
|
||||
Write-Host "Checking if Chocolatey is Installed..."
|
||||
|
||||
if((Get-Command -Name choco -ErrorAction Ignore)) {
|
||||
Write-Host "Chocolatey Already Installed"
|
||||
if((Test-WinUtilPackageManager -choco) -eq "installed") {
|
||||
return
|
||||
}
|
||||
|
||||
Write-Host "Seems Chocolatey is not installed, installing now"
|
||||
Write-Host "Seems Chocolatey is not installed, installing now."
|
||||
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 {
|
||||
Write-Host "==========================================="
|
||||
Write-Host "-- Chocolatey failed to install ---"
|
||||
Write-Host "==========================================="
|
||||
Write-Host "===========================================" -Foregroundcolor Red
|
||||
Write-Host "-- Chocolatey failed to install ---" -Foregroundcolor Red
|
||||
Write-Host "===========================================" -Foregroundcolor Red
|
||||
}
|
||||
|
||||
}
|
||||
|
91
functions/private/Install-WinUtilProgramChoco.ps1
Normal file
91
functions/private/Install-WinUtilProgramChoco.ps1
Normal file
@ -0,0 +1,91 @@
|
||||
function Install-WinUtilProgramChoco {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Manages the provided programs using Chocolatey
|
||||
|
||||
.PARAMETER ProgramsToInstall
|
||||
A list of programs to manage
|
||||
|
||||
.PARAMETER manage
|
||||
The action to perform on the programs, can be either 'Installing' or 'Uninstalling'
|
||||
|
||||
.NOTES
|
||||
The triple quotes are required any time you need a " in a normal script block.
|
||||
#>
|
||||
|
||||
param(
|
||||
[Parameter(Mandatory, Position=0)]
|
||||
[PsCustomObject]$ProgramsToInstall,
|
||||
|
||||
[Parameter(Position=1)]
|
||||
[String]$manage = "Installing"
|
||||
)
|
||||
|
||||
$x = 0
|
||||
$count = $ProgramsToInstall.Count
|
||||
|
||||
# This check isn't really necessary, as there's a couple of checks before this Private Function gets called, but just to make sure ;)
|
||||
if($count -le 0) {
|
||||
throw "Private Function 'Install-WinUtilProgramChoco' expected Parameter 'ProgramsToInstall' to be of size 1 or greater, instead got $count,`nPlease double check your code and re-compile WinUtil."
|
||||
}
|
||||
|
||||
Write-Progress -Activity "$manage Applications" -Status "Starting" -PercentComplete 0
|
||||
Write-Host "==========================================="
|
||||
Write-Host "-- Configuring Chocolatey pacakages ---"
|
||||
Write-Host "==========================================="
|
||||
Foreach ($Program in $ProgramsToInstall){
|
||||
Write-Progress -Activity "$manage Applications" -Status "$manage $($Program.choco) $($x + 1) of $count" -PercentComplete $($x/$count*100)
|
||||
if($manage -eq "Installing"){
|
||||
write-host "Starting install of $($Program.choco) with Chocolatey."
|
||||
try{
|
||||
$tryUpgrade = $false
|
||||
$installOutputFilePath = "$env:TEMP\Install-WinUtilProgramChoco.install-command.output.txt"
|
||||
New-Item -ItemType File -Path $installOutputFilePath
|
||||
$chocoInstallStatus = $(Start-Process -FilePath "choco" -ArgumentList "install $($Program.choco) -y" -Wait -PassThru -RedirectStandardOutput $installOutputFilePath).ExitCode
|
||||
if(($chocoInstallStatus -eq 0) -AND (Test-Path -Path $installOutputFilePath)) {
|
||||
$keywordsFound = Get-Content -Path $installOutputFilePath | Where-Object {$_ -match "reinstall" -OR $_ -match "already installed"}
|
||||
if ($keywordsFound) {
|
||||
$tryUpgrade = $true
|
||||
}
|
||||
}
|
||||
# TODO: Implement the Upgrade part using 'choco upgrade' command, this will make choco consistent with WinGet, as WinGet tries to Upgrade when you use the install command.
|
||||
if ($tryUpgrade) {
|
||||
throw "Automatic Upgrade for Choco isn't implemented yet, a feature to make it consistent with WinGet, the install command using choco simply failed because $($Program.choco) is already installed."
|
||||
}
|
||||
if(($chocoInstallStatus -eq 0) -AND ($tryUpgrade -eq $false)){
|
||||
Write-Host "$($Program.choco) installed successfully using Chocolatey."
|
||||
continue
|
||||
} else {
|
||||
Write-Host "Failed to install $($Program.choco) using Chocolatey, Chocolatey output:`n`n$(Get-Content -Path $installOutputFilePath)."
|
||||
}
|
||||
} catch {
|
||||
Write-Host "Failed to install $($Program.choco) due to an error: $_"
|
||||
}
|
||||
}
|
||||
|
||||
if($manage -eq "Uninstalling"){
|
||||
write-host "Starting uninstall of $($Program.choco) with Chocolatey."
|
||||
try{
|
||||
$uninstallOutputFilePath = "$env:TEMP\Install-WinUtilProgramChoco.uninstall-command.output.txt"
|
||||
New-Item -ItemType File -Path $uninstallOutputFilePath
|
||||
$chocoUninstallStatus = $(Start-Process -FilePath "choco" -ArgumentList "uninstall $($Program.choco) -y" -Wait -PassThru).ExitCode
|
||||
if($chocoUninstallStatus -eq 0){
|
||||
Write-Host "$($Program.choco) uninstalled successfully using Chocolatey."
|
||||
continue
|
||||
} else {
|
||||
Write-Host "Failed to uninstall $($Program.choco) using Chocolatey, Chocolatey output:`n`n$(Get-Content -Path $uninstallOutputFilePath)."
|
||||
}
|
||||
} catch {
|
||||
Write-Host "Failed to uninstall $($Program.choco) due to an error: $_"
|
||||
}
|
||||
}
|
||||
$x++
|
||||
}
|
||||
Write-Progress -Activity "$manage Applications" -Status "Finished" -Completed
|
||||
|
||||
# Cleanup leftovers files
|
||||
if(Test-Path -Path $installOutputFilePath){ Remove-Item -Path $installOutputFilePath }
|
||||
if(Test-Path -Path $installOutputFilePath){ Remove-Item -Path $uninstallOutputFilePath }
|
||||
|
||||
return;
|
||||
}
|
@ -1,44 +1,103 @@
|
||||
Function Install-WinUtilProgramWinget {
|
||||
|
||||
|
||||
<#
|
||||
|
||||
.SYNOPSIS
|
||||
Manages the provided programs using Winget
|
||||
|
||||
Manages the provided programs using Winget
|
||||
|
||||
.PARAMETER ProgramsToInstall
|
||||
A list of programs to manage
|
||||
|
||||
A list of programs to manage
|
||||
|
||||
.PARAMETER manage
|
||||
The action to perform on the programs, can be either 'Installing' or 'Uninstalling'
|
||||
|
||||
The action to perform on the programs, can be either 'Installing' or 'Uninstalling'
|
||||
|
||||
.NOTES
|
||||
The triple quotes are required any time you need a " in a normal script block.
|
||||
|
||||
The triple quotes are required any time you need a " in a normal script block.
|
||||
The winget Return codes are documented here: https://github.com/microsoft/winget-cli/blob/master/doc/windows/package-manager/winget/returnCodes.md
|
||||
#>
|
||||
|
||||
|
||||
param(
|
||||
$ProgramsToInstall,
|
||||
$manage = "Installing"
|
||||
[Parameter(Mandatory, Position=0)]
|
||||
[PsCustomObject]$ProgramsToInstall,
|
||||
|
||||
[Parameter(Position=1)]
|
||||
[String]$manage = "Installing"
|
||||
)
|
||||
|
||||
$x = 0
|
||||
$count = $($ProgramsToInstall -split ",").Count
|
||||
|
||||
$count = $ProgramsToInstall.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)
|
||||
Write-Host "==========================================="
|
||||
Write-Host "-- Configuring winget packages ---"
|
||||
Write-Host "==========================================="
|
||||
Foreach ($Program in $ProgramsToInstall){
|
||||
$failedPackages = @()
|
||||
Write-Progress -Activity "$manage Applications" -Status "$manage $($Program.winget) $($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 --scope=machine --silent $Program" -NoNewWindow -Wait
|
||||
# Install package via ID, if it fails try again with different scope and then with an unelevated prompt.
|
||||
# Since Install-WinGetPackage might not be directly available, we use winget install command as a workaround.
|
||||
# Winget, not all installers honor any of the following: System-wide, User Installs, or Unelevated Prompt OR Silent Install Mode.
|
||||
# This is up to the individual package maintainers to enable these options. Aka. not as clean as Linux Package Managers.
|
||||
Write-Host "Starting install of $($Program.winget) with winget."
|
||||
try {
|
||||
$status = $(Start-Process -FilePath "winget" -ArgumentList "install --id $($Program.winget) --silent --accept-source-agreements --accept-package-agreements" -Wait -PassThru -NoNewWindow).ExitCode
|
||||
if($status -eq 0){
|
||||
Write-Host "$($Program.winget) installed successfully."
|
||||
continue
|
||||
}
|
||||
if ($status -eq -1978335189){
|
||||
Write-Host "$($Program.winget) No applicable update found"
|
||||
continue
|
||||
}
|
||||
Write-Host "Attempt with User scope"
|
||||
$status = $(Start-Process -FilePath "winget" -ArgumentList "install --id $($Program.winget) --scope user --silent --accept-source-agreements --accept-package-agreements" -Wait -PassThru -NoNewWindow).ExitCode
|
||||
if($status -eq 0){
|
||||
Write-Host "$($Program.winget) installed successfully with User scope."
|
||||
continue
|
||||
}
|
||||
if ($status -eq -1978335189){
|
||||
Write-Host "$($Program.winget) No applicable update found"
|
||||
continue
|
||||
}
|
||||
Write-Host "Attempt with User prompt"
|
||||
$userChoice = [System.Windows.MessageBox]::Show("Do you want to attempt $($Program.winget) installation with specific user credentials? Select 'Yes' to proceed or 'No' to skip.", "User Credential Prompt", [System.Windows.MessageBoxButton]::YesNo)
|
||||
if ($userChoice -eq 'Yes') {
|
||||
$getcreds = Get-Credential
|
||||
$process = Start-Process -FilePath "winget" -ArgumentList "install --id $($Program.winget) --silent --accept-source-agreements --accept-package-agreements" -Credential $getcreds -PassThru -NoNewWindow
|
||||
Wait-Process -Id $process.Id
|
||||
$status = $process.ExitCode
|
||||
} else {
|
||||
Write-Host "Skipping installation with specific user credentials."
|
||||
}
|
||||
if($status -eq 0){
|
||||
Write-Host "$($Program.winget) installed successfully with User prompt."
|
||||
continue
|
||||
}
|
||||
if ($status -eq -1978335189){
|
||||
Write-Host "$($Program.winget) No applicable update found"
|
||||
continue
|
||||
}
|
||||
} catch {
|
||||
Write-Host "Failed to install $($Program.winget). With winget"
|
||||
$failedPackages += $Program
|
||||
}
|
||||
}
|
||||
if($manage -eq "Uninstalling"){
|
||||
Start-Process -FilePath winget -ArgumentList "uninstall -e --purge --force --silent $Program" -NoNewWindow -Wait
|
||||
# Uninstall package via ID using winget directly.
|
||||
try {
|
||||
$status = $(Start-Process -FilePath "winget" -ArgumentList "uninstall --id $($Program.winget) --silent" -Wait -PassThru -NoNewWindow).ExitCode
|
||||
if($status -ne 0){
|
||||
Write-Host "Failed to uninstall $($Program.winget)."
|
||||
} else {
|
||||
Write-Host "$($Program.winget) uninstalled successfully."
|
||||
$failedPackages += $Program
|
||||
}
|
||||
} catch {
|
||||
Write-Host "Failed to uninstall $($Program.winget) due to an error: $_"
|
||||
$failedPackages += $Program
|
||||
}
|
||||
}
|
||||
|
||||
$X++
|
||||
}
|
||||
|
||||
Write-Progress -Activity "$manage Applications" -Status "Finished" -Completed
|
||||
|
||||
}
|
||||
return $failedPackages;
|
||||
}
|
||||
|
@ -1,50 +1,66 @@
|
||||
function Get-LatestHash {
|
||||
$shaUrl = ((Invoke-WebRequest $apiLatestUrl -UseBasicParsing | ConvertFrom-Json).assets | Where-Object { $_.name -match '^Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.txt$' }).browser_download_url
|
||||
|
||||
$shaFile = Join-Path -Path $tempFolder -ChildPath 'Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.txt'
|
||||
$WebClient.DownloadFile($shaUrl, $shaFile)
|
||||
|
||||
Get-Content $shaFile
|
||||
}
|
||||
|
||||
function Install-WinUtilWinget {
|
||||
|
||||
<#
|
||||
|
||||
.SYNOPSIS
|
||||
Installs Winget if it is not already installed
|
||||
Installs Winget if it is not already installed.
|
||||
|
||||
.DESCRIPTION
|
||||
This function will download the latest version of winget and install it. If winget is already installed, it will do nothing.
|
||||
This function will download the latest version of Winget and install it. If Winget is already installed, it will do nothing.
|
||||
#>
|
||||
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"
|
||||
$isWingetInstalled = Test-WinUtilPackageManager -winget
|
||||
|
||||
Try {
|
||||
if ($isWingetInstalled -eq "installed") {
|
||||
Write-Host "`nWinget is already installed.`r" -ForegroundColor Green
|
||||
return
|
||||
} elseif ($isWingetInstalled -eq "outdated") {
|
||||
Write-Host "`nWinget is Outdated. Continuing with install.`r" -ForegroundColor Yellow
|
||||
} else {
|
||||
Write-Host "`nWinget is not Installed. Continuing with install.`r" -ForegroundColor Red
|
||||
}
|
||||
|
||||
# Gets the computer's information
|
||||
if ($null -eq $sync.ComputerInfo){
|
||||
$ComputerInfo = Get-ComputerInfo -ErrorAction Stop
|
||||
}
|
||||
Else {
|
||||
} 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)"
|
||||
# Checks if Windows Version is too old for Winget
|
||||
Write-Host "Winget is not supported on this version of Windows (Pre-1809)" -ForegroundColor Red
|
||||
return
|
||||
}
|
||||
|
||||
Write-Host "Running Alternative Installer and Direct Installing"
|
||||
Start-Process -Verb runas -FilePath powershell.exe -ArgumentList "choco install winget"
|
||||
|
||||
Write-Host "Winget Installed"
|
||||
# Install Winget via GitHub method.
|
||||
# Used part of my own script with some modification: ruxunderscore/windows-initialization
|
||||
Write-Host "Downloading Winget Prerequsites`n"
|
||||
Get-WinUtilWingetPrerequisites
|
||||
Write-Host "Downloading Winget and License File`r"
|
||||
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
|
||||
Install-Module -Name Microsoft.WinGet.Client -Force
|
||||
# Winget only needs a refresh of the environment variables to be used.
|
||||
Write-Output "Refreshing Environment Variables...`n"
|
||||
$ENV:PATH = [System.Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "User")
|
||||
} Catch {
|
||||
Write-Host "Failure detected while installing via GitHub method. Continuing with Chocolatey method as fallback." -ForegroundColor Red
|
||||
# In case install fails via GitHub method.
|
||||
Try {
|
||||
# Install Choco if not already present
|
||||
Install-WinUtilChoco
|
||||
Start-Process -Verb runas -FilePath powershell.exe -ArgumentList "choco install winget-cli"
|
||||
Write-Host "Winget Installed" -ForegroundColor Green
|
||||
Write-Output "Refreshing Environment Variables...`n"
|
||||
$ENV:PATH = [System.Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "User")
|
||||
} Catch {
|
||||
throw [WingetFailedInstall]::new('Failed to install!')
|
||||
}
|
||||
}
|
||||
Catch{
|
||||
throw [WingetFailedInstall]::new('Failed to install')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -18,28 +18,23 @@ function Test-CompatibleImage() {
|
||||
<#
|
||||
|
||||
.SYNOPSIS
|
||||
Checks the version of a Windows image and determines whether or not it is compatible depending on the Major property
|
||||
Checks the version of a Windows image and determines whether or not it is compatible with a specific feature depending on a desired version
|
||||
|
||||
.PARAMETER imgVersion
|
||||
The version of the Windows image
|
||||
.PARAMETER Name
|
||||
imgVersion - The version of the Windows image
|
||||
desiredVersion - The version to compare the image version with
|
||||
|
||||
#>
|
||||
|
||||
param
|
||||
(
|
||||
[Parameter(Mandatory = $true)] [string] $imgVersion
|
||||
[Parameter(Mandatory = $true, Position=0)] [string] $imgVersion,
|
||||
[Parameter(Mandatory = $true, Position=1)] [Version] $desiredVersion
|
||||
)
|
||||
|
||||
try {
|
||||
$version = [Version]$imgVersion
|
||||
if ($version.Major -ge 10)
|
||||
{
|
||||
return $True
|
||||
}
|
||||
else
|
||||
{
|
||||
return $False
|
||||
}
|
||||
return $version -ge $desiredVersion
|
||||
} catch {
|
||||
return $False
|
||||
}
|
||||
@ -59,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 <installation media>\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
|
||||
@ -128,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
|
||||
}
|
||||
@ -172,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
|
||||
}
|
||||
@ -200,7 +203,7 @@ function Copy-ToUSB([string] $fileToCopy)
|
||||
Write-Progress -Activity "Copying File" -Status "Progress" -PercentComplete $completed -CurrentOperation ("{0:N2} MB / {1:N2} MB" -f ($_.BytesTransferred / 1MB), ($totalSize / 1MB))
|
||||
}
|
||||
|
||||
Write-Host "File copied to Ventoy drive $($volume.DriveLette)"
|
||||
Write-Host "File copied to Ventoy drive $($volume.DriveLetter)"
|
||||
return
|
||||
}
|
||||
}
|
||||
@ -247,7 +250,7 @@ function Remove-FileOrDirectory([string] $pathToDelete, [string] $mask = "", [sw
|
||||
|
||||
foreach($itemToDelete in $itemsToDelete)
|
||||
{
|
||||
$status = "Deleteing $($itemToDelete)"
|
||||
$status = "Deleting $($itemToDelete)"
|
||||
Write-Progress -Activity "Removing Items" -Status $status -PercentComplete ($counter++/$itemsToDelete.Count*100)
|
||||
|
||||
if (Test-Path -Path "$($itemToDelete)" -PathType Container)
|
||||
@ -321,7 +324,7 @@ function New-Unattend {
|
||||
<unattend xmlns="urn:schemas-microsoft-com:unattend"
|
||||
xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
|
||||
<#REPLACEME#>
|
||||
<settings pass="auditUser">
|
||||
<component name="Microsoft-Windows-Deployment" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<RunSynchronous>
|
||||
@ -362,7 +365,27 @@ function New-Unattend {
|
||||
</settings>
|
||||
</unattend>
|
||||
'@
|
||||
$unattend | Out-File -FilePath "$env:temp\unattend.xml" -Force
|
||||
$specPass = @'
|
||||
<settings pass="specialize">
|
||||
<component name="Microsoft-Windows-SQMApi" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<CEIPEnabled>0</CEIPEnabled>
|
||||
</component>
|
||||
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<ConfigureChatAutoInstall>false</ConfigureChatAutoInstall>
|
||||
</component>
|
||||
</settings>
|
||||
'@
|
||||
if ((Test-CompatibleImage $imgVersion $([System.Version]::new(10,0,22000,1))) -eq $false)
|
||||
{
|
||||
# Replace the placeholder text with an empty string to make it valid for Windows 10 Setup
|
||||
$unattend = $unattend.Replace("<#REPLACEME#>", "").Trim()
|
||||
}
|
||||
else
|
||||
{
|
||||
# Replace the placeholder text with the Specialize pass
|
||||
$unattend = $unattend.Replace("<#REPLACEME#>", $specPass).Trim()
|
||||
}
|
||||
$unattend | Out-File -FilePath "$env:temp\unattend.xml" -Force -Encoding utf8
|
||||
}
|
||||
|
||||
function New-CheckInstall {
|
||||
@ -622,6 +645,13 @@ function New-FirstRun {
|
||||
$shortcut.Arguments = "-NoProfile -ExecutionPolicy Bypass -Command `"$command`""
|
||||
# Save the shortcut
|
||||
$shortcut.Save()
|
||||
|
||||
# Make the shortcut have 'Run as administrator' property on
|
||||
$bytes = [System.IO.File]::ReadAllBytes($shortcutPath)
|
||||
# Set byte value at position 0x15 in hex, or 21 in decimal, from the value 0x00 to 0x20 in hex
|
||||
$bytes[0x15] = $bytes[0x15] -bor 0x20
|
||||
[System.IO.File]::WriteAllBytes($shortcutPath, $bytes)
|
||||
|
||||
Write-Host "Shortcut created at: $shortcutPath"
|
||||
#
|
||||
# Done create WinUtil shortcut on the desktop
|
||||
@ -631,4 +661,4 @@ function New-FirstRun {
|
||||
|
||||
'@
|
||||
$firstRun | Out-File -FilePath "$env:temp\FirstStartup.ps1" -Force
|
||||
}
|
||||
}
|
||||
|
29
functions/private/Invoke-WinUtilGPU.ps1
Normal file
29
functions/private/Invoke-WinUtilGPU.ps1
Normal file
@ -0,0 +1,29 @@
|
||||
function Invoke-WinUtilGPU {
|
||||
$gpuInfo = Get-CimInstance Win32_VideoController
|
||||
|
||||
foreach ($gpu in $gpuInfo) {
|
||||
$gpuName = $gpu.Name
|
||||
if ($gpuName -like "*NVIDIA*") {
|
||||
return $true # NVIDIA GPU found
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($gpu in $gpuInfo) {
|
||||
$gpuName = $gpu.Name
|
||||
if ($gpuName -like "*AMD Radeon RX*") {
|
||||
return $true # AMD GPU Found
|
||||
}
|
||||
}
|
||||
foreach ($gpu in $gpuInfo) {
|
||||
$gpuName = $gpu.Name
|
||||
if ($gpuName -like "*UHD*") {
|
||||
return $false # Intel Intergrated GPU Found
|
||||
}
|
||||
}
|
||||
foreach ($gpu in $gpuInfo) {
|
||||
$gpuName = $gpu.Name
|
||||
if ($gpuName -like "*AMD Radeon(TM)*") {
|
||||
return $false # AMD Intergrated GPU Found
|
||||
}
|
||||
}
|
||||
}
|
@ -15,7 +15,8 @@ function Invoke-WinUtilNumLock {
|
||||
Write-Host "Disabling Numlock on startup"
|
||||
$value = 0
|
||||
}
|
||||
$Path = "HKCU:\Control Panel\Keyboard"
|
||||
New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS
|
||||
$Path = "HKU:\.Default\Control Panel\Keyboard"
|
||||
Set-ItemProperty -Path $Path -Name InitialKeyboardIndicators -Value $value
|
||||
}
|
||||
Catch [System.Security.SecurityException] {
|
||||
|
34
functions/private/Invoke-WinUtilSnapSuggestion.ps1
Normal file
34
functions/private/Invoke-WinUtilSnapSuggestion.ps1
Normal file
@ -0,0 +1,34 @@
|
||||
function Invoke-WinUtilSnapSuggestion {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Disables/Enables Snap Assist Suggestions on startup
|
||||
.PARAMETER Enabled
|
||||
Indicates whether to enable or disable Snap Assist Suggestions on startup
|
||||
#>
|
||||
Param($Enabled)
|
||||
Try{
|
||||
if ($Enabled -eq $false){
|
||||
Write-Host "Enabling Snap Assist Suggestion On startup"
|
||||
$value = 1
|
||||
}
|
||||
else {
|
||||
Write-Host "Disabling Snap Assist Suggestion On startup"
|
||||
$value = 0
|
||||
}
|
||||
# taskkill.exe /F /IM "explorer.exe"
|
||||
$Path = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"
|
||||
taskkill.exe /F /IM "explorer.exe"
|
||||
Set-ItemProperty -Path $Path -Name SnapAssist -Value $value
|
||||
Start-Process "explorer.exe"
|
||||
}
|
||||
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
|
||||
}
|
||||
}
|
31
functions/private/Invoke-WinUtilSnapWindow.ps1
Normal file
31
functions/private/Invoke-WinUtilSnapWindow.ps1
Normal file
@ -0,0 +1,31 @@
|
||||
function Invoke-WinUtilSnapWindow {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Disables/Enables Snapping Windows on startup
|
||||
.PARAMETER Enabled
|
||||
Indicates whether to enable or disable Snapping Windows on startup
|
||||
#>
|
||||
Param($Enabled)
|
||||
Try{
|
||||
if ($Enabled -eq $false){
|
||||
Write-Host "Enabling Snap Windows On startup | Relogin Required"
|
||||
$value = 1
|
||||
}
|
||||
else {
|
||||
Write-Host "Disabling Snap Windows On startup | Relogin Required"
|
||||
$value = 0
|
||||
}
|
||||
$Path = "HKCU:\Control Panel\Desktop"
|
||||
Set-ItemProperty -Path $Path -Name WindowArrangementActive -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
|
||||
}
|
||||
}
|
34
functions/private/Invoke-WinUtilTaskbarWidgets.ps1
Normal file
34
functions/private/Invoke-WinUtilTaskbarWidgets.ps1
Normal file
@ -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
|
||||
}
|
||||
}
|
@ -10,11 +10,15 @@ function Invoke-WinUtilTweaks {
|
||||
.PARAMETER undo
|
||||
Indicates whether to undo the operation contained in the checkbox
|
||||
|
||||
.PARAMETER KeepServiceStartup
|
||||
Indicates whether to override the startup of a service with the one given from WinUtil,
|
||||
or to keep the startup of said service, if it was changed by the user, or another program, from its default value.
|
||||
#>
|
||||
|
||||
param(
|
||||
$CheckBox,
|
||||
$undo = $false
|
||||
$undo = $false,
|
||||
$KeepServiceStartup = $true
|
||||
)
|
||||
|
||||
Write-Debug "Tweaks: $($CheckBox)"
|
||||
@ -32,6 +36,7 @@ function Invoke-WinUtilTweaks {
|
||||
Registry = "Value"
|
||||
ScheduledTask = "State"
|
||||
Service = "StartupType"
|
||||
OriginalService = "OriginalType"
|
||||
ScriptType = "InvokeScript"
|
||||
}
|
||||
}
|
||||
@ -42,9 +47,29 @@ function Invoke-WinUtilTweaks {
|
||||
}
|
||||
}
|
||||
if($sync.configs.tweaks.$CheckBox.service){
|
||||
Write-Debug "KeepServiceStartup is $KeepServiceStartup"
|
||||
$sync.configs.tweaks.$CheckBox.service | ForEach-Object {
|
||||
Write-Debug "$($psitem.Name) and state is $($psitem.$($values.service))"
|
||||
Set-WinUtilService -Name $psitem.Name -StartupType $psitem.$($values.Service)
|
||||
$changeservice = $true
|
||||
|
||||
# The check for !($undo) is required, without it the script will throw an error for accessing unavailable memeber, which's the 'OriginalService' Property
|
||||
if($KeepServiceStartup -AND !($undo)) {
|
||||
try {
|
||||
# Check if the service exists
|
||||
$service = Get-Service -Name $psitem.Name -ErrorAction Stop
|
||||
if(!($service.StartType.ToString() -eq $psitem.$($values.OriginalService))) {
|
||||
Write-Debug "Service $($service.Name) was changed in the past to $($service.StartType.ToString()) from it's original type of $($psitem.$($values.OriginalService)), will not change it to $($psitem.$($values.service))"
|
||||
$changeservice = $false
|
||||
}
|
||||
}
|
||||
catch [System.ServiceProcess.ServiceNotFoundException] {
|
||||
Write-Warning "Service $($psitem.Name) was not found"
|
||||
}
|
||||
}
|
||||
|
||||
if($changeservice) {
|
||||
Write-Debug "$($psitem.Name) and state is $($psitem.$($values.service))"
|
||||
Set-WinUtilService -Name $psitem.Name -StartupType $psitem.$($values.Service)
|
||||
}
|
||||
}
|
||||
}
|
||||
if($sync.configs.tweaks.$CheckBox.registry){
|
||||
@ -70,4 +95,4 @@ function Invoke-WinUtilTweaks {
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -17,37 +17,81 @@ function Test-WinUtilPackageManager {
|
||||
[System.Management.Automation.SwitchParameter]$choco
|
||||
)
|
||||
|
||||
# Install Winget if not detected
|
||||
$wingetExists = Get-Command -Name winget -ErrorAction SilentlyContinue
|
||||
if ($wingetExists) {
|
||||
$wingetVersion = [System.Version]::Parse((winget --version).Trim('v'))
|
||||
$minimumWingetVersion = [System.Version]::new(1,2,10691) # Win 11 23H2 comes with bad winget v1.2.10691
|
||||
$wingetOutdated = $wingetVersion -le $minimumWingetVersion
|
||||
|
||||
Write-Host "Winget v$wingetVersion"
|
||||
}
|
||||
|
||||
if (!$wingetExists -or $wingetOutdated) {
|
||||
if (!$wingetExists) {
|
||||
Write-Host "Winget not detected"
|
||||
} else {
|
||||
Write-Host "- Winget out-dated"
|
||||
}
|
||||
}
|
||||
$status = "not-installed"
|
||||
|
||||
if ($winget) {
|
||||
if ($wingetExists -and !$wingetOutdated) {
|
||||
Write-Host "- Winget up-to-date"
|
||||
return $true
|
||||
# Check if Winget is available while getting it's Version if it's available
|
||||
$wingetExists = $true
|
||||
try {
|
||||
$wingetVersionFull = winget --version
|
||||
} catch [System.Management.Automation.CommandNotFoundException], [System.Management.Automation.ApplicationFailedException] {
|
||||
Write-Warning "Winget was not found due to un-availablity reasons"
|
||||
$wingetExists = $false
|
||||
} catch {
|
||||
Write-Warning "Winget was not found due to un-known reasons, The Stack Trace is:`n$($psitem.Exception.StackTrace)"
|
||||
$wingetExists = $false
|
||||
}
|
||||
|
||||
# If Winget is available, Parse it's Version and give proper information to Terminal Output.
|
||||
# If it isn't available, the return of this funtion will be "not-installed", indicating that
|
||||
# Winget isn't installed/available on The System.
|
||||
if ($wingetExists) {
|
||||
# Check if Preview Version
|
||||
if ($wingetVersionFull.Contains("-preview")) {
|
||||
$wingetVersion = $wingetVersionFull.Trim("-preview")
|
||||
$wingetPreview = $true
|
||||
} else {
|
||||
$wingetVersion = $wingetVersionFull
|
||||
$wingetPreview = $false
|
||||
}
|
||||
|
||||
# Check if Winget's Version is too old.
|
||||
$wingetCurrentVersion = [System.Version]::Parse($wingetVersion.Trim('v'))
|
||||
# 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 "===========================================" -ForegroundColor Green
|
||||
Write-Host "Version: $wingetVersionFull" -ForegroundColor White
|
||||
|
||||
if (!$wingetPreview) {
|
||||
Write-Host " - Winget is a release version." -ForegroundColor Green
|
||||
} else {
|
||||
Write-Host " - Winget is a preview version. Unexpected problems may occur." -ForegroundColor Yellow
|
||||
}
|
||||
|
||||
if (!$wingetOutdated) {
|
||||
Write-Host " - Winget is Up to Date" -ForegroundColor Green
|
||||
$status = "installed"
|
||||
}
|
||||
else {
|
||||
Write-Host " - Winget is Out of Date" -ForegroundColor Red
|
||||
$status = "outdated"
|
||||
}
|
||||
} else {
|
||||
Write-Host "===========================================" -ForegroundColor Red
|
||||
Write-Host "--- Winget is not installed ---" -ForegroundColor Red
|
||||
Write-Host "===========================================" -ForegroundColor Red
|
||||
$status = "not-installed"
|
||||
}
|
||||
}
|
||||
|
||||
if($choco){
|
||||
if ((Get-Command -Name choco -ErrorAction Ignore) -and ($chocoVersion = (Get-Item "$env:ChocolateyInstall\choco.exe" -ErrorAction Ignore).VersionInfo.ProductVersion)){
|
||||
Write-Host "Chocolatey v$chocoVersion"
|
||||
return $true
|
||||
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 "===========================================" -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 "===========================================" -ForegroundColor Red
|
||||
$status = "not-installed"
|
||||
}
|
||||
}
|
||||
|
||||
return $false
|
||||
}
|
||||
return $status
|
||||
}
|
||||
|
@ -12,7 +12,7 @@ Function Update-WinUtilProgramWinget {
|
||||
$host.ui.RawUI.WindowTitle = """Winget Install"""
|
||||
|
||||
Start-Transcript $ENV:TEMP\winget-update.log -Append
|
||||
winget upgrade --all
|
||||
winget upgrade --all --accept-source-agreements --accept-package-agreements --scope=machine --silent
|
||||
|
||||
}
|
||||
|
||||
|
@ -21,12 +21,12 @@ function Invoke-WPFButton {
|
||||
"WPFinstall" {Invoke-WPFInstall}
|
||||
"WPFuninstall" {Invoke-WPFUnInstall}
|
||||
"WPFInstallUpgrade" {Invoke-WPFInstallUpgrade}
|
||||
"WPFdesktop" {Invoke-WPFPresets "Desktop"}
|
||||
"WPFlaptop" {Invoke-WPFPresets "laptop"}
|
||||
"WPFminimal" {Invoke-WPFPresets "minimal"}
|
||||
"WPFstandard" {Invoke-WPFPresets "Standard"}
|
||||
"WPFminimal" {Invoke-WPFPresets "Minimal"}
|
||||
"WPFclear" {Invoke-WPFPresets -preset $null -imported $true}
|
||||
"WPFclearWinget" {Invoke-WPFPresets -preset $null -imported $true -CheckBox "WPFInstall"}
|
||||
"WPFtweaksbutton" {Invoke-WPFtweaksbutton}
|
||||
"WPFOOSUbutton" {Invoke-WPFOOSU -action "customize"}
|
||||
"WPFAddUltPerf" {Invoke-WPFUltimatePerformance -State "Enabled"}
|
||||
"WPFRemoveUltPerf" {Invoke-WPFUltimatePerformance -State "Disabled"}
|
||||
"WPFundoall" {Invoke-WPFundoall}
|
||||
@ -47,7 +47,7 @@ function Invoke-WPFButton {
|
||||
"WPFFixesNetwork" {Invoke-WPFFixesNetwork}
|
||||
"WPFUpdatesdisable" {Invoke-WPFUpdatesdisable}
|
||||
"WPFUpdatessecurity" {Invoke-WPFUpdatessecurity}
|
||||
"WPFWinUtilShortcut" {Invoke-WPFShortcut -ShortcutToAdd "WinUtil"}
|
||||
"WPFWinUtilShortcut" {Invoke-WPFShortcut -ShortcutToAdd "WinUtil" -RunAsAdmin $true}
|
||||
"WPFGetInstalled" {Invoke-WPFGetInstalled -CheckBox "winget"}
|
||||
"WPFGetInstalledTweaks" {Invoke-WPFGetInstalled -CheckBox "tweaks"}
|
||||
"WPFGetIso" {Invoke-WPFGetIso}
|
||||
|
@ -7,7 +7,8 @@ function Invoke-WPFFixesWinget {
|
||||
.DESCRIPTION
|
||||
BravoNorris for the fantastic idea of a button to reinstall winget
|
||||
#>
|
||||
|
||||
# Install Choco if not already present
|
||||
Install-WinUtilChoco
|
||||
Start-Process -FilePath "choco" -ArgumentList "install winget -y --force" -NoNewWindow -Wait
|
||||
|
||||
}
|
@ -16,10 +16,7 @@ function Invoke-WPFGetInstalled {
|
||||
return
|
||||
}
|
||||
|
||||
if(!(Get-Command -Name winget -ErrorAction SilentlyContinue) -and $checkbox -eq "winget"){
|
||||
Write-Host "==========================================="
|
||||
Write-Host "-- Winget is not installed ---"
|
||||
Write-Host "==========================================="
|
||||
if(((Test-WinUtilPackageManager -winget) -eq "not-installed") -and $checkbox -eq "winget"){
|
||||
return
|
||||
}
|
||||
|
||||
@ -46,4 +43,4 @@ function Invoke-WPFGetInstalled {
|
||||
Write-Host "Done..."
|
||||
$sync.ProcessRunning = $false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -12,7 +12,7 @@ function Invoke-WPFGetIso {
|
||||
return
|
||||
}
|
||||
|
||||
$sync.BusyMessage.Visibility="Visible"
|
||||
$sync.BusyMessage.Visibility="Visible"
|
||||
$sync.BusyText.Text="N Busy"
|
||||
|
||||
|
||||
@ -23,10 +23,6 @@ function Invoke-WPFGetIso {
|
||||
Write-Host "\/ \/|_| \___||_| \___/ \/ \/ |_||_| |_| "
|
||||
|
||||
$oscdimgPath = Join-Path $env:TEMP 'oscdimg.exe'
|
||||
if( ! (Test-Path $oscdimgPath -PathType Leaf) ) {
|
||||
$oscdimgPath = Join-Path '.\releases\' 'oscdimg.exe'
|
||||
}
|
||||
|
||||
$oscdImgFound = [bool] (Get-Command -ErrorAction Ignore -Type Application oscdimg.exe) -or (Test-Path $oscdimgPath -PathType Leaf)
|
||||
Write-Host "oscdimg.exe on system: $oscdImgFound"
|
||||
|
||||
@ -41,6 +37,8 @@ function Invoke-WPFGetIso {
|
||||
# you consent to downloading it, no need to show extra dialogs
|
||||
[System.Windows.MessageBox]::Show("oscdimge.exe is not found on the system, winutil will now attempt do download and install it using choco. This might take a long time.")
|
||||
# the step below needs choco to download oscdimg
|
||||
# Install Choco if not already present
|
||||
Install-WinUtilChoco
|
||||
$chocoFound = [bool] (Get-Command -ErrorAction Ignore -Type Application choco)
|
||||
Write-Host "choco on system: $chocoFound"
|
||||
if (!$chocoFound)
|
||||
@ -90,6 +88,29 @@ function Invoke-WPFGetIso {
|
||||
return
|
||||
}
|
||||
|
||||
# Detect the file size of the ISO and compare it with the free space of the system drive
|
||||
$isoSize = (Get-Item -Path $filePath).Length
|
||||
Write-Debug "Size of ISO file: $($isoSize) bytes"
|
||||
# Use this procedure to get the free space of the drive depending on where the user profile folder is stored.
|
||||
# This is done to guarantee a dynamic solution, as the installation drive may be mounted to a letter different than C
|
||||
$driveSpace = (Get-Volume -DriveLetter ([IO.Path]::GetPathRoot([Environment]::GetFolderPath([Environment+SpecialFolder]::UserProfile)).Replace(":\", "").Trim())).SizeRemaining
|
||||
Write-Debug "Free space on installation drive: $($driveSpace) bytes"
|
||||
if ($driveSpace -lt ($isoSize * 2))
|
||||
{
|
||||
# It's not critical and we _may_ continue. Output a warning
|
||||
Write-Warning "You may not have enough space for this operation. Proceed at your own risk."
|
||||
}
|
||||
elseif ($driveSpace -lt $isoSize)
|
||||
{
|
||||
# It's critical and we can't continue. Output an error
|
||||
Write-Host "You don't have enough space for this operation. You need at least $([Math]::Round(($isoSize / ([Math]::Pow(1024, 2))) * 2, 2)) MB of free space to copy the ISO files to a temp directory and to be able to perform additional operations."
|
||||
return
|
||||
}
|
||||
else
|
||||
{
|
||||
Write-Host "You have enough space for this operation."
|
||||
}
|
||||
|
||||
try {
|
||||
Write-Host "Mounting Iso. Please wait."
|
||||
$mountedISO = Mount-DiskImage -PassThru "$filePath"
|
||||
@ -123,6 +144,19 @@ function Invoke-WPFGetIso {
|
||||
$sync.MicrowinScratchDirBox.Text = Join-Path $sync.MicrowinScratchDirBox.Text.Trim() '\'
|
||||
|
||||
}
|
||||
|
||||
# Detect if the folders already exist and remove them
|
||||
if (($sync.MicrowinMountDir.Text -ne "") -and (Test-Path -Path $sync.MicrowinMountDir.Text))
|
||||
{
|
||||
try {
|
||||
Write-Host "Deleting temporary files from previous run. Please wait..."
|
||||
Remove-Item -Path $sync.MicrowinMountDir.Text -Recurse -Force
|
||||
Remove-Item -Path $sync.MicrowinScratchDir.Text -Recurse -Force
|
||||
}
|
||||
catch {
|
||||
Write-Host "Could not delete temporary files. You need to delete those manually."
|
||||
}
|
||||
}
|
||||
|
||||
Write-Host "Setting up mount dir and scratch dirs"
|
||||
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
|
||||
@ -160,13 +194,18 @@ function Invoke-WPFGetIso {
|
||||
$wimFile = "$mountDir\sources\install.wim"
|
||||
Write-Host "Getting image information $wimFile"
|
||||
|
||||
if (-not (Test-Path -Path $wimFile -PathType Leaf))
|
||||
if ((-not (Test-Path -Path $wimFile -PathType Leaf)) -and (-not (Test-Path -Path $wimFile.Replace(".wim", ".esd").Trim() -PathType Leaf)))
|
||||
{
|
||||
$msg = "Install.wim file doesn't exist in the image, this could happen if you use unofficial Windows images, or a Media creation tool, which creates a final image that can not be modified. Please don't use shady images from the internet, use only official images. Here are instructions how to download ISO images if the Microsoft website is not showing the link to download and ISO. https://www.techrepublic.com/article/how-to-download-a-windows-10-iso-file-without-using-the-media-creation-tool/"
|
||||
$msg = "Neither install.wim nor install.esd exist in the image, this could happen if you use unofficial Windows images. Please don't use shady images from the internet, use only official images. Here are instructions how to download ISO images if the Microsoft website is not showing the link to download and ISO. https://www.techrepublic.com/article/how-to-download-a-windows-10-iso-file-without-using-the-media-creation-tool/"
|
||||
Write-Host $msg
|
||||
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Error)
|
||||
throw
|
||||
}
|
||||
elseif ((-not (Test-Path -Path $wimFile -PathType Leaf)) -and (Test-Path -Path $wimFile.Replace(".wim", ".esd").Trim() -PathType Leaf))
|
||||
{
|
||||
Write-Host "Install.esd found on the image. It needs to be converted to a WIM file in order to begin processing"
|
||||
$wimFile = $wimFile.Replace(".wim", ".esd").Trim()
|
||||
}
|
||||
$sync.MicrowinWindowsFlavors.Items.Clear()
|
||||
Get-WindowsImage -ImagePath $wimFile | ForEach-Object {
|
||||
$imageIdx = $_.ImageIndex
|
||||
|
@ -2,33 +2,53 @@ function Invoke-WPFInstall {
|
||||
<#
|
||||
|
||||
.SYNOPSIS
|
||||
Installs the selected programs using winget
|
||||
Installs the selected programs using winget, if one or more of the selected programs are already installed on the system, winget will try and perform an upgrade if there's a newer version to install.
|
||||
|
||||
#>
|
||||
|
||||
if($sync.ProcessRunning){
|
||||
$msg = "[Invoke-WPFInstall] Install process is currently running."
|
||||
$msg = "[Invoke-WPFInstall] An Install process is currently running."
|
||||
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
|
||||
return
|
||||
}
|
||||
|
||||
$WingetInstall = (Get-WinUtilCheckBoxes)["Install"]
|
||||
|
||||
if ($wingetinstall.Count -eq 0) {
|
||||
$WarningMsg = "Please select the program(s) to install"
|
||||
$PackagesToInstall = (Get-WinUtilCheckBoxes)["Install"]
|
||||
Write-Host $PackagesToInstall
|
||||
if ($PackagesToInstall.Count -eq 0) {
|
||||
$WarningMsg = "Please select the program(s) to install or upgrade"
|
||||
[System.Windows.MessageBox]::Show($WarningMsg, $AppTitle, [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
|
||||
return
|
||||
}
|
||||
|
||||
Invoke-WPFRunspace -ArgumentList $WingetInstall -DebugPreference $DebugPreference -ScriptBlock {
|
||||
param($WingetInstall, $DebugPreference)
|
||||
Invoke-WPFRunspace -ArgumentList $PackagesToInstall -DebugPreference $DebugPreference -ScriptBlock {
|
||||
param($PackagesToInstall, $DebugPreference)
|
||||
$packagesWinget, $packagesChoco = {
|
||||
$packagesWinget = [System.Collections.Generic.List`1[System.Object]]::new()
|
||||
$packagesChoco = [System.Collections.Generic.List`1[System.Object]]::new()
|
||||
foreach ($package in $PackagesToInstall) {
|
||||
if ($package.winget -eq "na") {
|
||||
$packagesChoco.add($package)
|
||||
Write-Host "Queueing $($package.choco) for Chocolatey install"
|
||||
} else {
|
||||
$packagesWinget.add($package)
|
||||
Write-Host "Queueing $($package.winget) for Winget install"
|
||||
}
|
||||
}
|
||||
return $packagesWinget, $packagesChoco
|
||||
}.Invoke($PackagesToInstall)
|
||||
|
||||
try{
|
||||
$sync.ProcessRunning = $true
|
||||
|
||||
Install-WinUtilWinget
|
||||
Install-WinUtilProgramWinget -ProgramsToInstall $WingetInstall
|
||||
|
||||
$errorPackages = @()
|
||||
if($packagesWinget.Count -gt 0){
|
||||
Install-WinUtilWinget
|
||||
$errorPackages += Install-WinUtilProgramWinget -ProgramsToInstall $packagesWinget
|
||||
$errorPackages| ForEach-Object {if($_.choco -ne "na") {$packagesChoco += $_}}
|
||||
}
|
||||
if($packagesChoco.Count -gt 0){
|
||||
Install-WinUtilChoco
|
||||
Install-WinUtilProgramChoco -ProgramsToInstall $packagesChoco
|
||||
}
|
||||
Write-Host "==========================================="
|
||||
Write-Host "-- Installs have finished ---"
|
||||
Write-Host "==========================================="
|
||||
@ -41,4 +61,4 @@ function Invoke-WPFInstall {
|
||||
Start-Sleep -Seconds 5
|
||||
$sync.ProcessRunning = $False
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -5,10 +5,7 @@ function Invoke-WPFInstallUpgrade {
|
||||
Invokes the function that upgrades all installed programs using winget
|
||||
|
||||
#>
|
||||
if(!(Get-Command -Name winget -ErrorAction SilentlyContinue)){
|
||||
Write-Host "==========================================="
|
||||
Write-Host "-- Winget is not installed ---"
|
||||
Write-Host "==========================================="
|
||||
if((Test-WinUtilPackageManager -winget) -eq "not-installed"){
|
||||
return
|
||||
}
|
||||
|
||||
@ -24,4 +21,4 @@ function Invoke-WPFInstallUpgrade {
|
||||
Write-Host "-- Updates started ---"
|
||||
Write-Host "-- You can close this window if desired ---"
|
||||
Write-Host "==========================================="
|
||||
}
|
||||
}
|
||||
|
@ -53,14 +53,35 @@ public class PowerManagement {
|
||||
$keepEdge = $sync.WPFMicrowinKeepEdge.IsChecked
|
||||
$copyToUSB = $sync.WPFMicrowinCopyToUsb.IsChecked
|
||||
$injectDrivers = $sync.MicrowinInjectDrivers.IsChecked
|
||||
$importDrivers = $sync.MicrowinImportDrivers.IsChecked
|
||||
|
||||
$mountDir = $sync.MicrowinMountDir.Text
|
||||
$scratchDir = $sync.MicrowinScratchDir.Text
|
||||
|
||||
# Detect if the Windows image is an ESD file and convert it to WIM
|
||||
if (-not (Test-Path -Path $mountDir\sources\install.wim -PathType Leaf) -and (Test-Path -Path $mountDir\sources\install.esd -PathType Leaf))
|
||||
{
|
||||
Write-Host "Exporting Windows image to a WIM file, keeping the index we want to work on. This can take several minutes, depending on the performance of your computer..."
|
||||
Export-WindowsImage -SourceImagePath $mountDir\sources\install.esd -SourceIndex $index -DestinationImagePath $mountDir\sources\install.wim -CompressionType "Max"
|
||||
if ($?)
|
||||
{
|
||||
Remove-Item -Path $mountDir\sources\install.esd -Force
|
||||
# Since we've already exported the image index we wanted, switch to the first one
|
||||
$index = 1
|
||||
}
|
||||
else
|
||||
{
|
||||
$msg = "The export process has failed and MicroWin processing cannot continue"
|
||||
Write-Host "Failed to export the image"
|
||||
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Error)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
$imgVersion = (Get-WindowsImage -ImagePath $mountDir\sources\install.wim -Index $index).Version
|
||||
|
||||
# Detect image version to avoid performing MicroWin processing on Windows 8 and earlier
|
||||
if ((Test-CompatibleImage $imgVersion) -eq $false)
|
||||
if ((Test-CompatibleImage $imgVersion $([System.Version]::new(10,0,10240,0))) -eq $false)
|
||||
{
|
||||
$msg = "This image is not compatible with MicroWin processing. Make sure it isn't a Windows 8 or earlier image."
|
||||
$dlg_msg = $msg + "`n`nIf you want more information, the version of the image selected is $($imgVersion)`n`nIf an image has been incorrectly marked as incompatible, report an issue to the developers."
|
||||
@ -80,8 +101,57 @@ public class PowerManagement {
|
||||
try {
|
||||
|
||||
Write-Host "Mounting Windows image. This may take a while."
|
||||
dism /mount-image /imagefile:$mountDir\sources\install.wim /index:$index /mountdir:$scratchDir
|
||||
Write-Host "Mounting complete! Performing removal of applications..."
|
||||
Mount-WindowsImage -ImagePath "$mountDir\sources\install.wim" -Index $index -Path "$scratchDir"
|
||||
if ($?)
|
||||
{
|
||||
Write-Host "Mounting complete! Performing removal of applications..."
|
||||
}
|
||||
else
|
||||
{
|
||||
Write-Host "Could not mount image. Exiting..."
|
||||
return
|
||||
}
|
||||
|
||||
if ($importDrivers)
|
||||
{
|
||||
Write-Host "Exporting drivers from active installation..."
|
||||
if (Test-Path "$env:TEMP\DRV_EXPORT")
|
||||
{
|
||||
Remove-Item "$env:TEMP\DRV_EXPORT" -Recurse -Force
|
||||
}
|
||||
if (($injectDrivers -and (Test-Path $sync.MicrowinDriverLocation.Text)))
|
||||
{
|
||||
Write-Host "Using specified driver source..."
|
||||
dism /english /online /export-driver /destination="$($sync.MicrowinDriverLocation.Text)" | Out-Host
|
||||
if ($?)
|
||||
{
|
||||
# Don't add exported drivers yet, that is run later
|
||||
Write-Host "Drivers have been exported successfully."
|
||||
}
|
||||
else
|
||||
{
|
||||
Write-Host "Failed to export drivers."
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
New-Item -Path "$env:TEMP\DRV_EXPORT" -ItemType Directory -Force
|
||||
dism /english /online /export-driver /destination="$env:TEMP\DRV_EXPORT" | Out-Host
|
||||
if ($?)
|
||||
{
|
||||
Write-Host "Adding exported drivers..."
|
||||
dism /english /image="$scratchDir" /add-driver /driver="$env:TEMP\DRV_EXPORT" /recurse | Out-Host
|
||||
}
|
||||
else
|
||||
{
|
||||
Write-Host "Failed to export drivers. Continuing without importing them..."
|
||||
}
|
||||
if (Test-Path "$env:TEMP\DRV_EXPORT")
|
||||
{
|
||||
Remove-Item "$env:TEMP\DRV_EXPORT" -Recurse -Force
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($injectDrivers)
|
||||
{
|
||||
@ -174,26 +244,27 @@ public class PowerManagement {
|
||||
$desktopDir = "$($scratchDir)\Windows\Users\Default\Desktop"
|
||||
New-Item -ItemType Directory -Force -Path "$desktopDir"
|
||||
dism /English /image:$($scratchDir) /set-profilepath:"$($scratchDir)\Windows\Users\Default"
|
||||
$command = "powershell.exe -NoProfile -ExecutionPolicy Bypass -Command 'irm https://christitus.com/win | iex'"
|
||||
$shortcutPath = "$desktopDir\WinUtil.lnk"
|
||||
$shell = New-Object -ComObject WScript.Shell
|
||||
$shortcut = $shell.CreateShortcut($shortcutPath)
|
||||
|
||||
if (Test-Path -Path "$env:TEMP\cttlogo.png")
|
||||
{
|
||||
$pngPath = "$env:TEMP\cttlogo.png"
|
||||
$icoPath = "$env:TEMP\cttlogo.ico"
|
||||
ConvertTo-Icon -bitmapPath $pngPath -iconPath $icoPath
|
||||
Write-Host "ICO file created at: $icoPath"
|
||||
Copy-Item "$env:TEMP\cttlogo.png" "$($scratchDir)\Windows\cttlogo.png" -force
|
||||
Copy-Item "$env:TEMP\cttlogo.ico" "$($scratchDir)\Windows\cttlogo.ico" -force
|
||||
$shortcut.IconLocation = "c:\Windows\cttlogo.ico"
|
||||
}
|
||||
# $command = "powershell.exe -NoProfile -ExecutionPolicy Bypass -Command 'irm https://christitus.com/win | iex'"
|
||||
# $shortcutPath = "$desktopDir\WinUtil.lnk"
|
||||
# $shell = New-Object -ComObject WScript.Shell
|
||||
# $shortcut = $shell.CreateShortcut($shortcutPath)
|
||||
|
||||
$shortcut.TargetPath = "powershell.exe"
|
||||
$shortcut.Arguments = "-NoProfile -ExecutionPolicy Bypass -Command `"$command`""
|
||||
$shortcut.Save()
|
||||
Write-Host "Shortcut to winutil created at: $shortcutPath"
|
||||
# if (Test-Path -Path "$env:TEMP\cttlogo.png")
|
||||
# {
|
||||
# $pngPath = "$env:TEMP\cttlogo.png"
|
||||
# $icoPath = "$env:TEMP\cttlogo.ico"
|
||||
# ConvertTo-Icon -bitmapPath $pngPath -iconPath $icoPath
|
||||
# Write-Host "ICO file created at: $icoPath"
|
||||
# Copy-Item "$env:TEMP\cttlogo.png" "$($scratchDir)\Windows\cttlogo.png" -force
|
||||
# Copy-Item "$env:TEMP\cttlogo.ico" "$($scratchDir)\Windows\cttlogo.ico" -force
|
||||
# $shortcut.IconLocation = "c:\Windows\cttlogo.ico"
|
||||
# }
|
||||
|
||||
# $shortcut.TargetPath = "powershell.exe"
|
||||
# $shortcut.Arguments = "-NoProfile -ExecutionPolicy Bypass -Command `"$command`""
|
||||
# $shortcut.Save()
|
||||
# Write-Host "Shortcut to winutil created at: $shortcutPath"
|
||||
# *************************** Automation black ***************************
|
||||
|
||||
Write-Host "Copy checkinstall.cmd into the ISO"
|
||||
@ -279,13 +350,13 @@ public class PowerManagement {
|
||||
Write-Host "Cleanup complete."
|
||||
|
||||
Write-Host "Unmounting image..."
|
||||
dism /unmount-image /mountdir:$scratchDir /commit
|
||||
Dismount-WindowsImage -Path $scratchDir -Save
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
Write-Host "Exporting image into $mountDir\sources\install2.wim"
|
||||
dism /Export-Image /SourceImageFile:"$mountDir\sources\install.wim" /SourceIndex:$index /DestinationImageFile:"$mountDir\sources\install2.wim" /compress:max
|
||||
Export-WindowsImage -SourceImagePath "$mountDir\sources\install.wim" -SourceIndex $index -DestinationImagePath "$mountDir\sources\install2.wim" -CompressionType "Max"
|
||||
Write-Host "Remove old '$mountDir\sources\install.wim' and rename $mountDir\sources\install2.wim"
|
||||
Remove-Item "$mountDir\sources\install.wim"
|
||||
Rename-Item "$mountDir\sources\install2.wim" "$mountDir\sources\install.wim"
|
||||
@ -299,7 +370,7 @@ public class PowerManagement {
|
||||
|
||||
# Next step boot image
|
||||
Write-Host "Mounting boot image $mountDir\sources\boot.wim into $scratchDir"
|
||||
dism /mount-image /imagefile:"$mountDir\sources\boot.wim" /index:2 /mountdir:"$scratchDir"
|
||||
Mount-WindowsImage -ImagePath "$mountDir\sources\boot.wim" -Index 2 -Path "$scratchDir"
|
||||
|
||||
if ($injectDrivers)
|
||||
{
|
||||
@ -345,7 +416,7 @@ public class PowerManagement {
|
||||
reg unload HKLM\zSYSTEM
|
||||
|
||||
Write-Host "Unmounting image..."
|
||||
dism /unmount-image /mountdir:$scratchDir /commit
|
||||
Dismount-WindowsImage -Path $scratchDir -Save
|
||||
|
||||
Write-Host "Creating ISO image"
|
||||
|
||||
|
43
functions/public/Invoke-WPFOOSU.ps1
Normal file
43
functions/public/Invoke-WPFOOSU.ps1
Normal file
@ -0,0 +1,43 @@
|
||||
function Invoke-WPFOOSU {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Downloads and runs OO Shutup 10 with or without config files
|
||||
.PARAMETER action
|
||||
Specifies how OOSU should be started
|
||||
customize: Opens the OOSU GUI
|
||||
recommended: Loads and applies the recommended OOSU policies silently
|
||||
undo: Resets all policies to factory silently
|
||||
#>
|
||||
|
||||
param (
|
||||
[ValidateSet("customize", "recommended", "undo")]
|
||||
[string]$action
|
||||
)
|
||||
|
||||
$OOSU_filepath = "$ENV:temp\OOSU10.exe"
|
||||
|
||||
$Initial_ProgressPreference = $ProgressPreference
|
||||
$ProgressPreference = "SilentlyContinue" # Disables the Progress Bar to drasticly speed up Invoke-WebRequest
|
||||
Invoke-WebRequest -Uri "https://dl5.oo-software.com/files/ooshutup10/OOSU10.exe" -OutFile $OOSU_filepath
|
||||
|
||||
switch ($action)
|
||||
{
|
||||
"customize"{
|
||||
Write-Host "Starting OO Shutup 10 ..."
|
||||
Start-Process $OOSU_filepath
|
||||
}
|
||||
"recommended"{
|
||||
$oosu_config = "$ENV:temp\ooshutup10_recommended.cfg"
|
||||
$sync.configs.ooshutup10_recommended | Out-File -FilePath $oosu_config -Force
|
||||
Write-Host "Applying recommended OO Shutup 10 Policies"
|
||||
Start-Process $OOSU_filepath -ArgumentList "$oosu_config /quiet" -Wait
|
||||
}
|
||||
"undo"{
|
||||
$oosu_config = "$ENV:temp\ooshutup10_factory.cfg"
|
||||
$sync.configs.ooshutup10_factory | Out-File -FilePath $oosu_config -Force
|
||||
Write-Host "Resetting all OO Shutup 10 Policies"
|
||||
Start-Process $OOSU_filepath -ArgumentList "$oosu_config /quiet" -Wait
|
||||
}
|
||||
}
|
||||
$ProgressPreference = $Initial_ProgressPreference
|
||||
}
|
@ -11,18 +11,22 @@ function Invoke-WPFRunAdobeCCCleanerTool {
|
||||
Write-Host "The Adobe Creative Cloud Cleaner tool is hosted at"
|
||||
Write-Host "$url"
|
||||
|
||||
# Don't show the progress because it will slow down the download speed
|
||||
$ProgressPreference='SilentlyContinue'
|
||||
try {
|
||||
# Don't show the progress because it will slow down the download speed
|
||||
$ProgressPreference='SilentlyContinue'
|
||||
|
||||
Invoke-WebRequest -Uri $url -OutFile "$env:TEMP\AdobeCreativeCloudCleanerTool.exe" -UseBasicParsing -ErrorAction SilentlyContinue -Verbose
|
||||
Invoke-WebRequest -Uri $url -OutFile "$env:TEMP\AdobeCreativeCloudCleanerTool.exe" -UseBasicParsing -ErrorAction SilentlyContinue -Verbose
|
||||
|
||||
# Revert back the ProgressPreference variable to the default value since we got the file desired
|
||||
$ProgressPreference='Continue'
|
||||
# Revert back the ProgressPreference variable to the default value since we got the file desired
|
||||
$ProgressPreference='Continue'
|
||||
|
||||
Start-Process -FilePath "$env:TEMP\AdobeCreativeCloudCleanerTool.exe" -Wait -ErrorAction SilentlyContinue -Verbose
|
||||
|
||||
if (Test-Path -Path "$env:TEMP\AdobeCreativeCloudCleanerTool.exe") {
|
||||
Write-Host "Cleaning up..."
|
||||
Remove-Item -Path "$env:TEMP\AdobeCreativeCloudCleanerTool.exe" -Verbose
|
||||
Start-Process -FilePath "$env:TEMP\AdobeCreativeCloudCleanerTool.exe" -Wait -ErrorAction SilentlyContinue -Verbose
|
||||
} catch {
|
||||
Write-Error $_.Exception.Message
|
||||
} finally {
|
||||
if (Test-Path -Path "$env:TEMP\AdobeCreativeCloudCleanerTool.exe") {
|
||||
Write-Host "Cleaning up..."
|
||||
Remove-Item -Path "$env:TEMP\AdobeCreativeCloudCleanerTool.exe" -Verbose
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -8,30 +8,44 @@ function Invoke-WPFShortcut {
|
||||
.PARAMETER ShortcutToAdd
|
||||
The name of the shortcut to add
|
||||
|
||||
.PARAMETER RunAsAdmin
|
||||
A boolean value to make 'Run as administrator' property on (true) or off (false), defaults to off
|
||||
|
||||
#>
|
||||
param($ShortcutToAdd)
|
||||
param(
|
||||
$ShortcutToAdd,
|
||||
[bool]$RunAsAdmin = $false
|
||||
)
|
||||
|
||||
$iconPath = $null
|
||||
Switch ($ShortcutToAdd) {
|
||||
"WinUtil" {
|
||||
$SourceExe = "$env:SystemRoot\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"
|
||||
# Preper the Shortcut Fields and add an a Custom Icon if it's available at "$env:TEMP\cttlogo.png", else don't add a Custom Icon.
|
||||
$iconPath = $null
|
||||
Switch ($ShortcutToAdd) {
|
||||
"WinUtil" {
|
||||
$SourceExe = "$env:SystemRoot\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"
|
||||
|
||||
if (Test-Path -Path "$env:TEMP\cttlogo.png") {
|
||||
$iconPath = "$env:SystempRoot\cttlogo.ico"
|
||||
ConvertTo-Icon -bitmapPath "$env:TEMP\cttlogo.png" -iconPath $iconPath
|
||||
}
|
||||
if (Test-Path -Path "$env:TEMP\cttlogo.png") {
|
||||
$iconPath = "$env:SystempRoot\cttlogo.ico"
|
||||
ConvertTo-Icon -bitmapPath "$env:TEMP\cttlogo.png" -iconPath $iconPath
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Show a File Dialog Browser, to let the User choose the Name and Location of where to save the Shortcut
|
||||
$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
|
||||
|
||||
# Do an Early Return if The Save Shortcut operation was cancel by User's Input.
|
||||
$FileBrowserResult = $FileBrowser.ShowDialog()
|
||||
$DialogResultEnum = New-Object System.Windows.Forms.DialogResult
|
||||
if (-not ($FileBrowserResult -eq $DialogResultEnum::OK)) {
|
||||
return
|
||||
}
|
||||
|
||||
$WshShell = New-Object -comObject WScript.Shell
|
||||
$Shortcut = $WshShell.CreateShortcut($FileBrowser.FileName)
|
||||
@ -42,5 +56,12 @@ function Invoke-WPFShortcut {
|
||||
}
|
||||
$Shortcut.Save()
|
||||
|
||||
Write-Host "Shortcut for $ShortcutToAdd has been saved to $($FileBrowser.FileName)"
|
||||
}
|
||||
if ($RunAsAdmin -eq $true) {
|
||||
$bytes = [System.IO.File]::ReadAllBytes($FileBrowser.FileName)
|
||||
# Set byte value at position 0x15 in hex, or 21 in decimal, from the value 0x00 to 0x20 in hex
|
||||
$bytes[0x15] = $bytes[0x15] -bor 0x20
|
||||
[System.IO.File]::WriteAllBytes($FileBrowser.FileName, $bytes)
|
||||
}
|
||||
|
||||
Write-Host "Shortcut for $ShortcutToAdd has been saved to $($FileBrowser.FileName) with 'Run as administrator' set to $RunAsAdmin"
|
||||
}
|
||||
|
@ -22,8 +22,11 @@ function Invoke-WPFToggle {
|
||||
"WPFToggleNumLock" {Invoke-WinUtilNumLock $(Get-WinUtilToggleStatus WPFToggleNumLock)}
|
||||
"WPFToggleVerboseLogon" {Invoke-WinUtilVerboseLogon $(Get-WinUtilToggleStatus WPFToggleVerboseLogon)}
|
||||
"WPFToggleShowExt" {Invoke-WinUtilShowExt $(Get-WinUtilToggleStatus WPFToggleShowExt)}
|
||||
"WPFToggleSnapWindow" {Invoke-WinUtilSnapWindow $(Get-WinUtilToggleStatus WPFToggleSnapWindow)}
|
||||
"WPFToggleSnapFlyout" {Invoke-WinUtilSnapFlyout $(Get-WinUtilToggleStatus WPFToggleSnapFlyout)}
|
||||
"WPFToggleSnapSuggestion" {Invoke-WinUtilSnapSuggestion $(Get-WinUtilToggleStatus WPFToggleSnapSuggestion)}
|
||||
"WPFToggleMouseAcceleration" {Invoke-WinUtilMouseAcceleration $(Get-WinUtilToggleStatus WPFToggleMouseAcceleration)}
|
||||
"WPFToggleStickyKeys" {Invoke-WinUtilStickyKeys $(Get-WinUtilToggleStatus WPFToggleStickyKeys)}
|
||||
"WPFToggleTaskbarWidgets" {Invoke-WinUtilTaskbarWidgets $(Get-WinUtilToggleStatus WPFToggleTaskbarWidgets)}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
46
functions/public/Invoke-WPFTweakPS7.ps1
Normal file
46
functions/public/Invoke-WPFTweakPS7.ps1
Normal file
@ -0,0 +1,46 @@
|
||||
function Invoke-WPFTweakPS7{
|
||||
<#
|
||||
.SYNOPSIS
|
||||
This will edit the config file of the Windows Terminal Replacing the Powershell 5 to Powershell 7 and install Powershell 7 if necessary
|
||||
.PARAMETER action
|
||||
PS7: Configures Powershell 7 to be the default Terminal
|
||||
PS5: Configures Powershell 5 to be the default Terminal
|
||||
#>
|
||||
param (
|
||||
[ValidateSet("PS7", "PS5")]
|
||||
[string]$action
|
||||
)
|
||||
|
||||
switch ($action) {
|
||||
"PS7"{
|
||||
if (Test-Path -Path "$env:ProgramFiles\PowerShell\7") {
|
||||
Write-Host "Powershell 7 is already installed."
|
||||
} else {
|
||||
Write-Host "Installing Powershell 7..."
|
||||
Install-WinUtilProgramWinget -ProgramsToInstall @(@{"winget"="Microsoft.PowerShell"})
|
||||
}
|
||||
$targetTerminalName = "PowerShell"
|
||||
}
|
||||
"PS5"{
|
||||
$targetTerminalName = "Windows PowerShell"
|
||||
}
|
||||
}
|
||||
|
||||
$settingsPath = "$env:LOCALAPPDATA\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json"
|
||||
if (Test-Path -Path $settingsPath) {
|
||||
Write-Host "Settings file found."
|
||||
$settingsContent = Get-Content -Path $settingsPath | ConvertFrom-Json
|
||||
$ps7Profile = $settingsContent.profiles.list | Where-Object { $_.name -eq $targetTerminalName }
|
||||
if ($ps7Profile) {
|
||||
$settingsContent.defaultProfile = $ps7Profile.guid
|
||||
$updatedSettings = $settingsContent | ConvertTo-Json -Depth 100
|
||||
Set-Content -Path $settingsPath -Value $updatedSettings
|
||||
Write-Host "Default profile updated to $targetTerminalName using the name attribute."
|
||||
} else {
|
||||
Write-Host "No PowerShell 7 profile found in Windows Terminal settings using the name attribute."
|
||||
}
|
||||
} else {
|
||||
Write-Host "Settings file not found at $settingsPath"
|
||||
}
|
||||
}
|
||||
|
@ -12,9 +12,9 @@ function Invoke-WPFUnInstall {
|
||||
return
|
||||
}
|
||||
|
||||
$WingetInstall = (Get-WinUtilCheckBoxes)["Install"]
|
||||
$PackagesToInstall = (Get-WinUtilCheckBoxes)["Install"]
|
||||
|
||||
if ($wingetinstall.Count -eq 0) {
|
||||
if ($PackagesToInstall.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
|
||||
@ -22,21 +22,39 @@ function Invoke-WPFUnInstall {
|
||||
|
||||
$ButtonType = [System.Windows.MessageBoxButton]::YesNo
|
||||
$MessageboxTitle = "Are you sure?"
|
||||
$Messageboxbody = ("This will uninstall the following applications: `n $WingetInstall")
|
||||
$Messageboxbody = ("This will uninstall the following applications: `n $($PackagesToInstall | Format-Table | Out-String)")
|
||||
$MessageIcon = [System.Windows.MessageBoxImage]::Information
|
||||
|
||||
$confirm = [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)
|
||||
|
||||
if($confirm -eq "No"){return}
|
||||
|
||||
Invoke-WPFRunspace -ArgumentList $WingetInstall -DebugPreference $DebugPreference -ScriptBlock {
|
||||
param($WingetInstall, $DebugPreference)
|
||||
|
||||
Invoke-WPFRunspace -ArgumentList $PackagesToInstall -DebugPreference $DebugPreference -ScriptBlock {
|
||||
param($PackagesToInstall, $DebugPreference)
|
||||
$packagesWinget, $packagesChoco = {
|
||||
$packagesWinget = [System.Collections.Generic.List`1[System.Object]]::new()
|
||||
$packagesChoco = [System.Collections.Generic.List`1[System.Object]]::new()
|
||||
foreach ($package in $PackagesToInstall) {
|
||||
if ($package.winget -eq "na") {
|
||||
$packagesChoco.add($package)
|
||||
Write-Host "Queueing $($package.choco) for Chocolatey Uninstall"
|
||||
} else {
|
||||
$packagesWinget.add($package)
|
||||
Write-Host "Queueing $($package.winget) for Winget Uninstall"
|
||||
}
|
||||
}
|
||||
return $packagesWinget, $packagesChoco
|
||||
}.Invoke($PackagesToInstall)
|
||||
try{
|
||||
$sync.ProcessRunning = $true
|
||||
|
||||
# Install all selected programs in new window
|
||||
Install-WinUtilProgramWinget -ProgramsToInstall $WingetInstall -Manage "Uninstalling"
|
||||
if($packagesWinget.Count -gt 0){
|
||||
Install-WinUtilProgramWinget -ProgramsToInstall $packagesWinget -Manage "Uninstalling"
|
||||
}
|
||||
if($packagesChoco.Count -gt 0){
|
||||
Install-WinUtilProgramChoco -ProgramsToInstall $packagesChoco -Manage "Uninstalling"
|
||||
}
|
||||
|
||||
$ButtonType = [System.Windows.MessageBoxButton]::OK
|
||||
$MessageboxTitle = "Uninstalls are Finished "
|
||||
@ -51,7 +69,7 @@ function Invoke-WPFUnInstall {
|
||||
}
|
||||
Catch {
|
||||
Write-Host "==========================================="
|
||||
Write-Host "-- Winget failed to install ---"
|
||||
Write-Host "Error: $_"
|
||||
Write-Host "==========================================="
|
||||
}
|
||||
$sync.ProcessRunning = $False
|
||||
|
@ -1,44 +1,55 @@
|
||||
#===========================================================================
|
||||
# Tests - Functions
|
||||
#===========================================================================
|
||||
|
||||
# Get all .ps1 files in the functions folder
|
||||
$ps1Files = Get-ChildItem -Path ./functions -Filter *.ps1
|
||||
|
||||
# Loop through each file
|
||||
foreach ($file in $ps1Files) {
|
||||
# Define the test name
|
||||
$testName = "Syntax check for $($file.Name)"
|
||||
|
||||
# Define the test script
|
||||
$testScript = {
|
||||
# Import the script
|
||||
. $file.FullName
|
||||
|
||||
# Check if any errors occurred
|
||||
$scriptError = $error[0]
|
||||
$scriptError | Should -Be $null
|
||||
Describe "Comprehensive Checks for PS1 Files in Functions Folder" {
|
||||
BeforeAll {
|
||||
# Get all .ps1 files in the functions folder
|
||||
$ps1Files = Get-ChildItem -Path ./functions -Filter *.ps1 -Recurse
|
||||
}
|
||||
|
||||
# Add the test to the Pester test suite
|
||||
Describe $testName $testScript
|
||||
}
|
||||
|
||||
Describe "Functions"{
|
||||
|
||||
Get-ChildItem .\functions -Recurse -File | ForEach-Object {
|
||||
|
||||
context "$($psitem.BaseName)" {
|
||||
BeforeEach -Scriptblock {
|
||||
. $psitem.FullName
|
||||
foreach ($file in $ps1Files) {
|
||||
Context "Checking $($file.Name)" {
|
||||
It "Should import without errors" {
|
||||
{ . $file.FullName } | Should -Not -Throw
|
||||
}
|
||||
|
||||
It "Imports with no errors" -TestCases @{
|
||||
basename = $($psitem.BaseName)
|
||||
fullname = $psitem.FullName
|
||||
} {
|
||||
Get-ChildItem function:\$basename | should -Not -BeNullOrEmpty
|
||||
}
|
||||
It "Should have no syntax errors" {
|
||||
$syntaxErrors = $null
|
||||
$null = [System.Management.Automation.PSParser]::Tokenize((Get-Content -Path $file.FullName -Raw), [ref]$syntaxErrors)
|
||||
$syntaxErrors.Count | Should -Be 0
|
||||
}
|
||||
|
||||
It "Should not use deprecated cmdlets or aliases" {
|
||||
$content = Get-Content -Path $file.FullName -Raw
|
||||
# Example check for a known deprecated cmdlet or alias
|
||||
$content | Should -Not -Match 'DeprecatedCmdlet'
|
||||
# Add more checks as needed
|
||||
}
|
||||
|
||||
It "Should follow naming conventions for functions" {
|
||||
$functions = (Get-Command -Path $file.FullName).Name
|
||||
foreach ($function in $functions) {
|
||||
$function | Should -Match '^[a-z]+(-[a-z]+)*$' # Enforce lower-kebab-case
|
||||
}
|
||||
}
|
||||
|
||||
It "Should define mandatory parameters for all functions" {
|
||||
. $file.FullName
|
||||
$functions = (Get-Command -Path $file.FullName).Name
|
||||
foreach ($function in $functions) {
|
||||
$parameters = (Get-Command -Name $function).Parameters.Values
|
||||
$mandatoryParams = $parameters | Where-Object { $_.Attributes.Mandatory -eq $true }
|
||||
$mandatoryParams.Count | Should -BeGreaterThan 0
|
||||
}
|
||||
}
|
||||
|
||||
It "Should have all functions available after import" {
|
||||
. $file.FullName
|
||||
$functions = (Get-Command -Path $file.FullName).Name
|
||||
foreach ($function in $functions) {
|
||||
{ Get-Command -Name $function -CommandType Function } | Should -Not -BeNullOrEmpty
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
168
scripts/main.ps1
168
scripts/main.ps1
@ -52,125 +52,13 @@ $sync.runspace.Open()
|
||||
|
||||
$inputXML = $inputXML -replace 'mc:Ignorable="d"', '' -replace "x:N", 'N' -replace '^<Win.*', '<Window'
|
||||
|
||||
function Get-TabXaml {
|
||||
param( [Parameter(Mandatory=$true)]
|
||||
$tabname,
|
||||
$columncount = 0
|
||||
)
|
||||
$organizedData = @{}
|
||||
# Iterate through JSON data and organize by panel and category
|
||||
foreach ($appName in $sync.configs.$tabname.PSObject.Properties.Name) {
|
||||
$appInfo = $sync.configs.$tabname.$appName
|
||||
|
||||
# Create an object for the application
|
||||
$appObject = [PSCustomObject]@{
|
||||
Name = $appName
|
||||
Category = $appInfo.Category
|
||||
Content = $appInfo.Content
|
||||
Choco = $appInfo.choco
|
||||
Winget = $appInfo.winget
|
||||
Panel = if ($columncount -gt 0 ) { "0" } else {$appInfo.panel}
|
||||
Link = $appInfo.link
|
||||
Description = $appInfo.description
|
||||
# Type is (Checkbox,Toggle,Button,Combobox ) (Default is Checkbox)
|
||||
Type = $appInfo.type
|
||||
ComboItems = $appInfo.ComboItems
|
||||
# Checked is the property to set startup checked status of checkbox (Default is false)
|
||||
Checked = $appInfo.Checked
|
||||
}
|
||||
|
||||
if (-not $organizedData.ContainsKey($appObject.panel)) {
|
||||
$organizedData[$appObject.panel] = @{}
|
||||
}
|
||||
|
||||
if (-not $organizedData[$appObject.panel].ContainsKey($appObject.Category)) {
|
||||
$organizedData[$appObject.panel][$appObject.Category] = @{}
|
||||
}
|
||||
|
||||
# Store application data in a sub-array under the category
|
||||
# Add Order property to keep the original order of tweaks and features
|
||||
$organizedData[$appObject.panel][$appInfo.Category]["$($appInfo.order)$appName"] = $appObject
|
||||
}
|
||||
$panelcount=0
|
||||
$paneltotal = $organizedData.Keys.Count
|
||||
if ($columncount -gt 0) {
|
||||
$appcount = $sync.configs.$tabname.PSObject.Properties.Name.count + $organizedData["0"].Keys.count
|
||||
$maxcount = [Math]::Round( $appcount / $columncount + 0.5)
|
||||
$paneltotal = $columncount
|
||||
}
|
||||
# add ColumnDefinitions to evenly draw colums
|
||||
$blockXml="<Grid.ColumnDefinitions>`n"+("<ColumnDefinition Width=""*""/>`n"*($paneltotal))+"</Grid.ColumnDefinitions>`n"
|
||||
# Iterate through organizedData by panel, category, and application
|
||||
$count = 0
|
||||
foreach ($panel in ($organizedData.Keys | Sort-Object)) {
|
||||
$blockXml += "<Border Grid.Row=""1"" Grid.Column=""$panelcount"">`n<StackPanel Background=""{MainBackgroundColor}"" SnapsToDevicePixels=""True"">`n"
|
||||
$panelcount++
|
||||
foreach ($category in ($organizedData[$panel].Keys | Sort-Object)) {
|
||||
$count++
|
||||
if ($columncount -gt 0) {
|
||||
$panelcount2 = [Int](($count)/$maxcount-0.5)
|
||||
if ($panelcount -eq $panelcount2 ) {
|
||||
$blockXml +="`n</StackPanel>`n</Border>`n"
|
||||
$blockXml += "<Border Grid.Row=""1"" Grid.Column=""$panelcount"">`n<StackPanel Background=""{MainBackgroundColor}"" SnapsToDevicePixels=""True"">`n"
|
||||
$panelcount++
|
||||
}
|
||||
}
|
||||
$blockXml += "<Label Content=""$($category -replace '^.__', '')"" FontSize=""16""/>`n"
|
||||
$sortedApps = $organizedData[$panel][$category].Keys | Sort-Object
|
||||
foreach ($appName in $sortedApps) {
|
||||
$count++
|
||||
if ($columncount -gt 0) {
|
||||
$panelcount2 = [Int](($count)/$maxcount-0.5)
|
||||
if ($panelcount -eq $panelcount2 ) {
|
||||
$blockXml +="`n</StackPanel>`n</Border>`n"
|
||||
$blockXml += "<Border Grid.Row=""1"" Grid.Column=""$panelcount"">`n<StackPanel Background=""{MainBackgroundColor}"" SnapsToDevicePixels=""True"">`n"
|
||||
$panelcount++
|
||||
}
|
||||
}
|
||||
$appInfo = $organizedData[$panel][$category][$appName]
|
||||
if ("Toggle" -eq $appInfo.Type) {
|
||||
$blockXml += "<StackPanel Orientation=`"Horizontal`" Margin=`"0,10,0,0`">`n<Label Content=`"$($appInfo.Content)`" Style=`"{StaticResource labelfortweaks}`" ToolTip=`"$($appInfo.Description)`" />`n"
|
||||
$blockXml += "<CheckBox Name=`"$($appInfo.Name)`" Style=`"{StaticResource ColorfulToggleSwitchStyle}`" Margin=`"2.5,0`"/>`n</StackPanel>`n"
|
||||
} elseif ("Combobox" -eq $appInfo.Type) {
|
||||
$blockXml += "<StackPanel Orientation=`"Horizontal`" Margin=`"0,5,0,0`">`n<Label Content=`"$($appInfo.Content)`" HorizontalAlignment=`"Left`" VerticalAlignment=`"Center`"/>`n"
|
||||
$blockXml += "<ComboBox Name=`"$($appInfo.Name)`" Height=`"32`" Width=`"186`" HorizontalAlignment=`"Left`" VerticalAlignment=`"Center`" Margin=`"5,5`">`n"
|
||||
$addfirst="IsSelected=`"True`""
|
||||
foreach ($comboitem in ($appInfo.ComboItems -split " ")) {
|
||||
$blockXml += "<ComboBoxItem $addfirst Content=`"$comboitem`"/>`n"
|
||||
$addfirst=""
|
||||
}
|
||||
$blockXml += "</ComboBox>`n</StackPanel>"
|
||||
# If it is a digit, type is button and button length is digits
|
||||
} elseif ($appInfo.Type -match "^[\d\.]+$") {
|
||||
$blockXml += "<Button Name=`"$($appInfo.Name)`" Content=`"$($appInfo.Content)`" HorizontalAlignment = `"Left`" Width=`"$($appInfo.Type)`" Margin=`"5`" Padding=`"20,5`" />`n"
|
||||
# else it is a checkbox
|
||||
} else {
|
||||
$checkedStatus = If ($null -eq $appInfo.Checked) {""} Else {"IsChecked=`"$($appInfo.Checked)`" "}
|
||||
if ($null -eq $appInfo.Link)
|
||||
{
|
||||
$blockXml += "<CheckBox Name=`"$($appInfo.Name)`" Content=`"$($appInfo.Content)`" $($checkedStatus)Margin=`"5,0`" ToolTip=`"$($appInfo.Description)`"/>`n"
|
||||
}
|
||||
else
|
||||
{
|
||||
$blockXml += "<StackPanel Orientation=""Horizontal"">`n<CheckBox Name=""$($appInfo.Name)"" Content=""$($appInfo.Content)"" $($checkedStatus)ToolTip=""$($appInfo.Description)"" Margin=""0,0,2,0""/><TextBlock Name=""$($appInfo.Name)Link"" Style=""{StaticResource HoverTextBlockStyle}"" Text=""(?)"" ToolTip=""$($appInfo.Link)"" />`n</StackPanel>`n"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$blockXml +="`n</StackPanel>`n</Border>`n"
|
||||
}
|
||||
return ($blockXml)
|
||||
}
|
||||
|
||||
$tabcolums=Get-TabXaml "applications" 5
|
||||
$inputXML = $inputXML -replace "{{InstallPanel_applications}}", ($tabcolums)
|
||||
$tabcolums=Get-TabXaml "tweaks"
|
||||
$inputXML = $inputXML -replace "{{InstallPanel_tweaks}}", ($tabcolums)
|
||||
$tabcolums=Get-TabXaml "feature"
|
||||
$inputXML = $inputXML -replace "{{InstallPanel_features}}", ($tabcolums)
|
||||
|
||||
if ((Get-WinUtilToggleStatus WPFToggleDarkMode) -eq $True) {
|
||||
$ctttheme = 'Matrix'
|
||||
if (Invoke-WinUtilGPU -eq $True) {
|
||||
$ctttheme = 'Matrix'
|
||||
}
|
||||
else {
|
||||
$ctttheme = 'Dark'
|
||||
}
|
||||
}
|
||||
else {
|
||||
$ctttheme = 'Classic'
|
||||
@ -257,8 +145,8 @@ Invoke-WPFRunspace -ScriptBlock {
|
||||
# Print the logo
|
||||
Invoke-WPFFormVariables
|
||||
|
||||
# Check if Chocolatey is installed
|
||||
Install-WinUtilChoco
|
||||
# Install Winget if not already present
|
||||
Install-WinUtilWinget
|
||||
|
||||
# Set the titlebar
|
||||
$sync["Form"].title = $sync["Form"].title + " " + $sync.version
|
||||
@ -383,10 +271,14 @@ Add-Type @"
|
||||
"@
|
||||
}
|
||||
|
||||
foreach ($proc in (Get-Process | Where-Object { $_.MainWindowTitle -and $_.MainWindowTitle -like "*titus*" })) {
|
||||
if ($proc.Id -ne [System.IntPtr]::Zero) {
|
||||
foreach ($proc in (Get-Process | Where-Object { $_.MainWindowTitle -and $_.MainWindowTitle -like "*titus*" })) {
|
||||
# Check if the process's MainWindowHandle is valid
|
||||
if ($proc.MainWindowHandle -ne [System.IntPtr]::Zero) {
|
||||
Write-Debug "MainWindowHandle: $($proc.Id) $($proc.MainWindowTitle) $($proc.MainWindowHandle)"
|
||||
$windowHandle = $proc.MainWindowHandle
|
||||
} else {
|
||||
Write-Warning "Process found, but no MainWindowHandle: $($proc.Id) $($proc.MainWindowTitle)"
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -475,6 +367,16 @@ Add-Type @"
|
||||
|
||||
})
|
||||
|
||||
# Load Checkboxes and Labels outside of the Filter fuction only once on startup for performance reasons
|
||||
$filter = Get-WinUtilVariables -Type CheckBox
|
||||
$CheckBoxes = $sync.GetEnumerator() | Where-Object { $psitem.Key -in $filter }
|
||||
|
||||
$filter = Get-WinUtilVariables -Type Label
|
||||
$labels = @{}
|
||||
$sync.GetEnumerator() | Where-Object {$PSItem.Key -in $filter} | ForEach-Object {$labels[$_.Key] = $_.Value}
|
||||
|
||||
$allCategories = $checkBoxes.Name | ForEach-Object {$sync.configs.applications.$_} | Select-Object -Unique -ExpandProperty category
|
||||
|
||||
$sync["CheckboxFilter"].Add_TextChanged({
|
||||
|
||||
if ($sync.CheckboxFilter.Text -ne "") {
|
||||
@ -484,8 +386,7 @@ $sync["CheckboxFilter"].Add_TextChanged({
|
||||
$sync.CheckboxFilterClear.Visibility = "Collapsed"
|
||||
}
|
||||
|
||||
$filter = Get-WinUtilVariables -Type CheckBox
|
||||
$CheckBoxes = $sync.GetEnumerator() | Where-Object { $psitem.Key -in $filter }
|
||||
$activeApplications = @()
|
||||
|
||||
foreach ($CheckBox in $CheckBoxes) {
|
||||
# Check if the checkbox is null or if it doesn't have content
|
||||
@ -493,7 +394,7 @@ $sync["CheckboxFilter"].Add_TextChanged({
|
||||
continue
|
||||
}
|
||||
|
||||
$textToSearch = $sync.CheckboxFilter.Text
|
||||
$textToSearch = $sync.CheckboxFilter.Text.ToLower()
|
||||
$checkBoxName = $CheckBox.Key
|
||||
$textBlockName = $checkBoxName + "Link"
|
||||
|
||||
@ -502,6 +403,7 @@ $sync["CheckboxFilter"].Add_TextChanged({
|
||||
|
||||
if ($CheckBox.Value.Content.ToLower().Contains($textToSearch)) {
|
||||
$CheckBox.Value.Visibility = "Visible"
|
||||
$activeApplications += $sync.configs.applications.$checkboxName
|
||||
# Set the corresponding text block visibility
|
||||
if ($textBlock -ne $null) {
|
||||
$textBlock.Visibility = "Visible"
|
||||
@ -515,7 +417,21 @@ $sync["CheckboxFilter"].Add_TextChanged({
|
||||
}
|
||||
}
|
||||
}
|
||||
$activeCategories = $activeApplications | Select-Object -ExpandProperty category -Unique
|
||||
|
||||
foreach ($category in $activeCategories){
|
||||
$label = $labels[$(Get-WPFObjectName -type "Label" -name $category)]
|
||||
$label.Visibility = "Visible"
|
||||
}
|
||||
if ($activeCategories){
|
||||
$inactiveCategories = Compare-Object -ReferenceObject $allCategories -DifferenceObject $activeCategories -PassThru
|
||||
}
|
||||
else{
|
||||
$inactiveCategories = $allCategories
|
||||
}
|
||||
foreach ($category in $inactiveCategories){
|
||||
$label = $labels[$(Get-WPFObjectName -type "Label" -name $category)]
|
||||
$label.Visibility = "Collapsed"}
|
||||
})
|
||||
|
||||
# Define event handler for button click
|
||||
@ -564,4 +480,4 @@ Version : $($sync.version)
|
||||
})
|
||||
|
||||
$sync["Form"].ShowDialog() | out-null
|
||||
Stop-Transcript
|
||||
Stop-Transcript
|
||||
|
@ -44,21 +44,16 @@ $sync.version = "#{replaceme}"
|
||||
$sync.configs = @{}
|
||||
$sync.ProcessRunning = $false
|
||||
|
||||
$currentPid = [System.Security.Principal.WindowsIdentity]::GetCurrent()
|
||||
$principal = new-object System.Security.Principal.WindowsPrincipal($currentPid)
|
||||
$adminRole=[System.Security.Principal.WindowsBuiltInRole]::Administrator
|
||||
|
||||
|
||||
if ($principal.IsInRole($adminRole))
|
||||
# If script isn't running as admin, show error message and quit
|
||||
If (([Security.Principal.WindowsIdentity]::GetCurrent()).Owner.Value -ne "S-1-5-32-544")
|
||||
{
|
||||
$Host.UI.RawUI.WindowTitle = $myInvocation.MyCommand.Definition + "(Admin)"
|
||||
clear-host
|
||||
}
|
||||
else
|
||||
{
|
||||
$newProcess = new-object System.Diagnostics.ProcessStartInfo "PowerShell";
|
||||
$newProcess.Arguments = $myInvocation.MyCommand.Definition;
|
||||
$newProcess.Verb = "runas";
|
||||
[System.Diagnostics.Process]::Start($newProcess);
|
||||
Write-Host "===========================================" -Foregroundcolor Red
|
||||
Write-Host "-- Scripts must be run as Administrator ---" -Foregroundcolor Red
|
||||
Write-Host "-- Right-Click Start -> Terminal(Admin) ---" -Foregroundcolor Red
|
||||
Write-Host "===========================================" -Foregroundcolor Red
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
# Set PowerShell window title
|
||||
$Host.UI.RawUI.WindowTitle = $myInvocation.MyCommand.Definition + "(Admin)"
|
||||
clear-host
|
||||
|
@ -1,5 +1,5 @@
|
||||
# Battery drains too fast.
|
||||
When your battery on teh laptop drains too fast please perform these steps and report the results back to Winutil community.
|
||||
When your battery on the laptop drains too fast, please perform these steps and report the results back to the Winutil community.
|
||||
|
||||
1. **Check Battery Health:**
|
||||
- Open a Command Prompt as an administrator.
|
||||
@ -80,4 +80,4 @@ When your battery on teh laptop drains too fast please perform these steps and r
|
||||
- Check settings/preferences of individual applications for power-related options.
|
||||
- Uninstall unnecessary or problematic software.
|
||||
|
||||
By following these detailed instructions, you should be able to thoroughly diagnose and address battery drain issues on your Windows laptop. Adjust settings as needed to optimize power management and improve battery life.
|
||||
By following these detailed instructions, you should be able to thoroughly diagnose and address battery drain issues on your Windows laptop. Adjust settings as needed to optimize power management and improve battery life.
|
||||
|
@ -21,7 +21,7 @@ This error code typically indicates an issue related to Windows Management Instr
|
||||
- Press `Win + R` to open the Run dialog.
|
||||
- Type `services.msc` and press Enter.
|
||||
- Locate "Windows Management Instrumentation" in the list.
|
||||
- Make sure its status is set to "Running" and the startup type is set to "Automatic."
|
||||
- Make sure to set its status to "Running" and the startup type to "Automatic."
|
||||
|
||||
5. **Check for Security Software Interference:**
|
||||
Security software can sometimes interfere with WMI operations. Temporarily disable your antivirus or security software and check if the issue persists.
|
||||
@ -31,9 +31,9 @@ This error code typically indicates an issue related to Windows Management Instr
|
||||
|
||||
- Press `Win + X` and select "Event Viewer."
|
||||
- Navigate to "Windows Logs" -> "Application" or "System."
|
||||
- Look for entries with the source related to WMI or the application you're using to mount the ISO.
|
||||
- Look for entries with the source related to WMI or the application use to mount the ISO.
|
||||
|
||||
7. **ISO File Integrity:**
|
||||
Ensure that the ISO file you are trying to mount is not corrupted. Try mounting a different ISO file to see if the issue persists.
|
||||
Ensure that the ISO file you are trying to mount is uncorrupted. Try mounting a different ISO file to see if the issue persists.
|
||||
|
||||
If the problem persists after trying these steps, additional troubleshooting may be required. Consider seeking assistance from Microsoft support or community forums for more specific guidance based on your system configuration and the software you are using to mount the ISO.
|
||||
If the problem persists after trying these steps, additional troubleshooting is required. Consider seeking assistance from Microsoft support or community forums for more specific guidance based on your system configuration and the software you use to mount the ISO.
|
@ -922,4 +922,4 @@ try {
|
||||
}
|
||||
Write-Warning "Error: $($_.Exception.Message)`n"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
11606
winutil.ps1
11606
winutil.ps1
File diff suppressed because it is too large
Load Diff
@ -7,6 +7,7 @@
|
||||
mc:Ignorable="d"
|
||||
Background="{MainBackgroundColor}"
|
||||
WindowStartupLocation="CenterScreen"
|
||||
UseLayoutRounding="True"
|
||||
WindowStyle="None"
|
||||
Title="Chris Titus Tech's Windows Utility" Height="800" Width="1280">
|
||||
<WindowChrome.WindowChrome>
|
||||
@ -294,7 +295,7 @@
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="CheckBox">
|
||||
<Grid Background="{TemplateBinding Background}">
|
||||
<Grid Background="{TemplateBinding Background}" Margin="6,0,0,0">
|
||||
<BulletDecorator Background="Transparent">
|
||||
<BulletDecorator.Bullet>
|
||||
<Grid Width="16" Height="16">
|
||||
@ -402,86 +403,93 @@
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<Style x:Key="ColorfulToggleSwitchStyle" TargetType="{x:Type CheckBox}">
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="{x:Type ToggleButton}">
|
||||
<Grid x:Name="toggleSwitch">
|
||||
<Border x:Name="Border" CornerRadius="10"
|
||||
Background="#FFFFFFFF"
|
||||
Width="70" Height="25">
|
||||
<Border.Effect>
|
||||
<DropShadowEffect ShadowDepth="0.5" Direction="0" Opacity="0.3" />
|
||||
</Border.Effect>
|
||||
<Ellipse x:Name="Ellipse" Fill="#FFFFFFFF" Stretch="Uniform"
|
||||
Margin="2 2 2 1"
|
||||
Stroke="Gray" StrokeThickness="0.2"
|
||||
HorizontalAlignment="Left" Width="22">
|
||||
<Ellipse.Effect>
|
||||
<DropShadowEffect BlurRadius="10" ShadowDepth="1" Opacity="0.3" Direction="260" />
|
||||
</Ellipse.Effect>
|
||||
</Ellipse>
|
||||
</Border>
|
||||
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Grid.Column="0" x:Name="txtToggle" VerticalAlignment="Center" FontWeight="DemiBold" Foreground="{MainForegroundColor}" FontSize="12">
|
||||
<TextBlock.Style>
|
||||
<Style TargetType="TextBlock">
|
||||
<Setter Property="Text" Value="Off"/>
|
||||
<Setter Property="Margin" Value="4,0,4,0"/>
|
||||
<Style.Triggers>
|
||||
<DataTrigger Binding="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsChecked}" Value="True">
|
||||
<Setter Property="Text" Value="On"/>
|
||||
</DataTrigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
</TextBlock.Style>
|
||||
</TextBlock>
|
||||
|
||||
<TextBlock x:Name="txtDisable" Text="Disable " VerticalAlignment="Center" FontWeight="DemiBold" HorizontalAlignment="Right" Foreground="White" FontSize="12" />
|
||||
<TextBlock x:Name="txtEnable" Text=" Enable" VerticalAlignment="Center" FontWeight="DemiBold" Foreground="White" HorizontalAlignment="Left" FontSize="12" />
|
||||
<Border Grid.Column="1" x:Name="Border" CornerRadius="8"
|
||||
BorderThickness="1"
|
||||
Width="34" Height="17">
|
||||
<Ellipse x:Name="Ellipse" Fill="{MainForegroundColor}" Stretch="Uniform"
|
||||
Margin="2,2,2,1"
|
||||
HorizontalAlignment="Left" Width="12">
|
||||
</Ellipse>
|
||||
</Border>
|
||||
</Grid>
|
||||
|
||||
<ControlTemplate.Triggers>
|
||||
<Trigger Property="ToggleButton.IsChecked" Value="False">
|
||||
<Setter TargetName="Border" Property="Background" Value="#C2283B" />
|
||||
<Setter TargetName="Ellipse" Property="Margin" Value="2 2 2 1" />
|
||||
<Setter TargetName="txtDisable" Property="Opacity" Value="1.0" />
|
||||
<Setter TargetName="txtEnable" Property="Opacity" Value="0.0" />
|
||||
<Trigger Property="IsMouseOver" Value="True">
|
||||
<Setter TargetName="Border" Property="BorderBrush" Value="{MainForegroundColor}" />
|
||||
<Setter TargetName="Border" Property="Background" Value="{LinkHoverForegroundColor}"/>
|
||||
<Setter Property="Cursor" Value="Hand" />
|
||||
<Setter Property="Panel.ZIndex" Value="1000"/>
|
||||
</Trigger>
|
||||
<Trigger Property="ToggleButton.IsChecked" Value="False">
|
||||
<Setter TargetName="Border" Property="Background" Value="{MainBackgroundColor}" />
|
||||
<Setter TargetName="Border" Property="BorderBrush" Value="{MainForegroundColor}" />
|
||||
<Setter TargetName="Ellipse" Property="Fill" Value="{MainForegroundColor}" />
|
||||
|
||||
</Trigger>
|
||||
|
||||
<Trigger Property="ToggleButton.IsChecked" Value="True">
|
||||
<Setter TargetName="Border" Property="Background" Value="{MainBackgroundColor}" />
|
||||
<Setter TargetName="Border" Property="BorderBrush" Value="{MainForegroundColor}" />
|
||||
<Setter TargetName="Ellipse" Property="Fill" Value="{MainForegroundColor}" />
|
||||
|
||||
<Trigger.EnterActions>
|
||||
<BeginStoryboard>
|
||||
<Storyboard>
|
||||
<ColorAnimation Storyboard.TargetName="Border"
|
||||
Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)"
|
||||
To="#34A543" Duration="0:0:0.1" />
|
||||
To="{ToggleButtonOnColor}" Duration="0:0:0.1" />
|
||||
<ColorAnimation Storyboard.TargetName="Border"
|
||||
Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)"
|
||||
To="{ToggleButtonOnColor}" Duration="0:0:0.1" />
|
||||
|
||||
<ColorAnimation Storyboard.TargetName="Ellipse"
|
||||
Storyboard.TargetProperty="(Fill).(SolidColorBrush.Color)"
|
||||
To="White" Duration="0:0:0.1" />
|
||||
<ThicknessAnimation Storyboard.TargetName="Ellipse"
|
||||
Storyboard.TargetProperty="Margin"
|
||||
To="46 2 2 1" Duration="0:0:0.1" />
|
||||
|
||||
<DoubleAnimation Storyboard.TargetName="txtDisable"
|
||||
Storyboard.TargetProperty="(TextBlock.Opacity)"
|
||||
To="0.0" Duration="0:0:0:0.1" />
|
||||
|
||||
<DoubleAnimation Storyboard.TargetName="txtEnable"
|
||||
Storyboard.TargetProperty="(TextBlock.Opacity)"
|
||||
To="1.0" Duration="0:0:0:0.1" />
|
||||
To="18,2,2,2" Duration="0:0:0.1" />
|
||||
</Storyboard>
|
||||
</BeginStoryboard>
|
||||
</Trigger.EnterActions>
|
||||
|
||||
<!-- Some out fading -->
|
||||
<Trigger.ExitActions>
|
||||
<BeginStoryboard>
|
||||
<Storyboard>
|
||||
<ColorAnimation Storyboard.TargetName="Border"
|
||||
Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)"
|
||||
To="#C2283B" Duration="0:0:0.1" />
|
||||
To="{MainBackgroundColor}" Duration="0:0:0.1" />
|
||||
|
||||
<ThicknessAnimation Storyboard.TargetName="Ellipse"
|
||||
Storyboard.TargetProperty="Margin"
|
||||
To="2 2 2 1" Duration="0:0:0.1" />
|
||||
To="2,2,2,1" Duration="0:0:0.1" />
|
||||
|
||||
<DoubleAnimation Storyboard.TargetName="txtDisable"
|
||||
Storyboard.TargetProperty="(TextBlock.Opacity)"
|
||||
To="1.0" Duration="0:0:0:0.1" />
|
||||
|
||||
<DoubleAnimation Storyboard.TargetName="txtEnable"
|
||||
Storyboard.TargetProperty="(TextBlock.Opacity)"
|
||||
To="0.0" Duration="0:0:0:0.1" />
|
||||
</Storyboard>
|
||||
</BeginStoryboard>
|
||||
</Trigger.ExitActions>
|
||||
|
||||
<Setter Property="Foreground" Value="{DynamicResource IdealForegroundColorBrush}" />
|
||||
</Trigger>
|
||||
</ControlTemplate.Triggers>
|
||||
</ControlTemplate>
|
||||
@ -489,6 +497,7 @@
|
||||
</Setter>
|
||||
<Setter Property="VerticalContentAlignment" Value="Center" />
|
||||
</Style>
|
||||
|
||||
<Style x:Key="labelfortweaks" TargetType="{x:Type Label}">
|
||||
<Setter Property="Foreground" Value="{MainForegroundColor}" />
|
||||
<Setter Property="Background" Value="{MainBackgroundColor}" />
|
||||
@ -690,7 +699,7 @@
|
||||
<RowDefinition Height="0.95*"/>
|
||||
</Grid.RowDefinitions>
|
||||
<StackPanel Background="{MainBackgroundColor}" Orientation="Horizontal" Grid.Row="0" HorizontalAlignment="Left" VerticalAlignment="Top" Grid.Column="0" Grid.ColumnSpan="3" Margin="5">
|
||||
<Button Name="WPFinstall" Content=" Install Selected" Margin="2" />
|
||||
<Button Name="WPFinstall" Content=" Install/Upgrade Selected" Margin="2" />
|
||||
<Button Name="WPFInstallUpgrade" Content=" Upgrade All" Margin="2"/>
|
||||
<Button Name="WPFuninstall" Content=" Uninstall Selection" Margin="2"/>
|
||||
<Button Name="WPFGetInstalled" Content=" Get Installed" Margin="2"/>
|
||||
@ -717,8 +726,7 @@
|
||||
{{InstallPanel_tweaks}}
|
||||
<StackPanel Background="{MainBackgroundColor}" Orientation="Horizontal" HorizontalAlignment="Left" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Margin="10">
|
||||
<Label Content="Recommended Selections:" FontSize="14" VerticalAlignment="Center"/>
|
||||
<Button Name="WPFdesktop" Content=" Desktop " Margin="1"/>
|
||||
<Button Name="WPFlaptop" Content=" Laptop " Margin="1"/>
|
||||
<Button Name="WPFstandard" Content=" Standard " Margin="1"/>
|
||||
<Button Name="WPFminimal" Content=" Minimal " Margin="1"/>
|
||||
<Button Name="WPFclear" Content=" Clear " Margin="1"/>
|
||||
<Button Name="WPFGetInstalledTweaks" Content=" Get Installed " Margin="1"/>
|
||||
@ -794,20 +802,29 @@
|
||||
</TextBlock>
|
||||
<CheckBox x:Name="WPFMicrowinISOScratchDir" Content="Use ISO directory for ScratchDir " IsChecked="False" Margin="1"
|
||||
ToolTip="Use ISO directory for ScratchDir " />
|
||||
|
||||
<Button Name="MicrowinScratchDirBT" Margin="2" Padding="1">
|
||||
<Button.Content>
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*" /> <!-- Takes the remaining space -->
|
||||
<ColumnDefinition Width="30" /> <!-- Fixed width for Button -->
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBox Name="MicrowinScratchDirBox" Background="Transparent" BorderBrush="{MainForegroundColor}"
|
||||
Text="Scratch" Padding="0"
|
||||
ToolTip="Alt Path For Scratch Directory" BorderThickness="1"
|
||||
Margin="0,0,0,3" HorizontalAlignment="Left"
|
||||
IsReadOnly="False"
|
||||
Height="Auto"
|
||||
Width="110"
|
||||
Foreground="{ButtonForegroundColor}"
|
||||
/>
|
||||
</Button.Content>
|
||||
</Button>
|
||||
Text="Scratch"
|
||||
Margin="2"
|
||||
IsReadOnly="False"
|
||||
ToolTip="Alt Path For Scratch Directory"
|
||||
Grid.Column="0"
|
||||
VerticalAlignment="Center"
|
||||
Foreground="{LabelboxForegroundColor}">
|
||||
</TextBox>
|
||||
<Button Name="MicrowinScratchDirBT"
|
||||
Grid.Column="1"
|
||||
Margin="2"
|
||||
Padding="1" VerticalAlignment="Center">
|
||||
<Button.Content>
|
||||
...
|
||||
</Button.Content>
|
||||
</Button>
|
||||
</Grid>
|
||||
<TextBox Name="MicrowinFinalIsoLocation" Background="Transparent" BorderBrush="{MainForegroundColor}"
|
||||
Text="ISO location will be printed here"
|
||||
Margin="2"
|
||||
@ -842,6 +859,7 @@
|
||||
Foreground="{LabelboxForegroundColor}"
|
||||
ToolTip="Path to unpacked drivers all sys and inf files for devices that need drivers"
|
||||
/>
|
||||
<CheckBox Name="MicrowinImportDrivers" Content="Import drivers from current system" Margin="5,0" IsChecked="False" ToolTip="Export all third-party drivers from your system and inject them to the MicroWin image"/>
|
||||
<Rectangle Fill="{MainForegroundColor}" Height="2" HorizontalAlignment="Stretch" Margin="0,10,0,10"/>
|
||||
<CheckBox Name="WPFMicrowinCopyToUsb" Content="Copy to Ventoy" Margin="5,0" IsChecked="False" ToolTip="Copy to USB disk with a label Ventoy"/>
|
||||
<Rectangle Fill="{MainForegroundColor}" Height="2" HorizontalAlignment="Stretch" Margin="0,10,0,10"/>
|
||||
|
Reference in New Issue
Block a user