mirror of
https://github.com/ChrisTitusTech/winutil
synced 2026-04-06 14:48:31 +00:00
Compare commits
4 Commits
26.03.03
...
751b7ef79c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
751b7ef79c | ||
|
|
689cf656c0 | ||
|
|
114f671237 | ||
|
|
81aee4ead9 |
7
.github/workflows/auto-merge-docs.yaml
vendored
7
.github/workflows/auto-merge-docs.yaml
vendored
@@ -8,7 +8,7 @@ on:
|
||||
|
||||
jobs:
|
||||
auto-merge:
|
||||
if: github.event.pull_request.head.ref == 'docs-update' && (github.event.pull_request.user.login == 'ChrisTitusTech' || github.event.pull_request.user.login == 'github-actions[bot]')
|
||||
if: github.event.pull_request.head.ref == 'docs-update' && github.event.pull_request.user.login == 'github-actions[bot]'
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
pull-requests: write
|
||||
@@ -18,14 +18,13 @@ jobs:
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Auto-approve PR
|
||||
if: github.event.pull_request.user.login == 'github-actions[bot]'
|
||||
run: gh pr review "$PR_NUMBER" --approve
|
||||
env:
|
||||
PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||
GH_TOKEN: ${{ secrets.AUTO_MERGE }}
|
||||
|
||||
- name: Enable auto-merge
|
||||
run: gh pr merge "$PR_NUMBER" --squash --delete-branch --admin
|
||||
run: gh pr merge "$PR_NUMBER" --squash --auto --delete-branch
|
||||
env:
|
||||
PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||
GH_TOKEN: ${{ secrets.AUTO_MERGE }}
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
15
.github/workflows/docs.yaml
vendored
15
.github/workflows/docs.yaml
vendored
@@ -12,7 +12,7 @@ on:
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
contents: write
|
||||
pages: write
|
||||
id-token: write
|
||||
pull-requests: write
|
||||
@@ -47,27 +47,22 @@ jobs:
|
||||
- name: Setup Pages
|
||||
id: pages
|
||||
uses: actions/configure-pages@v5
|
||||
|
||||
- name: Generate Dev Docs from JSON
|
||||
shell: pwsh
|
||||
run: |
|
||||
Set-Location tools
|
||||
./devdocs-generator.ps1
|
||||
|
||||
- name: Create Pull Request
|
||||
- name: Create Pull Request 🚀
|
||||
id: cpr
|
||||
uses: peter-evans/create-pull-request@v8
|
||||
uses: peter-evans/create-pull-request@v6
|
||||
with:
|
||||
token: ${{ secrets.AUTO_MERGE }}
|
||||
commit-message: 'chore: Update generated dev docs'
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
commit-message: 'Update generated documentation'
|
||||
title: 'chore: Update Generated Dev Docs'
|
||||
body: 'Automated update of generated documentation from JSON sources'
|
||||
branch: docs-update
|
||||
delete-branch: true
|
||||
add-paths: |
|
||||
docs/content/dev/
|
||||
config/tweaks.json
|
||||
config/feature.json
|
||||
labels: |
|
||||
automated
|
||||
documentation
|
||||
|
||||
37
.github/workflows/pre-release.yaml
vendored
37
.github/workflows/pre-release.yaml
vendored
@@ -3,7 +3,6 @@ name: Pre-Release WinUtil
|
||||
permissions:
|
||||
contents: write
|
||||
actions: read
|
||||
pull-requests: write
|
||||
|
||||
on:
|
||||
workflow_dispatch: # Manual trigger added
|
||||
@@ -23,35 +22,25 @@ jobs:
|
||||
Set-Location tools
|
||||
./devdocs-generator.ps1
|
||||
|
||||
- name: Commit Updated JSON Links
|
||||
shell: pwsh
|
||||
run: |
|
||||
git config user.name "github-actions[bot]"
|
||||
git config user.email "github-actions[bot]@users.noreply.github.com"
|
||||
git add config/tweaks.json config/feature.json
|
||||
$changes = git diff --cached --quiet; if ($LASTEXITCODE -ne 0) {
|
||||
git commit -m "Update documentation links in JSON configs"
|
||||
git push
|
||||
} else {
|
||||
Write-Host "No JSON link changes to commit"
|
||||
}
|
||||
|
||||
- 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
|
||||
|
||||
- name: Create Pull Request for Updated JSON Links
|
||||
id: cpr
|
||||
uses: peter-evans/create-pull-request@v8
|
||||
with:
|
||||
token: ${{ secrets.AUTO_MERGE }}
|
||||
commit-message: 'chore: Update documentation links in JSON configs'
|
||||
title: 'chore: Update Generated Dev Docs'
|
||||
body: 'Automated update of documentation links in JSON configs from pre-release build'
|
||||
branch: docs-update
|
||||
delete-branch: true
|
||||
add-paths: |
|
||||
config/tweaks.json
|
||||
config/feature.json
|
||||
labels: |
|
||||
automated
|
||||
documentation
|
||||
|
||||
- name: Check outputs
|
||||
shell: bash
|
||||
run: |
|
||||
echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}"
|
||||
echo "Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}"
|
||||
|
||||
- name: Set Version to Todays Date
|
||||
id: extract_version
|
||||
run: |
|
||||
|
||||
2
.github/workflows/sponsors.yaml
vendored
2
.github/workflows/sponsors.yaml
vendored
@@ -24,7 +24,7 @@ jobs:
|
||||
|
||||
- name: Create Pull Request 🚀
|
||||
id: cpr
|
||||
uses: peter-evans/create-pull-request@v8
|
||||
uses: peter-evans/create-pull-request@v6
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
commit-message: 'Update sponsors in README'
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
"category": "Document",
|
||||
"choco": "na",
|
||||
"content": "AFFiNE",
|
||||
"description": "AFFiNE is an open-source alternative to Notion. Write, draw, plan all at once. Selfhost it to sync across devices.",
|
||||
"description": "AFFiNE is an open source alternative to Notion. Write, draw, plan all at once. Selfhost it to sync across devices.",
|
||||
"link": "https://affine.pro/",
|
||||
"winget": "ToEverything.AFFiNE",
|
||||
"foss": true
|
||||
@@ -105,7 +105,7 @@
|
||||
"category": "Microsoft Tools",
|
||||
"choco": "autoruns",
|
||||
"content": "Autoruns",
|
||||
"description": "This utility shows you what programs are configured to run during system bootup or login.",
|
||||
"description": "This utility shows you what programs are configured to run during system bootup or login",
|
||||
"link": "https://learn.microsoft.com/en-us/sysinternals/downloads/autoruns",
|
||||
"winget": "Microsoft.Sysinternals.Autoruns"
|
||||
},
|
||||
@@ -156,7 +156,7 @@
|
||||
"category": "Communications",
|
||||
"choco": "na",
|
||||
"content": "Beeper",
|
||||
"description": "All your chats in one app.",
|
||||
"description": "All your chats in one app",
|
||||
"link": "https://www.beeper.com/",
|
||||
"winget": "Beeper.Beeper"
|
||||
},
|
||||
@@ -173,7 +173,7 @@
|
||||
"category": "Utilities",
|
||||
"choco": "bleachbit",
|
||||
"content": "BleachBit",
|
||||
"description": "Clean Your System and Free Disk Space.",
|
||||
"description": "Clean Your System and Free Disk Space",
|
||||
"link": "https://www.bleachbit.org/",
|
||||
"winget": "BleachBit.BleachBit",
|
||||
"foss": true
|
||||
@@ -593,7 +593,7 @@
|
||||
"category": "Utilities",
|
||||
"choco": "espanso",
|
||||
"content": "Espanso",
|
||||
"description": "Cross-platform and open-source Text Expander written in Rust.",
|
||||
"description": "Cross-platform and open-source Text Expander written in Rust",
|
||||
"link": "https://espanso.org/",
|
||||
"winget": "Espanso.Espanso",
|
||||
"foss": true
|
||||
@@ -620,7 +620,7 @@
|
||||
"category": "Utilities",
|
||||
"choco": "na",
|
||||
"content": "Fastfetch",
|
||||
"description": "Fastfetch is a neofetch-like tool for fetching system information and displaying them in a pretty way.",
|
||||
"description": "Fastfetch is a neofetch-like tool for fetching system information and displaying them in a pretty way",
|
||||
"link": "https://github.com/fastfetch-cli/fastfetch/",
|
||||
"winget": "Fastfetch-cli.Fastfetch",
|
||||
"foss": true
|
||||
@@ -646,7 +646,7 @@
|
||||
"category": "Utilities",
|
||||
"choco": "file-converter",
|
||||
"content": "File-Converter",
|
||||
"description": "File Converter is a very simple tool which allows you to convert and compress one or several file(s) using the context menu in Windows Explorer.",
|
||||
"description": "File Converter is a very simple tool which allows you to convert and compress one or several file(s) using the context menu in windows explorer.",
|
||||
"link": "https://file-converter.io/",
|
||||
"winget": "AdrienAllard.FileConverter",
|
||||
"foss": true
|
||||
@@ -699,7 +699,7 @@
|
||||
"category": "Multimedia Tools",
|
||||
"choco": "lightshot",
|
||||
"content": "Lightshot (Screenshots)",
|
||||
"description": "Ligthshot is an easy-to-use, light-weight screenshot software tool, where you can optionally edit your screenshots using different tools, share them via Internet and/or save to disk, and customize the available options.",
|
||||
"description": "Ligthshot is an Easy-to-use, light-weight screenshot software tool, where you can optionally edit your screenshots using different tools, share them via Internet and/or save to disk, and customize the available options.",
|
||||
"link": "https://app.prntscr.com/",
|
||||
"winget": "Skillbrains.Lightshot"
|
||||
},
|
||||
@@ -775,7 +775,7 @@
|
||||
"category": "Utilities",
|
||||
"choco": "fzf",
|
||||
"content": "Fzf",
|
||||
"description": "A command-line fuzzy finder.",
|
||||
"description": "A command-line fuzzy finder",
|
||||
"link": "https://github.com/junegunn/fzf/",
|
||||
"winget": "junegunn.fzf",
|
||||
"foss": true
|
||||
@@ -895,7 +895,7 @@
|
||||
"category": "Utilities",
|
||||
"choco": "googledrive",
|
||||
"content": "Google Drive",
|
||||
"description": "File syncing across devices all tied to your Google account.",
|
||||
"description": "File syncing across devices all tied to your google account",
|
||||
"link": "https://www.google.com/drive/",
|
||||
"winget": "Google.GoogleDrive"
|
||||
},
|
||||
@@ -955,7 +955,7 @@
|
||||
"category": "Development",
|
||||
"choco": "helix",
|
||||
"content": "Helix",
|
||||
"description": "Helix is a neovim alternative built in Rust.",
|
||||
"description": "Helix is a neovim alternative built in rust.",
|
||||
"link": "https://helix-editor.com/",
|
||||
"winget": "Helix.Helix",
|
||||
"foss": true
|
||||
@@ -1147,7 +1147,7 @@
|
||||
"category": "Utilities",
|
||||
"choco": "jpegview",
|
||||
"content": "JPEG View",
|
||||
"description": "JPEGView is a lean, fast and highly configurable viewer/editor for JPEG, BMP, PNG, WEBP, TGA, GIF, JXL, HEIC, HEIF, AVIF and TIFF images with a minimal GUI.",
|
||||
"description": "JPEGView is a lean, fast and highly configurable viewer/editor for JPEG, BMP, PNG, WEBP, TGA, GIF, JXL, HEIC, HEIF, AVIF and TIFF images with a minimal GUI",
|
||||
"link": "https://github.com/sylikc/jpegview",
|
||||
"winget": "sylikc.JPEGView",
|
||||
"foss": true
|
||||
@@ -1209,7 +1209,7 @@
|
||||
"category": "Development",
|
||||
"choco": "lazygit",
|
||||
"content": "Lazygit",
|
||||
"description": "Simple terminal UI for git commands.",
|
||||
"description": "Simple terminal UI for git commands",
|
||||
"link": "https://github.com/jesseduffield/lazygit/",
|
||||
"winget": "JesseDuffield.lazygit",
|
||||
"foss": true
|
||||
@@ -1262,7 +1262,7 @@
|
||||
"category": "Utilities",
|
||||
"choco": "localsend.install",
|
||||
"content": "LocalSend",
|
||||
"description": "An open-source cross-platform alternative to AirDrop.",
|
||||
"description": "An open source cross-platform alternative to AirDrop.",
|
||||
"link": "https://localsend.org/",
|
||||
"winget": "LocalSend.LocalSend",
|
||||
"foss": true
|
||||
@@ -1323,7 +1323,7 @@
|
||||
"category": "Multimedia Tools",
|
||||
"choco": "na",
|
||||
"content": "Modern Flyouts",
|
||||
"description": "An open-source, modern, Fluent Design-based set of flyouts for Windows.",
|
||||
"description": "An open source, modern, Fluent Design-based set of flyouts for Windows.",
|
||||
"link": "https://github.com/ModernFlyouts-Community/ModernFlyouts/",
|
||||
"winget": "ModernFlyouts.ModernFlyouts",
|
||||
"foss": true
|
||||
@@ -1377,7 +1377,7 @@
|
||||
"category": "Utilities",
|
||||
"choco": "msedgeredirect",
|
||||
"content": "MSEdgeRedirect",
|
||||
"description": "A Tool to Redirect News, Search, Widgets, Weather, and More to your default browser.",
|
||||
"description": "A Tool to Redirect News, Search, Widgets, Weather, and More to Your Default Browser.",
|
||||
"link": "https://github.com/rcmaehl/MSEdgeRedirect",
|
||||
"winget": "rcmaehl.MSEdgeRedirect",
|
||||
"foss": true
|
||||
@@ -1473,7 +1473,7 @@
|
||||
"category": "Multimedia Tools",
|
||||
"choco": "tagscanner",
|
||||
"content": "TagScanner (Tag Scanner)",
|
||||
"description": "TagScanner is a powerful tool for organizing and managing your music collection.",
|
||||
"description": "TagScanner is a powerful tool for organizing and managing your music collection",
|
||||
"link": "https://www.xdlab.ru/en/",
|
||||
"winget": "SergeySerkov.TagScanner"
|
||||
},
|
||||
@@ -1490,7 +1490,7 @@
|
||||
"category": "Pro Tools",
|
||||
"choco": "netbird",
|
||||
"content": "NetBird",
|
||||
"description": "NetBird is a open-source alternative comparable to TailScale that can be connected to a selfhosted Server.",
|
||||
"description": "NetBird is a Open Source alternative comparable to TailScale that can be connected to a selfhosted Server.",
|
||||
"link": "https://netbird.io/",
|
||||
"winget": "netbird",
|
||||
"foss": true
|
||||
@@ -1895,7 +1895,7 @@
|
||||
"category": "Games",
|
||||
"choco": "prismlauncher",
|
||||
"content": "Prism Launcher",
|
||||
"description": "Prism Launcher is an open-source Minecraft launcher with the ability to manage multiple instances, accounts and mods.",
|
||||
"description": "Prism Launcher is an Open Source Minecraft launcher with the ability to manage multiple instances, accounts and mods.",
|
||||
"link": "https://prismlauncher.org/",
|
||||
"winget": "PrismLauncher.PrismLauncher",
|
||||
"foss": true
|
||||
@@ -1929,7 +1929,7 @@
|
||||
"category": "Utilities",
|
||||
"choco": "orcaslicer",
|
||||
"content": "OrcaSlicer",
|
||||
"description": "G-code generator for 3D printers (Bambu, Prusa, Voron, VzBot, RatRig, Creality, etc.).",
|
||||
"description": "G-code generator for 3D printers (Bambu, Prusa, Voron, VzBot, RatRig, Creality, etc.)",
|
||||
"link": "https://github.com/SoftFever/OrcaSlicer",
|
||||
"winget": "SoftFever.OrcaSlicer",
|
||||
"foss": true
|
||||
@@ -1982,7 +1982,7 @@
|
||||
"category": "Utilities",
|
||||
"choco": "transmission",
|
||||
"content": "Transmission",
|
||||
"description": "Transmission is a cross-platform BitTorrent client that is open-source, easy, powerful, and lean.",
|
||||
"description": "Transmission is a cross-platform BitTorrent client that is open source, easy, powerful, and lean.",
|
||||
"link": "https://transmissionbt.com/",
|
||||
"winget": "Transmission.Transmission",
|
||||
"foss": true
|
||||
@@ -2008,7 +2008,7 @@
|
||||
"category": "Utilities",
|
||||
"choco": "quicklook",
|
||||
"content": "Quicklook",
|
||||
"description": "Bring macOS \u201cQuick Look\u201d feature to Windows.",
|
||||
"description": "Bring macOS \u201cQuick Look\u201d feature to Windows",
|
||||
"link": "https://github.com/QL-Win/QuickLook",
|
||||
"winget": "QL-Win.QuickLook",
|
||||
"foss": true
|
||||
@@ -2051,7 +2051,7 @@
|
||||
"category": "Utilities",
|
||||
"choco": "ripgrep",
|
||||
"content": "Ripgrep",
|
||||
"description": "Fast and powerful commandline search tool.",
|
||||
"description": "Fast and powerful commandline search tool",
|
||||
"link": "https://github.com/BurntSushi/ripgrep/",
|
||||
"winget": "BurntSushi.ripgrep.MSVC",
|
||||
"foss": true
|
||||
@@ -2209,7 +2209,7 @@
|
||||
"category": "Utilities",
|
||||
"choco": "spacesniffer",
|
||||
"content": "SpaceSniffer",
|
||||
"description": "A tool application that lets you understand how folders and files are structured on your disks.",
|
||||
"description": "A tool application that lets you understand how folders and files are structured on your disks",
|
||||
"link": "http://www.uderzo.it/main_products/space_sniffer/",
|
||||
"winget": "UderzoSoftware.SpaceSniffer"
|
||||
},
|
||||
@@ -2277,7 +2277,7 @@
|
||||
"category": "Document",
|
||||
"choco": "na",
|
||||
"content": "PDFgear",
|
||||
"description": "PDFgear is a piece of full-featured PDF management software for Windows, macOS, and mobile, and it's completely free to use.",
|
||||
"description": "PDFgear is a piece of full-featured PDF management software for Windows, Mac, and mobile, and it's completely free to use.",
|
||||
"link": "https://www.pdfgear.com/",
|
||||
"winget": "PDFgear.PDFgear"
|
||||
},
|
||||
@@ -2312,7 +2312,7 @@
|
||||
"category": "Utilities",
|
||||
"choco": "synctrayzor",
|
||||
"content": "SyncTrayzor",
|
||||
"description": "Windows tray utility / filesystem watcher / launcher for Syncthing.",
|
||||
"description": "Windows tray utility / filesystem watcher / launcher for Syncthing",
|
||||
"link": "https://github.com/GermanCoding/SyncTrayzor",
|
||||
"winget": "GermanCoding.SyncTrayzor",
|
||||
"foss": true
|
||||
@@ -2329,7 +2329,7 @@
|
||||
"category": "Utilities",
|
||||
"choco": "tabby",
|
||||
"content": "Tabby.sh",
|
||||
"description": "Tabby is a highly configurable terminal emulator, SSH and serial client for Windows, macOS and Linux.",
|
||||
"description": "Tabby is a highly configurable terminal emulator, SSH and serial client for Windows, macOS and Linux",
|
||||
"link": "https://tabby.sh/",
|
||||
"winget": "Eugeny.Tabby",
|
||||
"foss": true
|
||||
@@ -2389,7 +2389,7 @@
|
||||
"category": "Communications",
|
||||
"choco": "na",
|
||||
"content": "Unigram",
|
||||
"description": "Unigram - Telegram for Windows.",
|
||||
"description": "Unigram - Telegram for Windows",
|
||||
"link": "https://unigramdev.github.io/",
|
||||
"winget": "Telegram.Unigram",
|
||||
"foss": true
|
||||
@@ -2416,7 +2416,7 @@
|
||||
"category": "Development",
|
||||
"choco": "na",
|
||||
"content": "Code With Mu (Mu Editor)",
|
||||
"description": "Mu is a Python code editor for beginner programmers.",
|
||||
"description": "Mu is a Python code editor for beginner programmers",
|
||||
"link": "https://codewith.mu/",
|
||||
"winget": "Mu.Mu",
|
||||
"foss": true
|
||||
@@ -2425,7 +2425,7 @@
|
||||
"category": "Browsers",
|
||||
"choco": "thorium",
|
||||
"content": "Thorium Browser AVX2",
|
||||
"description": "Browser built for speed over vanilla Chromium. It is built with AVX2 optimizations and is the fastest browser on the market.",
|
||||
"description": "Browser built for speed over vanilla chromium. It is built with AVX2 optimizations and is the fastest browser on the market.",
|
||||
"link": "https://thorium.rocks/",
|
||||
"winget": "Alex313031.Thorium.AVX2",
|
||||
"foss": true
|
||||
@@ -2485,7 +2485,7 @@
|
||||
"category": "Utilities",
|
||||
"choco": "translucenttb",
|
||||
"content": "TranslucentTB",
|
||||
"description": "TranslucentTB is a tool that allows you to customize the transparency of the Windows Taskbar.",
|
||||
"description": "TranslucentTB is a tool that allows you to customize the transparency of the Windows taskbar.",
|
||||
"link": "https://github.com/TranslucentTB/TranslucentTB",
|
||||
"winget": "9PF4KZ2VN4W9",
|
||||
"foss": true
|
||||
@@ -2673,7 +2673,7 @@
|
||||
"category": "Development",
|
||||
"choco": "wezterm",
|
||||
"content": "Wezterm",
|
||||
"description": "WezTerm is a powerful cross-platform terminal emulator and multiplexer.",
|
||||
"description": "WezTerm is a powerful cross-platform terminal emulator and multiplexer",
|
||||
"link": "https://wezfurlong.org/wezterm/index.html",
|
||||
"winget": "wez.wezterm",
|
||||
"foss": true
|
||||
@@ -2768,7 +2768,7 @@
|
||||
"category": "Utilities",
|
||||
"choco": "TeraCopy",
|
||||
"content": "TeraCopy",
|
||||
"description": "Copy your files faster and more securely.",
|
||||
"description": "Copy your files faster and more securely",
|
||||
"link": "https://codesector.com/teracopy",
|
||||
"winget": "CodeSector.TeraCopy"
|
||||
},
|
||||
@@ -2896,7 +2896,7 @@
|
||||
"category": "Utilities",
|
||||
"choco": "na",
|
||||
"content": "ZoomIt",
|
||||
"description": "A screen zoom, annotation, and recording tool for technical presentations and demos.",
|
||||
"description": "A screen zoom, annotation, and recording tool for technical presentations and demos",
|
||||
"link": "https://learn.microsoft.com/en-us/sysinternals/downloads/zoomit",
|
||||
"winget": "Microsoft.Sysinternals.ZoomIt"
|
||||
},
|
||||
@@ -2931,7 +2931,7 @@
|
||||
"category": "Utilities",
|
||||
"choco": "syncthingtray",
|
||||
"content": "Syncthingtray",
|
||||
"description": "Might be the alternative for Synctrayzor. Windows tray utility / filesystem watcher / launcher for Syncthing.",
|
||||
"description": "Might be the alternative for Synctrayzor. Windows tray utility / filesystem watcher / launcher for Syncthing",
|
||||
"link": "https://github.com/Martchus/syncthingtray",
|
||||
"winget": "Martchus.syncthingtray",
|
||||
"foss": true
|
||||
@@ -2958,7 +2958,7 @@
|
||||
"category": "Development",
|
||||
"choco": "temurin",
|
||||
"content": "Eclipse Temurin",
|
||||
"description": "Eclipse Temurin is the open-source Java SE build based upon OpenJDK.",
|
||||
"description": "Eclipse Temurin is the open source Java SE build based upon OpenJDK.",
|
||||
"link": "https://adoptium.net/temurin/",
|
||||
"winget": "EclipseAdoptium.Temurin.21.JDK",
|
||||
"foss": true
|
||||
@@ -2985,7 +2985,7 @@
|
||||
"category": "Utilities",
|
||||
"choco": "TightVNC",
|
||||
"content": "TightVNC",
|
||||
"description": "TightVNC is a free and open-source remote desktop software that lets you access and control a computer over the network. With its intuitive interface, you can interact with the remote screen as if you were sitting in front of it. You can open files, launch applications, and perform other actions on the remote desktop almost as if you were physically there.",
|
||||
"description": "TightVNC is a free and Open Source remote desktop software that lets you access and control a computer over the network. With its intuitive interface, you can interact with the remote screen as if you were sitting in front of it. You can open files, launch applications, and perform other actions on the remote desktop almost as if you were physically there",
|
||||
"link": "https://www.tightvnc.com/",
|
||||
"winget": "GlavSoft.TightVNC",
|
||||
"foss": true
|
||||
@@ -3019,7 +3019,7 @@
|
||||
"category": "Utilities",
|
||||
"choco": "auto-dark-mode",
|
||||
"content": "Windows Auto Dark Mode",
|
||||
"description": "Automatically switches between the dark and light theme of Windows 10 and Windows 11.",
|
||||
"description": "Automatically switches between the dark and light theme of Windows 10 and Windows 11",
|
||||
"link": "https://github.com/AutoDarkMode/Windows-Auto-Night-Mode",
|
||||
"winget": "Armin2208.WindowsAutoNightMode",
|
||||
"foss": true
|
||||
@@ -3037,7 +3037,7 @@
|
||||
"category": "Utilities",
|
||||
"choco": "magic-wormhole",
|
||||
"content": "Magic Wormhole",
|
||||
"description": "get things from one computer to another, safely.",
|
||||
"description": "get things from one computer to another, safely",
|
||||
"link": "https://github.com/magic-wormhole/magic-wormhole",
|
||||
"winget": "magic-wormhole.magic-wormhole",
|
||||
"foss": true
|
||||
@@ -3055,7 +3055,7 @@
|
||||
"category": "Multimedia Tools",
|
||||
"choco": "qgis",
|
||||
"content": "QGIS",
|
||||
"description": "QGIS (Quantum GIS) is an open-source Geographic Information System (GIS) software that enables users to create, edit, visualize, analyze, and publish geospatial information on Windows, macOS, and Linux platforms.",
|
||||
"description": "QGIS (Quantum GIS) is an open-source Geographic Information System (GIS) software that enables users to create, edit, visualize, analyze, and publish geospatial information on Windows, Mac, and Linux platforms.",
|
||||
"link": "https://qgis.org/en/site/",
|
||||
"winget": "OSGeo.QGIS",
|
||||
"foss": true
|
||||
@@ -3073,7 +3073,7 @@
|
||||
"category": "Utilities",
|
||||
"choco": "na",
|
||||
"content": "GlazeWM",
|
||||
"description": "GlazeWM is a tiling window manager for Windows inspired by i3 and Polybar.",
|
||||
"description": "GlazeWM is a tiling window manager for Windows inspired by i3 and Polybar",
|
||||
"link": "https://github.com/glzr-io/glazewm",
|
||||
"winget": "glzr-io.glazewm",
|
||||
"foss": true
|
||||
@@ -3091,7 +3091,7 @@
|
||||
"category": "Development",
|
||||
"choco": "fnm",
|
||||
"content": "Fast Node Manager",
|
||||
"description": "Fast Node Manager (fnm) allows you to switch your Node version by using the terminal.",
|
||||
"description": "Fast Node Manager (fnm) allows you to switch your Node version by using the Terminal",
|
||||
"link": "https://github.com/Schniz/fnm",
|
||||
"winget": "Schniz.fnm",
|
||||
"foss": true
|
||||
@@ -3100,7 +3100,7 @@
|
||||
"category": "Utilities",
|
||||
"choco": "windhawk",
|
||||
"content": "Windhawk",
|
||||
"description": "The customization marketplace for Windows programs.",
|
||||
"description": "The customization marketplace for Windows programs",
|
||||
"link": "https://windhawk.net",
|
||||
"winget": "RamenSoftware.Windhawk"
|
||||
},
|
||||
@@ -3108,7 +3108,7 @@
|
||||
"category": "Utilities",
|
||||
"choco": "na",
|
||||
"content": "ForceAutoHDR",
|
||||
"description": "ForceAutoHDR simplifies the process of adding games to the AutoHDR list in the Windows Registry.",
|
||||
"description": "ForceAutoHDR simplifies the process of adding games to the AutoHDR list in the Windows Registry",
|
||||
"link": "https://github.com/7gxycn08/ForceAutoHDR",
|
||||
"winget": "ForceAutoHDR.7gxycn08",
|
||||
"foss": true
|
||||
@@ -3117,7 +3117,7 @@
|
||||
"category": "Utilities",
|
||||
"choco": "joytokey",
|
||||
"content": "JoyToKey",
|
||||
"description": "Enables PC game controllers to emulate the keyboard and mouse input.",
|
||||
"description": "enables PC game controllers to emulate the keyboard and mouse input",
|
||||
"link": "https://joytokey.net/en/",
|
||||
"winget": "JTKsoftware.JoyToKey"
|
||||
},
|
||||
@@ -3159,7 +3159,7 @@
|
||||
"category": "Browsers",
|
||||
"choco": "paleMoon",
|
||||
"content": "PaleMoon",
|
||||
"description": "Pale Moon is an open-source, Goanna-based web browser available for Microsoft Windows and Linux (with other operating systems in development), focusing on efficiency and ease of use.",
|
||||
"description": "Pale Moon is an Open Source, Goanna-based web browser available for Microsoft Windows and Linux (with other operating systems in development), focusing on efficiency and ease of use.",
|
||||
"link": "https://www.palemoon.org/download.shtml",
|
||||
"winget": "MoonchildProductions.PaleMoon",
|
||||
"foss": true
|
||||
@@ -3168,7 +3168,7 @@
|
||||
"category": "Multimedia Tools",
|
||||
"choco": "na",
|
||||
"content": "Shotcut",
|
||||
"description": "Shotcut is a free, open-source, cross-platform video editor.",
|
||||
"description": "Shotcut is a free, open source, cross-platform video editor.",
|
||||
"link": "https://shotcut.org/",
|
||||
"winget": "Meltytech.Shotcut",
|
||||
"foss": true
|
||||
@@ -3195,7 +3195,7 @@
|
||||
"category": "Development",
|
||||
"choco": "aegisub",
|
||||
"content": "Aegisub",
|
||||
"description": "Aegisub is a free, cross-platform open-source tool for creating and modifying subtitles. Aegisub makes it quick and easy to time subtitles to audio, and features many powerful tools for styling them, including a built-in real-time video preview.",
|
||||
"description": "Aegisub is a free, cross-platform open source tool for creating and modifying subtitles. Aegisub makes it quick and easy to time subtitles to audio, and features many powerful tools for styling them, including a built-in real-time video preview.",
|
||||
"link": "https://github.com/Aegisub/Aegisub",
|
||||
"winget": "Aegisub.Aegisub",
|
||||
"foss": true
|
||||
@@ -3204,7 +3204,7 @@
|
||||
"category": "Multimedia Tools",
|
||||
"choco": "na",
|
||||
"content": "Subtitle Edit",
|
||||
"description": "Subtitle Edit is a free and open-source editor for video subtitles.",
|
||||
"description": "Subtitle Edit is a free and open source editor for video subtitles.",
|
||||
"link": "https://github.com/SubtitleEdit/subtitleedit",
|
||||
"winget": "Nikse.SubtitleEdit",
|
||||
"foss": true
|
||||
@@ -3221,7 +3221,7 @@
|
||||
"category": "Browsers",
|
||||
"choco": "na",
|
||||
"content": "Zen Browser",
|
||||
"description": "The modern, privacy-focused, performance-driven browser built on Firefox.",
|
||||
"description": "The modern, privacy-focused, performance-driven browser built on Firefox",
|
||||
"link": "https://zen-browser.app/",
|
||||
"winget": "Zen-Team.Zen-Browser",
|
||||
"foss": true
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
},
|
||||
"WPFFeatureslegacymedia": {
|
||||
"Content": "Legacy Media (WMP, DirectPlay)",
|
||||
"Description": "Enables legacy programs from previous versions of Windows.",
|
||||
"Description": "Enables legacy programs from previous versions of windows",
|
||||
"category": "Features",
|
||||
"panel": "1",
|
||||
"feature": [
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
],
|
||||
"Minimal": [
|
||||
"WPFTweaksConsumerFeatures",
|
||||
"WPFTweaksDisableExplorerAutoDiscovery",
|
||||
"WPFTweaksWPBT",
|
||||
"WPFTweaksServices",
|
||||
"WPFTweaksTelemetry"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"WPFTweaksActivity": {
|
||||
"Content": "Disable Activity History",
|
||||
"Description": "Erases recent docs, clipboard, and run history.",
|
||||
"Description": "This erases recent docs, clipboard, and run history.",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"registry": [
|
||||
@@ -31,7 +31,7 @@
|
||||
},
|
||||
"WPFTweaksHiber": {
|
||||
"Content": "Disable Hibernation",
|
||||
"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.",
|
||||
"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",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"registry": [
|
||||
@@ -60,7 +60,7 @@
|
||||
},
|
||||
"WPFTweaksWidget": {
|
||||
"Content": "Remove Widgets",
|
||||
"Description": "Removes the annoying widgets in the bottom left of the Taskbar.",
|
||||
"Description": "Removes the annoying widgets in the bottom left of the taskbar",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"InvokeScript": [
|
||||
@@ -89,7 +89,7 @@
|
||||
},
|
||||
"WPFTweaksRevertStartMenu": {
|
||||
"Content": "Revert the new start menu",
|
||||
"Description": "Uses vivetool to revert to the original start menu from 24H2.",
|
||||
"Description": "Uses vivetool to revert the the original start menu from 24h2",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"InvokeScript": [
|
||||
@@ -124,7 +124,7 @@
|
||||
},
|
||||
"WPFTweaksLocation": {
|
||||
"Content": "Disable Location Tracking",
|
||||
"Description": "Disables Location Tracking.",
|
||||
"Description": "Disables Location Tracking...DUH!",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"registry": [
|
||||
@@ -1125,7 +1125,7 @@
|
||||
},
|
||||
"WPFTweaksBraveDebloat": {
|
||||
"Content": "Brave Debloat",
|
||||
"Description": "Disables various annoyances like Brave Rewards, Leo AI, Crypto Wallet and VPN.",
|
||||
"Description": "Disables various annoyances like Brave Rewards,Leo AI,Crypto Wallet and VPN",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"registry": [
|
||||
@@ -1290,7 +1290,7 @@
|
||||
},
|
||||
"WPFTweaksConsumerFeatures": {
|
||||
"Content": "Disable ConsumerFeatures",
|
||||
"Description": "Windows will not automatically install any games, third-party apps, or application links from the Windows Store for the signed-in user. Some default Apps will be inaccessible (eg. Phone Link).",
|
||||
"Description": "Windows will not automatically install any games, third-party apps, or application links from the Windows Store for the signed-in user. Some default Apps will be inaccessible (eg. Phone Link)",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"registry": [
|
||||
@@ -1306,7 +1306,7 @@
|
||||
},
|
||||
"WPFTweaksTelemetry": {
|
||||
"Content": "Disable Telemetry",
|
||||
"Description": "Disables Microsoft Telemetry.",
|
||||
"Description": "Disables Microsoft Telemetry...Duh",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"registry": [
|
||||
@@ -1428,7 +1428,7 @@
|
||||
},
|
||||
"WPFTweaksRemoveEdge": {
|
||||
"Content": "Remove Microsoft Edge",
|
||||
"Description": "Unblocks Microsoft Edge uninstaller restrictions then uses that uninstaller to remove Microsoft Edge.",
|
||||
"Description": "Unblocks Microsoft Edge uninstaller restrictions than uses that uninstaller to remove Microsoft Edge",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"InvokeScript": [
|
||||
@@ -1460,7 +1460,7 @@
|
||||
},
|
||||
"WPFTweaksRemoveOneDrive": {
|
||||
"Content": "Remove OneDrive",
|
||||
"Description": "Denies permission to remove OneDrive user files, then uses its own uninstaller to remove it and restores the original permission afterward.",
|
||||
"Description": "Denys permission to remove onedrive user files than uses its own uninstaller to remove it than brings back permissions",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"InvokeScript": [
|
||||
@@ -1497,7 +1497,7 @@
|
||||
},
|
||||
"WPFTweaksRemoveHome": {
|
||||
"Content": "Remove Home from Explorer",
|
||||
"Description": "Removes the Home from Explorer and sets This PC as default.",
|
||||
"Description": "Removes the Home from Explorer and sets This PC as default",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"InvokeScript": [
|
||||
@@ -1516,7 +1516,7 @@
|
||||
},
|
||||
"WPFTweaksRemoveGallery": {
|
||||
"Content": "Remove Gallery from explorer",
|
||||
"Description": "Removes the Gallery from Explorer and sets This PC as default.",
|
||||
"Description": "Removes the Gallery from Explorer and sets This PC as default",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"InvokeScript": [
|
||||
@@ -1646,7 +1646,7 @@
|
||||
},
|
||||
"WPFTweaksDeBloat": {
|
||||
"Content": "Remove ALL MS Store Apps - NOT RECOMMENDED",
|
||||
"Description": "USE WITH CAUTION!!! This will remove ALL Microsoft Store apps.",
|
||||
"Description": "USE WITH CAUTION!!! This will remove ALL Microsoft store apps.",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"appx": [
|
||||
@@ -1735,7 +1735,7 @@
|
||||
},
|
||||
"WPFTweaksRestorePoint": {
|
||||
"Content": "Create Restore Point",
|
||||
"Description": "Creates a restore point at runtime in case a revert is needed from WinUtil modifications.",
|
||||
"Description": "Creates a restore point at runtime in case a revert is needed from WinUtil modifications",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"Checked": "False",
|
||||
@@ -1762,7 +1762,7 @@
|
||||
},
|
||||
"WPFTweaksEndTaskOnTaskbar": {
|
||||
"Content": "Enable End Task With Right Click",
|
||||
"Description": "Enables option to end task when right clicking a program in the taskbar.",
|
||||
"Description": "Enables option to end task when right clicking a program in the taskbar",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"registry": [
|
||||
@@ -1778,7 +1778,7 @@
|
||||
},
|
||||
"WPFTweaksPowershell7Tele": {
|
||||
"Content": "Disable Powershell 7 Telemetry",
|
||||
"Description": "Creates an Environment Variable called 'POWERSHELL_TELEMETRY_OPTOUT' with a value of '1' which will tell PowerShell 7 to not send Telemetry Data.",
|
||||
"Description": "This will create an Environment Variable called 'POWERSHELL_TELEMETRY_OPTOUT' with a value of '1' which will tell Powershell 7 to not send Telemetry Data.",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"InvokeScript": [
|
||||
@@ -1891,7 +1891,7 @@
|
||||
},
|
||||
"WPFTweaksWPBT": {
|
||||
"Content": "Disable Windows Platform Binary Table (WPBT)",
|
||||
"Description": "If enabled, WPBT allows your computer vendor to execute programs at boot time, such as anti-theft software, software drivers, as well as force install software without user consent. Poses potential security risk.",
|
||||
"Description": "If enabled then allows your computer vendor to execute a program each time it boots. It enables computer vendors to force install anti-theft software, software drivers, or a software program conveniently. This could also be a security risk.",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"registry": [
|
||||
@@ -1949,7 +1949,7 @@
|
||||
},
|
||||
"WPFTweaksDisableNotifications": {
|
||||
"Content": "Disable Notification Tray/Calendar",
|
||||
"Description": "Disables all Notifications INCLUDING Calendar.",
|
||||
"Description": "Disables all Notifications INCLUDING Calendar",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"registry": [
|
||||
@@ -1972,7 +1972,7 @@
|
||||
},
|
||||
"WPFTweaksBlockAdobeNet": {
|
||||
"Content": "Adobe Network Block",
|
||||
"Description": "Reduces user interruptions by selectively blocking connections to Adobe's activation and telemetry servers. Credit: Ruddernation-Designs",
|
||||
"Description": "Reduce user interruptions by selectively blocking connections to Adobe's activation and telemetry servers. Credit: Ruddernation-Designs",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"InvokeScript": [
|
||||
@@ -2002,7 +2002,7 @@
|
||||
},
|
||||
"WPFTweaksRightClickMenu": {
|
||||
"Content": "Set Classic Right-Click Menu ",
|
||||
"Description": "Restores the classic context menu when right-clicking in File Explorer, replacing the simplified Windows 11 version.",
|
||||
"Description": "Great Windows 11 tweak to bring back good context menus when right clicking things in explorer.",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"InvokeScript": [
|
||||
@@ -2037,7 +2037,7 @@
|
||||
},
|
||||
"WPFTweaksDeleteTempFiles": {
|
||||
"Content": "Delete Temporary Files",
|
||||
"Description": "Erases TEMP Folders.",
|
||||
"Description": "Erases TEMP Folders",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"InvokeScript": [
|
||||
@@ -2050,7 +2050,7 @@
|
||||
},
|
||||
"WPFTweaksIPv46": {
|
||||
"Content": "Prefer IPv4 over IPv6",
|
||||
"Description": "Setting the IPv4 preference can have latency and security benefits on private networks where IPv6 is not configured.",
|
||||
"Description": "To set the IPv4 preference can have latency and security benefits on private networks where IPv6 is not configured.",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"registry": [
|
||||
@@ -2066,7 +2066,7 @@
|
||||
},
|
||||
"WPFTweaksTeredo": {
|
||||
"Content": "Disable Teredo",
|
||||
"Description": "Teredo network tunneling is a IPv6 feature that can cause additional latency, but may cause problems with some games.",
|
||||
"Description": "Teredo network tunneling is a ipv6 feature that can cause additional latency, but may cause problems with some games",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"registry": [
|
||||
@@ -2110,7 +2110,7 @@
|
||||
},
|
||||
"WPFTweaksDisableBGapps": {
|
||||
"Content": "Disable Background Apps",
|
||||
"Description": "Disables all Microsoft Store apps from running in the background, which has to be done individually since Windows 11.",
|
||||
"Description": "Disables all Microsoft Store apps from running in the background, which has to be done individually since Win11",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"registry": [
|
||||
@@ -2126,7 +2126,7 @@
|
||||
},
|
||||
"WPFTweaksDisableFSO": {
|
||||
"Content": "Disable Fullscreen Optimizations",
|
||||
"Description": "Disables FSO in all applications. NOTE: This will disable Color Management in Exclusive Fullscreen.",
|
||||
"Description": "Disables FSO in all applications. NOTE: This will disable Color Management in Exclusive Fullscreen",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"registry": [
|
||||
@@ -2184,7 +2184,7 @@
|
||||
},
|
||||
"WPFToggleBingSearch": {
|
||||
"Content": "Bing Search in Start Menu",
|
||||
"Description": "If enabled, Bing web search results will be included in your Start Menu search.",
|
||||
"Description": "If enable then includes web search results from Bing in your Start Menu search.",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Type": "Toggle",
|
||||
@@ -2200,24 +2200,6 @@
|
||||
],
|
||||
"link": "https://winutil.christitus.com/dev/tweaks/customize-preferences/bingsearch"
|
||||
},
|
||||
"WPFToggleStandbyFix": {
|
||||
"Content": "Modern Standby fix",
|
||||
"Description": "Disable network connection during S0 sleep. If network connectivity is turned on during S0 sleep it could cause overheating on modern laptops",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Type": "Toggle",
|
||||
"registry": [
|
||||
{
|
||||
"Path": "HKCU:\\SOFTWARE\\Policies\\Microsoft\\Power\\PowerSettings\\f15576e8-98b7-4186-b944-eafa664402d9",
|
||||
"Name": "ACSettingIndex",
|
||||
"Value": "0",
|
||||
"Type": "DWord",
|
||||
"OriginalValue": "<RemoveEntry>",
|
||||
"DefaultState": "true"
|
||||
}
|
||||
],
|
||||
"link": "https://winutil.christitus.com/dev/tweaks/customize-preferences/standbyfix"
|
||||
},
|
||||
"WPFToggleNumLock": {
|
||||
"Content": "NumLock on Startup",
|
||||
"Description": "Toggle the Num Lock key state when your computer starts.",
|
||||
@@ -2264,7 +2246,7 @@
|
||||
},
|
||||
"WPFToggleStartMenuRecommendations": {
|
||||
"Content": "Recommendations in Start Menu",
|
||||
"Description": "If disabled, then you will not see recommendations in the Start Menu. WARNING: This will also disable Windows Spotlight on your Lock Screen as a side effect.",
|
||||
"Description": "If disabled then you will not see recommendations in the Start Menu. WARNING: This will also disable Windows Spotlight on your Lock Screen as a side effect.",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Type": "Toggle",
|
||||
@@ -2308,7 +2290,7 @@
|
||||
},
|
||||
"WPFToggleHideSettingsHome": {
|
||||
"Content": "Remove Settings Home Page",
|
||||
"Description": "Removes the Home Page in the Windows Settings app.",
|
||||
"Description": "Removes the Home page in the Windows Settings app.",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Type": "Toggle",
|
||||
@@ -2326,7 +2308,7 @@
|
||||
},
|
||||
"WPFToggleMouseAcceleration": {
|
||||
"Content": "Mouse Acceleration",
|
||||
"Description": "If enabled, the Cursor movement is affected by the speed of your physical mouse movements.",
|
||||
"Description": "If Enabled then Cursor movement is affected by the speed of your physical mouse movements.",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Type": "Toggle",
|
||||
@@ -2360,7 +2342,7 @@
|
||||
},
|
||||
"WPFToggleStickyKeys": {
|
||||
"Content": "Sticky Keys",
|
||||
"Description": "If enabled, 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.",
|
||||
"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",
|
||||
"Type": "Toggle",
|
||||
@@ -2378,7 +2360,7 @@
|
||||
},
|
||||
"WPFToggleNewOutlook": {
|
||||
"Content": "New Outlook",
|
||||
"Description": "If disabled, it removes the new Outlook toggle, disables the new Outlook migration, and ensures the classic Outlook application is used.",
|
||||
"Description": "If disabled it removes the toggle for new Outlook, disables the new Outlook migration and makes sure the Outlook Application actually uses the old Outlook.",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Type": "Toggle",
|
||||
@@ -2438,7 +2420,7 @@
|
||||
},
|
||||
"WPFToggleHiddenFiles": {
|
||||
"Content": "Show Hidden Files",
|
||||
"Description": "If enabled, Hidden Files will be shown.",
|
||||
"Description": "If Enabled then Hidden Files will be shown.",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Type": "Toggle",
|
||||
@@ -2466,7 +2448,7 @@
|
||||
},
|
||||
"WPFToggleShowExt": {
|
||||
"Content": "Show File Extensions",
|
||||
"Description": "If enabled, File extensions (e.g., .txt, .jpg) are visible.",
|
||||
"Description": "If enabled then File extensions (e.g., .txt, .jpg) are visible.",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Type": "Toggle",
|
||||
@@ -2494,7 +2476,7 @@
|
||||
},
|
||||
"WPFToggleTaskbarSearch": {
|
||||
"Content": "Search Button in Taskbar",
|
||||
"Description": "If enabled, Search Button will be on the Taskbar.",
|
||||
"Description": "If Enabled Search Button will be on the taskbar.",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Type": "Toggle",
|
||||
@@ -2512,7 +2494,7 @@
|
||||
},
|
||||
"WPFToggleTaskView": {
|
||||
"Content": "Task View Button in Taskbar",
|
||||
"Description": "If enabled, Task View Button in Taskbar will be shown.",
|
||||
"Description": "If Enabled then Task View Button in Taskbar will be shown.",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Type": "Toggle",
|
||||
@@ -2530,7 +2512,7 @@
|
||||
},
|
||||
"WPFToggleTaskbarAlignment": {
|
||||
"Content": "Center Taskbar Items",
|
||||
"Description": "[Windows 11] If enabled, the Taskbar Items will be shown on the Center, otherwise the Taskbar Items will be shown on the Left.",
|
||||
"Description": "[Windows 11] If Enabled then the Taskbar Items will be shown on the Center, otherwise the Taskbar Items will be shown on the Left.",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Type": "Toggle",
|
||||
@@ -2558,7 +2540,7 @@
|
||||
},
|
||||
"WPFToggleDetailedBSoD": {
|
||||
"Content": "Detailed BSoD",
|
||||
"Description": "If enabled, you will see a detailed Blue Screen of Death (BSOD) with more information.",
|
||||
"Description": "If Enabled then you will see a detailed Blue Screen of Death (BSOD) with more information.",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Type": "Toggle",
|
||||
@@ -2584,7 +2566,7 @@
|
||||
},
|
||||
"WPFToggleS3Sleep": {
|
||||
"Content": "S3 Sleep",
|
||||
"Description": "Toggles between Modern Standby and S3 Sleep.",
|
||||
"Description": "Toggles between Modern Standby and S3 sleep.",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Type": "Toggle",
|
||||
@@ -2633,7 +2615,7 @@
|
||||
},
|
||||
"WPFTweaksDisableExplorerAutoDiscovery": {
|
||||
"Content": "Disable Explorer Automatic Folder Discovery",
|
||||
"Description": "Windows Explorer automatically tries to guess the type of the folder based on its contents, slowing down the browsing experience. WARNING! Will disable File Explorer grouping.",
|
||||
"Description": "Windows Explorer automatically tries to guess the type of the folder based on its contents, slowing down the browsing experience.",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"InvokeScript": [
|
||||
|
||||
@@ -3,12 +3,13 @@ title: "Disable Legacy F8 Boot Recovery"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/feature.json",linenos=inline,linenostart=100}
|
||||
```json {filename="config/feature.json",linenos=inline,linenostart=107}
|
||||
"WPFFeatureDisableLegacyRecovery": {
|
||||
"Content": "Disable Legacy F8 Boot Recovery",
|
||||
"Description": "Disables Advanced Boot Options screen that lets you start Windows in advanced troubleshooting modes.",
|
||||
"category": "Features",
|
||||
"panel": "1",
|
||||
"Order": "a019_",
|
||||
"feature": [],
|
||||
"InvokeScript": [
|
||||
"bcdedit /set bootmenupolicy standard"
|
||||
|
||||
@@ -3,12 +3,13 @@ title: "Enable Legacy F8 Boot Recovery"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/feature.json",linenos=inline,linenostart=89}
|
||||
```json {filename="config/feature.json",linenos=inline,linenostart=95}
|
||||
"WPFFeatureEnableLegacyRecovery": {
|
||||
"Content": "Enable Legacy F8 Boot Recovery",
|
||||
"Description": "Enables Advanced Boot Options screen that lets you start Windows in advanced troubleshooting modes.",
|
||||
"category": "Features",
|
||||
"panel": "1",
|
||||
"Order": "a018_",
|
||||
"feature": [],
|
||||
"InvokeScript": [
|
||||
"bcdedit /set bootmenupolicy legacy"
|
||||
|
||||
@@ -3,12 +3,13 @@ title: "Enable Daily Registry Backup Task 12.30am"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/feature.json",linenos=inline,linenostart=72}
|
||||
```json {filename="config/feature.json",linenos=inline,linenostart=77}
|
||||
"WPFFeatureRegBackup": {
|
||||
"Content": "Enable Daily Registry Backup Task 12.30am",
|
||||
"Description": "Enables daily registry backup, previously disabled by Microsoft in Windows 10 1803.",
|
||||
"category": "Features",
|
||||
"panel": "1",
|
||||
"Order": "a017_",
|
||||
"feature": [],
|
||||
"InvokeScript": [
|
||||
"
|
||||
|
||||
@@ -3,12 +3,13 @@ title: "Windows Sandbox"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/feature.json",linenos=inline,linenostart=111}
|
||||
```json {filename="config/feature.json",linenos=inline,linenostart=119}
|
||||
"WPFFeaturesSandbox": {
|
||||
"Content": "Windows Sandbox",
|
||||
"Description": "Windows Sandbox is a lightweight virtual machine that provides a temporary desktop environment to safely run applications and programs in isolation.",
|
||||
"category": "Features",
|
||||
"panel": "1",
|
||||
"Order": "a021_",
|
||||
"feature": [
|
||||
"Containers-DisposableClientVM"
|
||||
],
|
||||
|
||||
@@ -9,6 +9,7 @@ description: ""
|
||||
"Description": ".NET and .NET Framework is a developer platform made up of tools, programming languages, and libraries for building many different types of applications.",
|
||||
"category": "Features",
|
||||
"panel": "1",
|
||||
"Order": "a010_",
|
||||
"feature": [
|
||||
"NetFx4-AdvSrvs",
|
||||
"NetFx3"
|
||||
|
||||
@@ -3,12 +3,13 @@ title: "HyperV Virtualization"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/feature.json",linenos=inline,linenostart=14}
|
||||
```json {filename="config/feature.json",linenos=inline,linenostart=15}
|
||||
"WPFFeatureshyperv": {
|
||||
"Content": "HyperV Virtualization",
|
||||
"Description": "Hyper-V is a hardware virtualization product developed by Microsoft that allows users to create and manage virtual machines.",
|
||||
"category": "Features",
|
||||
"panel": "1",
|
||||
"Order": "a011_",
|
||||
"feature": [
|
||||
"Microsoft-Hyper-V-All"
|
||||
],
|
||||
|
||||
@@ -3,12 +3,13 @@ title: "Legacy Media (WMP, DirectPlay)"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/feature.json",linenos=inline,linenostart=27}
|
||||
```json {filename="config/feature.json",linenos=inline,linenostart=29}
|
||||
"WPFFeatureslegacymedia": {
|
||||
"Content": "Legacy Media (WMP, DirectPlay)",
|
||||
"Description": "Enables legacy programs from previous versions of Windows.",
|
||||
"Description": "Enables legacy programs from previous versions of windows",
|
||||
"category": "Features",
|
||||
"panel": "1",
|
||||
"Order": "a012_",
|
||||
"feature": [
|
||||
"WindowsMediaPlayer",
|
||||
"MediaPlayback",
|
||||
|
||||
@@ -3,12 +3,13 @@ title: "NFS - Network File System"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/feature.json",linenos=inline,linenostart=53}
|
||||
```json {filename="config/feature.json",linenos=inline,linenostart=57}
|
||||
"WPFFeaturenfs": {
|
||||
"Content": "NFS - Network File System",
|
||||
"Description": "Network File System (NFS) is a mechanism for storing files on a network.",
|
||||
"category": "Features",
|
||||
"panel": "1",
|
||||
"Order": "a014_",
|
||||
"feature": [
|
||||
"ServicesForNFS-ClientOnly",
|
||||
"ClientForNFS-Infrastructure",
|
||||
|
||||
@@ -3,12 +3,13 @@ title: "Windows Subsystem for Linux"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/feature.json",linenos=inline,linenostart=41}
|
||||
```json {filename="config/feature.json",linenos=inline,linenostart=44}
|
||||
"WPFFeaturewsl": {
|
||||
"Content": "Windows Subsystem for Linux",
|
||||
"Description": "Windows Subsystem for Linux is an optional feature of Windows that allows Linux programs to run natively on Windows without the need for a separate virtual machine or dual booting.",
|
||||
"category": "Features",
|
||||
"panel": "1",
|
||||
"Order": "a020_",
|
||||
"feature": [
|
||||
"VirtualMachinePlatform",
|
||||
"Microsoft-Windows-Subsystem-Linux"
|
||||
|
||||
@@ -8,15 +8,13 @@ function Invoke-WPFSystemRepair {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks for system corruption using SFC, and DISM
|
||||
Checks for disk failure using Chkdsk
|
||||
|
||||
.DESCRIPTION
|
||||
1. Chkdsk - Checks for disk errors, which can cause system file corruption and notifies of early disk failure
|
||||
2. SFC - scans protected system files for corruption and fixes them
|
||||
3. DISM - Repair a corrupted Windows operating system image
|
||||
1. SFC - Fixes system file corruption, and fixes DISM if it was corrupted
|
||||
2. DISM - Fixes system image corruption, and fixes SFC's system image if it was corrupted
|
||||
3. Chkdsk - Checks for disk errors, which can cause system file corruption and notifies of early disk failure
|
||||
#>
|
||||
|
||||
Start-Process cmd.exe -ArgumentList "/c chkdsk /scan /perf" -NoNewWindow -Wait
|
||||
Start-Process cmd.exe -ArgumentList "/c chkdsk.exe /scan /perf" -NoNewWindow -Wait
|
||||
Start-Process cmd.exe -ArgumentList "/c sfc /scannow" -NoNewWindow -Wait
|
||||
Start-Process cmd.exe -ArgumentList "/c dism /online /cleanup-image /restorehealth" -NoNewWindow -Wait
|
||||
|
||||
|
||||
@@ -3,14 +3,31 @@ title: "Computer Management"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/feature.json",linenos=inline,linenostart=186}
|
||||
"WPFPanelComputer": {
|
||||
"Content": "Computer Management",
|
||||
"category": "Legacy Windows Panels",
|
||||
"panel": "2",
|
||||
"Type": "Button",
|
||||
"ButtonWidth": "300",
|
||||
"InvokeScript": [
|
||||
"compmgmt.msc"
|
||||
],
|
||||
```powershell {filename="functions/public/Invoke-WPFControlPanel.ps1",linenos=inline,linenostart=1}
|
||||
function Invoke-WPFControlPanel {
|
||||
<#
|
||||
|
||||
.SYNOPSIS
|
||||
Opens the requested legacy panel
|
||||
|
||||
.PARAMETER Panel
|
||||
The panel to open
|
||||
|
||||
#>
|
||||
param($Panel)
|
||||
|
||||
switch ($Panel) {
|
||||
"WPFPanelControl" {control}
|
||||
"WPFPanelComputer" {compmgmt.msc}
|
||||
"WPFPanelNetwork" {ncpa.cpl}
|
||||
"WPFPanelPower" {powercfg.cpl}
|
||||
"WPFPanelPrinter" {Start-Process "shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}"}
|
||||
"WPFPanelRegion" {intl.cpl}
|
||||
"WPFPanelRestore" {rstrui.exe}
|
||||
"WPFPanelSound" {mmsys.cpl}
|
||||
"WPFPanelSystem" {sysdm.cpl}
|
||||
"WPFPanelTimedate" {timedate.cpl}
|
||||
"WPFPanelUser" {control userpasswords2}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -3,14 +3,31 @@ title: "Control Panel"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/feature.json",linenos=inline,linenostart=175}
|
||||
"WPFPanelControl": {
|
||||
"Content": "Control Panel",
|
||||
"category": "Legacy Windows Panels",
|
||||
"panel": "2",
|
||||
"Type": "Button",
|
||||
"ButtonWidth": "300",
|
||||
"InvokeScript": [
|
||||
"control"
|
||||
],
|
||||
```powershell {filename="functions/public/Invoke-WPFControlPanel.ps1",linenos=inline,linenostart=1}
|
||||
function Invoke-WPFControlPanel {
|
||||
<#
|
||||
|
||||
.SYNOPSIS
|
||||
Opens the requested legacy panel
|
||||
|
||||
.PARAMETER Panel
|
||||
The panel to open
|
||||
|
||||
#>
|
||||
param($Panel)
|
||||
|
||||
switch ($Panel) {
|
||||
"WPFPanelControl" {control}
|
||||
"WPFPanelComputer" {compmgmt.msc}
|
||||
"WPFPanelNetwork" {ncpa.cpl}
|
||||
"WPFPanelPower" {powercfg.cpl}
|
||||
"WPFPanelPrinter" {Start-Process "shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}"}
|
||||
"WPFPanelRegion" {intl.cpl}
|
||||
"WPFPanelRestore" {rstrui.exe}
|
||||
"WPFPanelSound" {mmsys.cpl}
|
||||
"WPFPanelSystem" {sysdm.cpl}
|
||||
"WPFPanelTimedate" {timedate.cpl}
|
||||
"WPFPanelUser" {control userpasswords2}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -3,14 +3,31 @@ title: "Network Connections"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/feature.json",linenos=inline,linenostart=197}
|
||||
"WPFPanelNetwork": {
|
||||
"Content": "Network Connections",
|
||||
"category": "Legacy Windows Panels",
|
||||
"panel": "2",
|
||||
"Type": "Button",
|
||||
"ButtonWidth": "300",
|
||||
"InvokeScript": [
|
||||
"ncpa.cpl"
|
||||
],
|
||||
```powershell {filename="functions/public/Invoke-WPFControlPanel.ps1",linenos=inline,linenostart=1}
|
||||
function Invoke-WPFControlPanel {
|
||||
<#
|
||||
|
||||
.SYNOPSIS
|
||||
Opens the requested legacy panel
|
||||
|
||||
.PARAMETER Panel
|
||||
The panel to open
|
||||
|
||||
#>
|
||||
param($Panel)
|
||||
|
||||
switch ($Panel) {
|
||||
"WPFPanelControl" {control}
|
||||
"WPFPanelComputer" {compmgmt.msc}
|
||||
"WPFPanelNetwork" {ncpa.cpl}
|
||||
"WPFPanelPower" {powercfg.cpl}
|
||||
"WPFPanelPrinter" {Start-Process "shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}"}
|
||||
"WPFPanelRegion" {intl.cpl}
|
||||
"WPFPanelRestore" {rstrui.exe}
|
||||
"WPFPanelSound" {mmsys.cpl}
|
||||
"WPFPanelSystem" {sysdm.cpl}
|
||||
"WPFPanelTimedate" {timedate.cpl}
|
||||
"WPFPanelUser" {control userpasswords2}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -3,14 +3,31 @@ title: "Power Panel"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/feature.json",linenos=inline,linenostart=208}
|
||||
"WPFPanelPower": {
|
||||
"Content": "Power Panel",
|
||||
"category": "Legacy Windows Panels",
|
||||
"panel": "2",
|
||||
"Type": "Button",
|
||||
"ButtonWidth": "300",
|
||||
"InvokeScript": [
|
||||
"powercfg.cpl"
|
||||
],
|
||||
```powershell {filename="functions/public/Invoke-WPFControlPanel.ps1",linenos=inline,linenostart=1}
|
||||
function Invoke-WPFControlPanel {
|
||||
<#
|
||||
|
||||
.SYNOPSIS
|
||||
Opens the requested legacy panel
|
||||
|
||||
.PARAMETER Panel
|
||||
The panel to open
|
||||
|
||||
#>
|
||||
param($Panel)
|
||||
|
||||
switch ($Panel) {
|
||||
"WPFPanelControl" {control}
|
||||
"WPFPanelComputer" {compmgmt.msc}
|
||||
"WPFPanelNetwork" {ncpa.cpl}
|
||||
"WPFPanelPower" {powercfg.cpl}
|
||||
"WPFPanelPrinter" {Start-Process "shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}"}
|
||||
"WPFPanelRegion" {intl.cpl}
|
||||
"WPFPanelRestore" {rstrui.exe}
|
||||
"WPFPanelSound" {mmsys.cpl}
|
||||
"WPFPanelSystem" {sysdm.cpl}
|
||||
"WPFPanelTimedate" {timedate.cpl}
|
||||
"WPFPanelUser" {control userpasswords2}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -3,14 +3,31 @@ title: "Printer Panel"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/feature.json",linenos=inline,linenostart=219}
|
||||
"WPFPanelPrinter": {
|
||||
"Content": "Printer Panel",
|
||||
"category": "Legacy Windows Panels",
|
||||
"panel": "2",
|
||||
"Type": "Button",
|
||||
"ButtonWidth": "300",
|
||||
"InvokeScript": [
|
||||
"Start-Process 'shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}'"
|
||||
],
|
||||
```powershell {filename="functions/public/Invoke-WPFControlPanel.ps1",linenos=inline,linenostart=1}
|
||||
function Invoke-WPFControlPanel {
|
||||
<#
|
||||
|
||||
.SYNOPSIS
|
||||
Opens the requested legacy panel
|
||||
|
||||
.PARAMETER Panel
|
||||
The panel to open
|
||||
|
||||
#>
|
||||
param($Panel)
|
||||
|
||||
switch ($Panel) {
|
||||
"WPFPanelControl" {control}
|
||||
"WPFPanelComputer" {compmgmt.msc}
|
||||
"WPFPanelNetwork" {ncpa.cpl}
|
||||
"WPFPanelPower" {powercfg.cpl}
|
||||
"WPFPanelPrinter" {Start-Process "shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}"}
|
||||
"WPFPanelRegion" {intl.cpl}
|
||||
"WPFPanelRestore" {rstrui.exe}
|
||||
"WPFPanelSound" {mmsys.cpl}
|
||||
"WPFPanelSystem" {sysdm.cpl}
|
||||
"WPFPanelTimedate" {timedate.cpl}
|
||||
"WPFPanelUser" {control userpasswords2}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -3,14 +3,31 @@ title: "Region"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/feature.json",linenos=inline,linenostart=230}
|
||||
"WPFPanelRegion": {
|
||||
"Content": "Region",
|
||||
"category": "Legacy Windows Panels",
|
||||
"panel": "2",
|
||||
"Type": "Button",
|
||||
"ButtonWidth": "300",
|
||||
"InvokeScript": [
|
||||
"intl.cpl"
|
||||
],
|
||||
```powershell {filename="functions/public/Invoke-WPFControlPanel.ps1",linenos=inline,linenostart=1}
|
||||
function Invoke-WPFControlPanel {
|
||||
<#
|
||||
|
||||
.SYNOPSIS
|
||||
Opens the requested legacy panel
|
||||
|
||||
.PARAMETER Panel
|
||||
The panel to open
|
||||
|
||||
#>
|
||||
param($Panel)
|
||||
|
||||
switch ($Panel) {
|
||||
"WPFPanelControl" {control}
|
||||
"WPFPanelComputer" {compmgmt.msc}
|
||||
"WPFPanelNetwork" {ncpa.cpl}
|
||||
"WPFPanelPower" {powercfg.cpl}
|
||||
"WPFPanelPrinter" {Start-Process "shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}"}
|
||||
"WPFPanelRegion" {intl.cpl}
|
||||
"WPFPanelRestore" {rstrui.exe}
|
||||
"WPFPanelSound" {mmsys.cpl}
|
||||
"WPFPanelSystem" {sysdm.cpl}
|
||||
"WPFPanelTimedate" {timedate.cpl}
|
||||
"WPFPanelUser" {control userpasswords2}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -3,14 +3,31 @@ title: "Windows Restore"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/feature.json",linenos=inline,linenostart=241}
|
||||
"WPFPanelRestore": {
|
||||
"Content": "Windows Restore",
|
||||
"category": "Legacy Windows Panels",
|
||||
"panel": "2",
|
||||
"Type": "Button",
|
||||
"ButtonWidth": "300",
|
||||
"InvokeScript": [
|
||||
"rstrui.exe"
|
||||
],
|
||||
```powershell {filename="functions/public/Invoke-WPFControlPanel.ps1",linenos=inline,linenostart=1}
|
||||
function Invoke-WPFControlPanel {
|
||||
<#
|
||||
|
||||
.SYNOPSIS
|
||||
Opens the requested legacy panel
|
||||
|
||||
.PARAMETER Panel
|
||||
The panel to open
|
||||
|
||||
#>
|
||||
param($Panel)
|
||||
|
||||
switch ($Panel) {
|
||||
"WPFPanelControl" {control}
|
||||
"WPFPanelComputer" {compmgmt.msc}
|
||||
"WPFPanelNetwork" {ncpa.cpl}
|
||||
"WPFPanelPower" {powercfg.cpl}
|
||||
"WPFPanelPrinter" {Start-Process "shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}"}
|
||||
"WPFPanelRegion" {intl.cpl}
|
||||
"WPFPanelRestore" {rstrui.exe}
|
||||
"WPFPanelSound" {mmsys.cpl}
|
||||
"WPFPanelSystem" {sysdm.cpl}
|
||||
"WPFPanelTimedate" {timedate.cpl}
|
||||
"WPFPanelUser" {control userpasswords2}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -3,14 +3,31 @@ title: "Sound Settings"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/feature.json",linenos=inline,linenostart=252}
|
||||
"WPFPanelSound": {
|
||||
"Content": "Sound Settings",
|
||||
"category": "Legacy Windows Panels",
|
||||
"panel": "2",
|
||||
"Type": "Button",
|
||||
"ButtonWidth": "300",
|
||||
"InvokeScript": [
|
||||
"mmsys.cpl"
|
||||
],
|
||||
```powershell {filename="functions/public/Invoke-WPFControlPanel.ps1",linenos=inline,linenostart=1}
|
||||
function Invoke-WPFControlPanel {
|
||||
<#
|
||||
|
||||
.SYNOPSIS
|
||||
Opens the requested legacy panel
|
||||
|
||||
.PARAMETER Panel
|
||||
The panel to open
|
||||
|
||||
#>
|
||||
param($Panel)
|
||||
|
||||
switch ($Panel) {
|
||||
"WPFPanelControl" {control}
|
||||
"WPFPanelComputer" {compmgmt.msc}
|
||||
"WPFPanelNetwork" {ncpa.cpl}
|
||||
"WPFPanelPower" {powercfg.cpl}
|
||||
"WPFPanelPrinter" {Start-Process "shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}"}
|
||||
"WPFPanelRegion" {intl.cpl}
|
||||
"WPFPanelRestore" {rstrui.exe}
|
||||
"WPFPanelSound" {mmsys.cpl}
|
||||
"WPFPanelSystem" {sysdm.cpl}
|
||||
"WPFPanelTimedate" {timedate.cpl}
|
||||
"WPFPanelUser" {control userpasswords2}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -3,14 +3,31 @@ title: "System Properties"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/feature.json",linenos=inline,linenostart=263}
|
||||
"WPFPanelSystem": {
|
||||
"Content": "System Properties",
|
||||
"category": "Legacy Windows Panels",
|
||||
"panel": "2",
|
||||
"Type": "Button",
|
||||
"ButtonWidth": "300",
|
||||
"InvokeScript": [
|
||||
"sysdm.cpl"
|
||||
],
|
||||
```powershell {filename="functions/public/Invoke-WPFControlPanel.ps1",linenos=inline,linenostart=1}
|
||||
function Invoke-WPFControlPanel {
|
||||
<#
|
||||
|
||||
.SYNOPSIS
|
||||
Opens the requested legacy panel
|
||||
|
||||
.PARAMETER Panel
|
||||
The panel to open
|
||||
|
||||
#>
|
||||
param($Panel)
|
||||
|
||||
switch ($Panel) {
|
||||
"WPFPanelControl" {control}
|
||||
"WPFPanelComputer" {compmgmt.msc}
|
||||
"WPFPanelNetwork" {ncpa.cpl}
|
||||
"WPFPanelPower" {powercfg.cpl}
|
||||
"WPFPanelPrinter" {Start-Process "shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}"}
|
||||
"WPFPanelRegion" {intl.cpl}
|
||||
"WPFPanelRestore" {rstrui.exe}
|
||||
"WPFPanelSound" {mmsys.cpl}
|
||||
"WPFPanelSystem" {sysdm.cpl}
|
||||
"WPFPanelTimedate" {timedate.cpl}
|
||||
"WPFPanelUser" {control userpasswords2}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -3,14 +3,31 @@ title: "Time and Date"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/feature.json",linenos=inline,linenostart=274}
|
||||
"WPFPanelTimedate": {
|
||||
"Content": "Time and Date",
|
||||
"category": "Legacy Windows Panels",
|
||||
"panel": "2",
|
||||
"Type": "Button",
|
||||
"ButtonWidth": "300",
|
||||
"InvokeScript": [
|
||||
"timedate.cpl"
|
||||
],
|
||||
```powershell {filename="functions/public/Invoke-WPFControlPanel.ps1",linenos=inline,linenostart=1}
|
||||
function Invoke-WPFControlPanel {
|
||||
<#
|
||||
|
||||
.SYNOPSIS
|
||||
Opens the requested legacy panel
|
||||
|
||||
.PARAMETER Panel
|
||||
The panel to open
|
||||
|
||||
#>
|
||||
param($Panel)
|
||||
|
||||
switch ($Panel) {
|
||||
"WPFPanelControl" {control}
|
||||
"WPFPanelComputer" {compmgmt.msc}
|
||||
"WPFPanelNetwork" {ncpa.cpl}
|
||||
"WPFPanelPower" {powercfg.cpl}
|
||||
"WPFPanelPrinter" {Start-Process "shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}"}
|
||||
"WPFPanelRegion" {intl.cpl}
|
||||
"WPFPanelRestore" {rstrui.exe}
|
||||
"WPFPanelSound" {mmsys.cpl}
|
||||
"WPFPanelSystem" {sysdm.cpl}
|
||||
"WPFPanelTimedate" {timedate.cpl}
|
||||
"WPFPanelUser" {control userpasswords2}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
---
|
||||
title: "Install CTT PowerShell Profile"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```powershell {filename="functions/private/Invoke-WinUtilInstallPSProfile.ps1",linenos=inline,linenostart=1}
|
||||
function Invoke-WinUtilInstallPSProfile {
|
||||
|
||||
if (Test-Path $Profile) {
|
||||
Rename-Item $Profile -NewName ($Profile + '.bak')
|
||||
}
|
||||
|
||||
Start-Process pwsh -ArgumentList '-Command "irm https://github.com/ChrisTitusTech/powershell-profile/raw/main/setup.ps1 | iex"'
|
||||
}
|
||||
```
|
||||
@@ -1,18 +0,0 @@
|
||||
---
|
||||
title: "Uninstall CTT PowerShell Profile"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```powershell {filename="functions/private/Invoke-WinUtilUninstallPSProfile.ps1",linenos=inline,linenostart=1}
|
||||
function Invoke-WinUtilUninstallPSProfile {
|
||||
if (Test-Path ($Profile + '.bak')) {
|
||||
Remove-Item $Profile
|
||||
Rename-Item ($Profile + '.bak') -NewName $Profile
|
||||
}
|
||||
else {
|
||||
Remove-Item $Profile
|
||||
}
|
||||
|
||||
Write-Host "Successfully uninstalled CTT Powershell Profile" -ForegroundColor Green
|
||||
}
|
||||
```
|
||||
@@ -1,24 +0,0 @@
|
||||
---
|
||||
title: "Enable OpenSSH Server"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```powershell {filename="functions/public/Invoke-WPFSSHServer.ps1",linenos=inline,linenostart=1}
|
||||
function Invoke-WPFSSHServer {
|
||||
<#
|
||||
|
||||
.SYNOPSIS
|
||||
Invokes the OpenSSH Server install in a runspace
|
||||
|
||||
#>
|
||||
|
||||
Invoke-WPFRunspace -ScriptBlock {
|
||||
|
||||
Invoke-WinUtilSSHServer
|
||||
|
||||
Write-Host "======================================="
|
||||
Write-Host "-- OpenSSH Server installed! ---"
|
||||
Write-Host "======================================="
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -6,7 +6,7 @@ description: ""
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2185}
|
||||
"WPFToggleBingSearch": {
|
||||
"Content": "Bing Search in Start Menu",
|
||||
"Description": "If enabled, Bing web search results will be included in your Start Menu search.",
|
||||
"Description": "If enable then includes web search results from Bing in your Start Menu search.",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Type": "Toggle",
|
||||
|
||||
@@ -3,10 +3,10 @@ title: "Detailed BSoD"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2559}
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2541}
|
||||
"WPFToggleDetailedBSoD": {
|
||||
"Content": "Detailed BSoD",
|
||||
"Description": "If enabled, you will see a detailed Blue Screen of Death (BSOD) with more information.",
|
||||
"Description": "If Enabled then you will see a detailed Blue Screen of Death (BSOD) with more information.",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Type": "Toggle",
|
||||
|
||||
@@ -3,7 +3,7 @@ title: "Cross-Device Resume"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2689}
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2671}
|
||||
"WPFToggleDisableCrossDeviceResume": {
|
||||
"Content": "Cross-Device Resume",
|
||||
"Description": "This tweak controls the Resume function in Windows 11 24H2 and later, which allows you to resume an activity from a mobile device and vice-versa.",
|
||||
|
||||
@@ -3,10 +3,10 @@ title: "Show Hidden Files"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2439}
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2421}
|
||||
"WPFToggleHiddenFiles": {
|
||||
"Content": "Show Hidden Files",
|
||||
"Description": "If enabled, Hidden Files will be shown.",
|
||||
"Description": "If Enabled then Hidden Files will be shown.",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Type": "Toggle",
|
||||
|
||||
@@ -3,10 +3,10 @@ title: "Remove Settings Home Page"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2309}
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2291}
|
||||
"WPFToggleHideSettingsHome": {
|
||||
"Content": "Remove Settings Home Page",
|
||||
"Description": "Removes the Home Page in the Windows Settings app.",
|
||||
"Description": "Removes the Home page in the Windows Settings app.",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Type": "Toggle",
|
||||
|
||||
@@ -3,10 +3,10 @@ title: "Mouse Acceleration"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2327}
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2309}
|
||||
"WPFToggleMouseAcceleration": {
|
||||
"Content": "Mouse Acceleration",
|
||||
"Description": "If enabled, the Cursor movement is affected by the speed of your physical mouse movements.",
|
||||
"Description": "If Enabled then Cursor movement is affected by the speed of your physical mouse movements.",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Type": "Toggle",
|
||||
|
||||
@@ -3,7 +3,7 @@ title: "Disable Multiplane Overlay"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2421}
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2403}
|
||||
"WPFToggleMultiplaneOverlay": {
|
||||
"Content": "Disable Multiplane Overlay",
|
||||
"Description": "Disable the Multiplane Overlay which can sometimes cause issues with Graphics Cards.",
|
||||
|
||||
@@ -3,10 +3,10 @@ title: "New Outlook"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2379}
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2361}
|
||||
"WPFToggleNewOutlook": {
|
||||
"Content": "New Outlook",
|
||||
"Description": "If disabled, it removes the new Outlook toggle, disables the new Outlook migration, and ensures the classic Outlook application is used.",
|
||||
"Description": "If disabled it removes the toggle for new Outlook, disables the new Outlook migration and makes sure the Outlook Application actually uses the old Outlook.",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Type": "Toggle",
|
||||
|
||||
@@ -3,7 +3,7 @@ title: "Num Lock on Startup"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2221}
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2203}
|
||||
"WPFToggleNumLock": {
|
||||
"Content": "NumLock on Startup",
|
||||
"Description": "Toggle the Num Lock key state when your computer starts.",
|
||||
|
||||
@@ -3,10 +3,10 @@ title: "S3 Sleep"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2585}
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2567}
|
||||
"WPFToggleS3Sleep": {
|
||||
"Content": "S3 Sleep",
|
||||
"Description": "Toggles between Modern Standby and S3 Sleep.",
|
||||
"Description": "Toggles between Modern Standby and S3 sleep.",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Type": "Toggle",
|
||||
|
||||
@@ -3,10 +3,10 @@ title: "Show File Extensions"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2467}
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2449}
|
||||
"WPFToggleShowExt": {
|
||||
"Content": "Show File Extensions",
|
||||
"Description": "If enabled, File extensions (e.g., .txt, .jpg) are visible.",
|
||||
"Description": "If enabled then File extensions (e.g., .txt, .jpg) are visible.",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Type": "Toggle",
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
---
|
||||
title: "Modern Standby fix"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2203}
|
||||
"WPFToggleStandbyFix": {
|
||||
"Content": "Modern Standby fix",
|
||||
"Description": "Disable network connection during S0 sleep. If network connectivity is turned on during S0 sleep it could cause overheating on modern laptops",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Type": "Toggle",
|
||||
"registry": [
|
||||
{
|
||||
"Path": "HKCU:\\SOFTWARE\\Policies\\Microsoft\\Power\\PowerSettings\\f15576e8-98b7-4186-b944-eafa664402d9",
|
||||
"Name": "ACSettingIndex",
|
||||
"Value": "0",
|
||||
"Type": "DWord",
|
||||
"OriginalValue": "<RemoveEntry>",
|
||||
"DefaultState": "true"
|
||||
}
|
||||
],
|
||||
```
|
||||
|
||||
## Registry Changes
|
||||
|
||||
Applications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.
|
||||
|
||||
You can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).
|
||||
@@ -3,10 +3,10 @@ title: "Recommendations in Start Menu"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2265}
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2247}
|
||||
"WPFToggleStartMenuRecommendations": {
|
||||
"Content": "Recommendations in Start Menu",
|
||||
"Description": "If disabled, then you will not see recommendations in the Start Menu. WARNING: This will also disable Windows Spotlight on your Lock Screen as a side effect.",
|
||||
"Description": "If disabled then you will not see recommendations in the Start Menu. WARNING: This will also disable Windows Spotlight on your Lock Screen as a side effect.",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Type": "Toggle",
|
||||
|
||||
@@ -3,10 +3,10 @@ title: "Sticky Keys"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2361}
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2343}
|
||||
"WPFToggleStickyKeys": {
|
||||
"Content": "Sticky Keys",
|
||||
"Description": "If enabled, 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.",
|
||||
"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",
|
||||
"Type": "Toggle",
|
||||
|
||||
@@ -3,10 +3,10 @@ title: "Task View Button in Taskbar"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2513}
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2495}
|
||||
"WPFToggleTaskView": {
|
||||
"Content": "Task View Button in Taskbar",
|
||||
"Description": "If enabled, Task View Button in Taskbar will be shown.",
|
||||
"Description": "If Enabled then Task View Button in Taskbar will be shown.",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Type": "Toggle",
|
||||
|
||||
@@ -3,10 +3,10 @@ title: "Center Taskbar Items"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2531}
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2513}
|
||||
"WPFToggleTaskbarAlignment": {
|
||||
"Content": "Center Taskbar Items",
|
||||
"Description": "[Windows 11] If enabled, the Taskbar Items will be shown on the Center, otherwise the Taskbar Items will be shown on the Left.",
|
||||
"Description": "[Windows 11] If Enabled then the Taskbar Items will be shown on the Center, otherwise the Taskbar Items will be shown on the Left.",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Type": "Toggle",
|
||||
|
||||
@@ -3,10 +3,10 @@ title: "Search Button in Taskbar"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2495}
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2477}
|
||||
"WPFToggleTaskbarSearch": {
|
||||
"Content": "Search Button in Taskbar",
|
||||
"Description": "If enabled, Search Button will be on the Taskbar.",
|
||||
"Description": "If Enabled Search Button will be on the taskbar.",
|
||||
"category": "Customize Preferences",
|
||||
"panel": "2",
|
||||
"Type": "Toggle",
|
||||
|
||||
@@ -3,7 +3,7 @@ title: "Verbose Messages During Logon"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2247}
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2229}
|
||||
"WPFToggleVerboseLogon": {
|
||||
"Content": "Verbose Messages During Logon",
|
||||
"Description": "Show detailed messages during the login process for troubleshooting and diagnostics.",
|
||||
|
||||
@@ -6,7 +6,7 @@ description: ""
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2}
|
||||
"WPFTweaksActivity": {
|
||||
"Content": "Disable Activity History",
|
||||
"Description": "Erases recent docs, clipboard, and run history.",
|
||||
"Description": "This erases recent docs, clipboard, and run history.",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"registry": [
|
||||
|
||||
@@ -6,7 +6,7 @@ description: ""
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=1291}
|
||||
"WPFTweaksConsumerFeatures": {
|
||||
"Content": "Disable ConsumerFeatures",
|
||||
"Description": "Windows will not automatically install any games, third-party apps, or application links from the Windows Store for the signed-in user. Some default Apps will be inaccessible (eg. Phone Link).",
|
||||
"Description": "Windows will not automatically install any games, third-party apps, or application links from the Windows Store for the signed-in user. Some default Apps will be inaccessible (eg. Phone Link)",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"registry": [
|
||||
|
||||
@@ -6,7 +6,7 @@ description: ""
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2038}
|
||||
"WPFTweaksDeleteTempFiles": {
|
||||
"Content": "Delete Temporary Files",
|
||||
"Description": "Erases TEMP Folders.",
|
||||
"Description": "Erases TEMP Folders",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"InvokeScript": [
|
||||
|
||||
@@ -3,10 +3,10 @@ title: "Disable Explorer Automatic Folder Discovery"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2634}
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2616}
|
||||
"WPFTweaksDisableExplorerAutoDiscovery": {
|
||||
"Content": "Disable Explorer Automatic Folder Discovery",
|
||||
"Description": "Windows Explorer automatically tries to guess the type of the folder based on its contents, slowing down the browsing experience. WARNING! Will disable File Explorer grouping.",
|
||||
"Description": "Windows Explorer automatically tries to guess the type of the folder based on its contents, slowing down the browsing experience.",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"InvokeScript": [
|
||||
|
||||
@@ -6,7 +6,7 @@ description: ""
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=1763}
|
||||
"WPFTweaksEndTaskOnTaskbar": {
|
||||
"Content": "Enable End Task With Right Click",
|
||||
"Description": "Enables option to end task when right clicking a program in the taskbar.",
|
||||
"Description": "Enables option to end task when right clicking a program in the taskbar",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"registry": [
|
||||
|
||||
@@ -6,7 +6,7 @@ description: ""
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=32}
|
||||
"WPFTweaksHiber": {
|
||||
"Content": "Disable Hibernation",
|
||||
"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.",
|
||||
"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",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"registry": [
|
||||
|
||||
@@ -6,7 +6,7 @@ description: ""
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=125}
|
||||
"WPFTweaksLocation": {
|
||||
"Content": "Disable Location Tracking",
|
||||
"Description": "Disables Location Tracking.",
|
||||
"Description": "Disables Location Tracking...DUH!",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"registry": [
|
||||
|
||||
@@ -6,7 +6,7 @@ description: ""
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=1779}
|
||||
"WPFTweaksPowershell7Tele": {
|
||||
"Content": "Disable Powershell 7 Telemetry",
|
||||
"Description": "Creates an Environment Variable called 'POWERSHELL_TELEMETRY_OPTOUT' with a value of '1' which will tell PowerShell 7 to not send Telemetry Data.",
|
||||
"Description": "This will create an Environment Variable called 'POWERSHELL_TELEMETRY_OPTOUT' with a value of '1' which will tell Powershell 7 to not send Telemetry Data.",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"InvokeScript": [
|
||||
|
||||
@@ -6,7 +6,7 @@ description: ""
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=1736}
|
||||
"WPFTweaksRestorePoint": {
|
||||
"Content": "Create Restore Point",
|
||||
"Description": "Creates a restore point at runtime in case a revert is needed from WinUtil modifications.",
|
||||
"Description": "Creates a restore point at runtime in case a revert is needed from WinUtil modifications",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"Checked": "False",
|
||||
|
||||
@@ -967,3 +967,46 @@ description: ""
|
||||
}
|
||||
],
|
||||
```
|
||||
#Function
|
||||
```powershell {filename="functions/private/Set-WinUtilService.ps1",linenos=inline,linenostart=1}
|
||||
Function Set-WinUtilService {
|
||||
<#
|
||||
|
||||
.SYNOPSIS
|
||||
Changes the startup type of the given service
|
||||
|
||||
.PARAMETER Name
|
||||
The name of the service to modify
|
||||
|
||||
.PARAMETER StartupType
|
||||
The startup type to set the service to
|
||||
|
||||
.EXAMPLE
|
||||
Set-WinUtilService -Name "HomeGroupListener" -StartupType "Manual"
|
||||
|
||||
#>
|
||||
param (
|
||||
$Name,
|
||||
$StartupType
|
||||
)
|
||||
try {
|
||||
Write-Host "Setting Service $Name to $StartupType"
|
||||
|
||||
# Check if the service exists
|
||||
$service = Get-Service -Name $Name -ErrorAction Stop
|
||||
|
||||
# Service exists, proceed with changing properties -- while handling auto delayed start for PWSH 5
|
||||
if (($PSVersionTable.PSVersion.Major -lt 7) -and ($StartupType -eq "AutomaticDelayedStart")) {
|
||||
sc.exe config $Name start=delayed-auto
|
||||
} else {
|
||||
$service | Set-Service -StartupType $StartupType -ErrorAction Stop
|
||||
}
|
||||
} catch [System.ServiceProcess.ServiceNotFoundException] {
|
||||
Write-Warning "Service $Name was not found"
|
||||
} catch {
|
||||
Write-Warning "Unable to set $Name due to unhandled exception"
|
||||
Write-Warning $_.Exception.Message
|
||||
}
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
@@ -6,7 +6,7 @@ description: ""
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=1307}
|
||||
"WPFTweaksTelemetry": {
|
||||
"Content": "Disable Telemetry",
|
||||
"Description": "Disables Microsoft Telemetry.",
|
||||
"Description": "Disables Microsoft Telemetry...Duh",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"registry": [
|
||||
|
||||
@@ -6,7 +6,7 @@ description: ""
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=1892}
|
||||
"WPFTweaksWPBT": {
|
||||
"Content": "Disable Windows Platform Binary Table (WPBT)",
|
||||
"Description": "If enabled, WPBT allows your computer vendor to execute programs at boot time, such as anti-theft software, software drivers, as well as force install software without user consent. Poses potential security risk.",
|
||||
"Description": "If enabled then allows your computer vendor to execute a program each time it boots. It enables computer vendors to force install anti-theft software, software drivers, or a software program conveniently. This could also be a security risk.",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"registry": [
|
||||
|
||||
@@ -6,7 +6,7 @@ description: ""
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=61}
|
||||
"WPFTweaksWidget": {
|
||||
"Content": "Remove Widgets",
|
||||
"Description": "Removes the annoying widgets in the bottom left of the Taskbar.",
|
||||
"Description": "Removes the annoying widgets in the bottom left of the taskbar",
|
||||
"category": "Essential Tweaks",
|
||||
"panel": "1",
|
||||
"InvokeScript": [
|
||||
|
||||
@@ -6,7 +6,7 @@ description: ""
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=1973}
|
||||
"WPFTweaksBlockAdobeNet": {
|
||||
"Content": "Adobe Network Block",
|
||||
"Description": "Reduces user interruptions by selectively blocking connections to Adobe's activation and telemetry servers. Credit: Ruddernation-Designs",
|
||||
"Description": "Reduce user interruptions by selectively blocking connections to Adobe's activation and telemetry servers. Credit: Ruddernation-Designs",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"InvokeScript": [
|
||||
|
||||
@@ -6,7 +6,7 @@ description: ""
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=1126}
|
||||
"WPFTweaksBraveDebloat": {
|
||||
"Content": "Brave Debloat",
|
||||
"Description": "Disables various annoyances like Brave Rewards, Leo AI, Crypto Wallet and VPN.",
|
||||
"Description": "Disables various annoyances like Brave Rewards,Leo AI,Crypto Wallet and VPN",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"registry": [
|
||||
|
||||
@@ -6,7 +6,7 @@ description: ""
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=1647}
|
||||
"WPFTweaksDeBloat": {
|
||||
"Content": "Remove ALL MS Store Apps - NOT RECOMMENDED",
|
||||
"Description": "USE WITH CAUTION!!! This will remove ALL Microsoft Store apps.",
|
||||
"Description": "USE WITH CAUTION!!! This will remove ALL Microsoft store apps.",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"appx": [
|
||||
|
||||
@@ -6,7 +6,7 @@ description: ""
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2111}
|
||||
"WPFTweaksDisableBGapps": {
|
||||
"Content": "Disable Background Apps",
|
||||
"Description": "Disables all Microsoft Store apps from running in the background, which has to be done individually since Windows 11.",
|
||||
"Description": "Disables all Microsoft Store apps from running in the background, which has to be done individually since Win11",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"registry": [
|
||||
|
||||
@@ -6,7 +6,7 @@ description: ""
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2127}
|
||||
"WPFTweaksDisableFSO": {
|
||||
"Content": "Disable Fullscreen Optimizations",
|
||||
"Description": "Disables FSO in all applications. NOTE: This will disable Color Management in Exclusive Fullscreen.",
|
||||
"Description": "Disables FSO in all applications. NOTE: This will disable Color Management in Exclusive Fullscreen",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"registry": [
|
||||
|
||||
@@ -6,7 +6,7 @@ description: ""
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=1950}
|
||||
"WPFTweaksDisableNotifications": {
|
||||
"Content": "Disable Notification Tray/Calendar",
|
||||
"Description": "Disables all Notifications INCLUDING Calendar.",
|
||||
"Description": "Disables all Notifications INCLUDING Calendar",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"registry": [
|
||||
|
||||
@@ -6,7 +6,7 @@ description: ""
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2051}
|
||||
"WPFTweaksIPv46": {
|
||||
"Content": "Prefer IPv4 over IPv6",
|
||||
"Description": "Setting the IPv4 preference can have latency and security benefits on private networks where IPv6 is not configured.",
|
||||
"Description": "To set the IPv4 preference can have latency and security benefits on private networks where IPv6 is not configured.",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"registry": [
|
||||
|
||||
@@ -6,7 +6,7 @@ description: ""
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=1908}
|
||||
"WPFTweaksRazerBlock": {
|
||||
"Content": "Block Razer Software Installs",
|
||||
"Description": "Blocks ALL Razer Software installations. The hardware works fine without any software.",
|
||||
"Description": "Blocks ALL Razer Software installations. The hardware works fine without any software. WARNING: this will also block all Windows third-party driver installations.",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"registry": [
|
||||
|
||||
@@ -6,7 +6,7 @@ description: ""
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=1429}
|
||||
"WPFTweaksRemoveEdge": {
|
||||
"Content": "Remove Microsoft Edge",
|
||||
"Description": "Unblocks Microsoft Edge uninstaller restrictions then uses that uninstaller to remove Microsoft Edge.",
|
||||
"Description": "Unblocks Microsoft Edge uninstaller restrictions than uses that uninstaller to remove Microsoft Edge",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"InvokeScript": [
|
||||
|
||||
@@ -6,7 +6,7 @@ description: ""
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=1517}
|
||||
"WPFTweaksRemoveGallery": {
|
||||
"Content": "Remove Gallery from explorer",
|
||||
"Description": "Removes the Gallery from Explorer and sets This PC as default.",
|
||||
"Description": "Removes the Gallery from Explorer and sets This PC as default",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"InvokeScript": [
|
||||
|
||||
@@ -6,7 +6,7 @@ description: ""
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=1498}
|
||||
"WPFTweaksRemoveHome": {
|
||||
"Content": "Remove Home from Explorer",
|
||||
"Description": "Removes the Home from Explorer and sets This PC as default.",
|
||||
"Description": "Removes the Home from Explorer and sets This PC as default",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"InvokeScript": [
|
||||
|
||||
@@ -6,7 +6,7 @@ description: ""
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=1461}
|
||||
"WPFTweaksRemoveOneDrive": {
|
||||
"Content": "Remove OneDrive",
|
||||
"Description": "Denies permission to remove OneDrive user files, then uses its own uninstaller to remove it and restores the original permission afterward.",
|
||||
"Description": "Denys permission to remove onedrive user files than uses its own uninstaller to remove it than brings back permissions",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"InvokeScript": [
|
||||
|
||||
@@ -6,7 +6,7 @@ description: ""
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=90}
|
||||
"WPFTweaksRevertStartMenu": {
|
||||
"Content": "Revert the new start menu",
|
||||
"Description": "Uses vivetool to revert to the original start menu from 24H2.",
|
||||
"Description": "Uses vivetool to revert the the original start menu from 24h2",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"InvokeScript": [
|
||||
|
||||
@@ -6,7 +6,7 @@ description: ""
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2003}
|
||||
"WPFTweaksRightClickMenu": {
|
||||
"Content": "Set Classic Right-Click Menu ",
|
||||
"Description": "Restores the classic context menu when right-clicking in File Explorer, replacing the simplified Windows 11 version.",
|
||||
"Description": "Great Windows 11 tweak to bring back good context menus when right clicking things in explorer.",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"InvokeScript": [
|
||||
|
||||
@@ -6,7 +6,7 @@ description: ""
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2067}
|
||||
"WPFTweaksTeredo": {
|
||||
"Content": "Disable Teredo",
|
||||
"Description": "Teredo network tunneling is a IPv6 feature that can cause additional latency, but may cause problems with some games.",
|
||||
"Description": "Teredo network tunneling is a ipv6 feature that can cause additional latency, but may cause problems with some games",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
"panel": "1",
|
||||
"registry": [
|
||||
|
||||
@@ -3,7 +3,7 @@ title: "DNS"
|
||||
description: ""
|
||||
---
|
||||
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2610}
|
||||
```json {filename="config/tweaks.json",linenos=inline,linenostart=2592}
|
||||
"WPFchangedns": {
|
||||
"Content": "DNS",
|
||||
"category": "z__Advanced Tweaks - CAUTION",
|
||||
|
||||
@@ -31,10 +31,9 @@ Winutil is designed for:
|
||||
New to Winutil? Start here:
|
||||
|
||||
1. **[Getting Started Guide](getting-started/)** - Installation and first steps
|
||||
2. **[Application Store](application/)** - Learn to install software easily
|
||||
2. **[Application Store](store/)** - Learn to install software easily
|
||||
3. **[Tweaks Guide](tweaks/)** - Optimize your system
|
||||
4. **[Features & Fixes](features/)** - Troubleshoot common issues
|
||||
5. **[Win11 Creator](win11Creator/)** - Build a custom debloated Windows 11 ISO
|
||||
|
||||
## Main Features
|
||||
|
||||
@@ -42,7 +41,7 @@ New to Winutil? Start here:
|
||||
|
||||
Browse and install hundreds of popular applications with a single click. No more hunting for download links or dealing with installer bloat.
|
||||
|
||||
**[Read the Store Guide →](application/)**
|
||||
**[Read the Store Guide →](store/)**
|
||||
|
||||
### ⚙️ System Tweaks
|
||||
|
||||
@@ -80,23 +79,16 @@ Automate Winutil configurations for:
|
||||
|
||||
**[Read the Automation Guide →](automation/)**
|
||||
|
||||
### 💿 Windows 11 Creator
|
||||
|
||||
Build a custom Windows 11 ISO with bloatware removed, telemetry disabled, and hardware requirement checks bypassed — then export it as an ISO file or write it directly to a USB drive.
|
||||
|
||||
**[Read the Win11 Creator Guide →](win11Creator/)**
|
||||
|
||||
## Quick Links
|
||||
|
||||
| I want to... | Go to... |
|
||||
|--------------|----------|
|
||||
| Install Winutil for the first time | [Getting Started](getting-started/) |
|
||||
| Install applications quickly | [Application Store](application/) |
|
||||
| Install applications quickly | [Application Store](store/) |
|
||||
| Speed up my computer | [Tweaks Guide](tweaks/) |
|
||||
| Fix Windows Update problems | [Features - Fixes](features/) |
|
||||
| Automate setup for multiple PCs | [Automation](automation/) |
|
||||
| Understand what tweaks do | [Tweaks Guide](tweaks/) |
|
||||
| Build a custom Windows 11 ISO | [Win11 Creator](win11Creator/) |
|
||||
|
||||
## Safety and Best Practices
|
||||
|
||||
@@ -151,10 +143,9 @@ Want to help improve Winutil?
|
||||
This User Guide covers everything you need to know:
|
||||
|
||||
1. **[Getting Started](getting-started/)** - Installation, first run, basic usage
|
||||
2. **[Application Store](application/)** - Installing software, using presets
|
||||
2. **[Application Store](store/)** - Installing software, using presets
|
||||
3. **[Tweaks](tweaks/)** - System optimizations and customizations
|
||||
4. **[Features & Fixes](features/)** - Troubleshooting tools and utilities
|
||||
5. **[Win11 Creator](win11Creator/)** - Build a custom debloated Windows 11 ISO
|
||||
6. **[Updates](updates/)** - Managing Windows Update behavior
|
||||
7. **[Automation](automation/)** - Scripting and batch deployments
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
title: Getting Started
|
||||
title: Getting Started with Winutil
|
||||
weight: 1
|
||||
---
|
||||
|
||||
@@ -258,7 +258,7 @@ If Winutil downloads but doesn't open:
|
||||
|
||||
Now that you're set up, explore these guides:
|
||||
|
||||
- [Application Installation Guide](../application/) - Learn about installing software
|
||||
- [Application Installation Guide](../store/) - Learn about installing software
|
||||
- [Tweaks Guide](../tweaks/) - Understand system optimizations
|
||||
- [FAQ](../../faq/) - Common questions and answers
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
title: Applications
|
||||
title: Store
|
||||
weight: 2
|
||||
---
|
||||
|
||||
@@ -1,153 +0,0 @@
|
||||
---
|
||||
title: Win 11 Creator
|
||||
weight: 5
|
||||
---
|
||||
|
||||
## Using Winutil's Win11 Creator
|
||||
|
||||
Winutil includes a built-in **Win11 Creator** tool that lets you take any official Windows 11 ISO and produce a customized, debloated version — with telemetry removed, hardware requirement checks bypassed, and local account setup enabled out of the box. You can export the result as a new ISO file or write it directly to a USB drive.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> You need a valid Windows 11 ISO before starting. Download one from [Microsoft's official site](https://www.microsoft.com/en-us/software-download/windows11) or use [UUP Dump](https://uupdump.net/). The process uses ~10–15 GB of temporary disk space, so make sure you have room.
|
||||
|
||||
---
|
||||
|
||||
### Step 1 — Select Your ISO
|
||||
|
||||
1. Open Winutil and go to the **Win11 Creator** tab.
|
||||
2. Click **Browse** and select your Windows 11 ISO file (must be 4 GB or larger).
|
||||
3. The file path and size will appear on screen once selected.
|
||||
|
||||
---
|
||||
|
||||
### Step 2 — Mount & Verify
|
||||
|
||||
1. Click **Mount & Verify ISO**.
|
||||
2. Winutil mounts the ISO, checks for a valid `install.wim` or `install.esd`, and reads the available editions (Home, Pro, Enterprise, etc.).
|
||||
3. Once verified, select your desired **edition** from the dropdown — Pro is selected by default if available.
|
||||
|
||||
> [!NOTE]
|
||||
> This step takes around 10–30 seconds depending on your drive speed.
|
||||
|
||||
---
|
||||
|
||||
### Step 3 — Run the Modification
|
||||
|
||||
Click **Run Windows ISO Modification and Creator** to start the customization process. Winutil will:
|
||||
|
||||
- **Remove 40+ bloat apps** — Clipchamp, Teams, Copilot, Dev Home, new Outlook, Bing apps, Solitaire, and more
|
||||
- **Delete OneDrive setup** from the image
|
||||
- **Apply registry tweaks** — disables telemetry, advertising ID, tailored experiences, and cloud content features
|
||||
- **Bypass hardware checks** — removes TPM, Secure Boot, CPU, and RAM requirement enforcement so the ISO installs on unsupported hardware
|
||||
- **Enable local account setup** — injects an `autounattend.xml` that skips the Microsoft account screen during OOBE
|
||||
- **Strip unused editions** — keeps only your selected edition, saving 1–2 GB per removed edition
|
||||
- **Clean the component store** — runs DISM cleanup to reclaim another 300–800 MB
|
||||
- **Remove telemetry scheduled tasks** — CEIP, Appraiser, WaaSMedic, and others
|
||||
|
||||
A live log shows progress as each step completes. This stage takes **10–30 minutes** depending on your disk speed — the WIM dismount near the end is the slowest part, so don't close Winutil while it's running.
|
||||
|
||||
---
|
||||
|
||||
### Step 4 — Export Your Result
|
||||
|
||||
Once modification is complete, choose how to save your image:
|
||||
|
||||
{{< tabs items="Save as ISO,Write to USB" defaultIndex="0" >}}
|
||||
|
||||
{{< tab >}}
|
||||
1. Click **Save as an ISO File**.
|
||||
2. Choose a save location (defaults to your Desktop as `Win11_Modified_yyyyMMdd.iso`).
|
||||
3. Winutil builds a dual BIOS/UEFI bootable ISO using `oscdimg.exe`.
|
||||
|
||||
> [!NOTE]
|
||||
> `oscdimg.exe` (part of the Windows ADK) is required. If it's not found, Winutil will attempt to install it automatically via winget. If that fails, install it manually: `winget install -e --id Microsoft.OSCDIMG`
|
||||
|
||||
**Typical output size:** 2.5–3.5 GB (down from 5–6 GB original)
|
||||
{{< /tab >}}
|
||||
|
||||
{{< tab >}}
|
||||
1. Click **Write Directly to a USB Drive**.
|
||||
2. Select your USB drive from the dropdown (click **Refresh** if it doesn't appear).
|
||||
3. Click **Erase & Write to USB** and confirm the warning — **all data on the drive will be permanently erased**.
|
||||
4. Winutil formats the drive as GPT with a 512 MB EFI partition and copies the modified Windows files.
|
||||
|
||||
> [!WARNING]
|
||||
> Double-check you have selected the correct drive before confirming. This operation cannot be undone.
|
||||
|
||||
**Minimum USB size:** 8 GB recommended. Writing takes 10–20 minutes.
|
||||
{{< /tab >}}
|
||||
|
||||
{{< /tabs >}}
|
||||
|
||||
---
|
||||
|
||||
### Step 5 — Clean Up (Optional)
|
||||
|
||||
Click **Clean & Reset** to delete the temporary working directory (~10–15 GB) and reset the tool back to its initial state, ready for a new ISO. You'll be asked to confirm before anything is deleted.
|
||||
|
||||
---
|
||||
|
||||
### What the Modified ISO Does Differently
|
||||
|
||||
When you install Windows 11 from your modified ISO:
|
||||
|
||||
- **No Microsoft account required** — create a local account directly during setup
|
||||
- **No hardware checks** — installs on machines without TPM 2.0, Secure Boot, or supported CPUs
|
||||
- **Dark mode enabled by default**
|
||||
- **Empty taskbar and Start Menu** — no pinned apps
|
||||
- **Windows Update re-enabled automatically** after first login (it's paused during OOBE to prevent interruption)
|
||||
- **BitLocker disabled**, Recall disabled, desktop shortcuts removed
|
||||
|
||||
---
|
||||
|
||||
### Troubleshooting
|
||||
|
||||
| Problem | Fix |
|
||||
|---------|-----|
|
||||
| "install.wim not found" | Not a valid Windows 11 ISO — download a fresh one from Microsoft |
|
||||
| "oscdimg.exe not found" | Run `winget install -e --id Microsoft.OSCDIMG` then retry |
|
||||
| USB drive not showing up | Plug it in, wait a few seconds, then click **Refresh** |
|
||||
| Modification seems stuck | The WIM dismount step is slow — wait at least 10 minutes before assuming it's frozen |
|
||||
| "Access Denied" error | Make sure Winutil is running as Administrator |
|
||||
|
||||
---
|
||||
|
||||
A list of the best free and open source tools for downloading, creating and flashing Windows ISOs.
|
||||
|
||||
## Download Windows ISOs
|
||||
|
||||
| Tool | Description | Website |
|
||||
|------|-------------|---------|
|
||||
| **[UUP Dump](https://uupdump.net/)** | Download Windows UUP files directly from Microsoft's servers and convert them into a clean ISO — great for getting the latest builds | [uupdump.net](https://uupdump.net/) |
|
||||
| **[Microsoft Media Creation Tool](https://www.microsoft.com/en-us/software-download/windows11)** | Microsoft's official tool for downloading and creating Windows 10/11 installation media | [microsoft.com](https://www.microsoft.com/en-us/software-download/windows11) |
|
||||
|
||||
|
||||
## Customize Windows ISOs
|
||||
|
||||
| Tool | Description | Website |
|
||||
|------|-------------|---------|
|
||||
| **[MicroWin](https://github.com/CodingWonders/microwin)** | A C# desktop app for building stripped-down, customized Windows ISOs — the original predecessor to Winutil's old MicroWin feature | [github.com](https://github.com/CodingWonders/microwin) |
|
||||
| **[Tiny11 Builder](https://github.com/ntdevlabs/tiny11builder)** | PowerShell script that strips a Windows 11 ISO down to the bare minimum — removes bloatware and bypasses hardware requirements | [github.com](https://github.com/ntdevlabs/tiny11builder) |
|
||||
| **[NTLite](https://www.ntlite.com/)** | Remove Windows components, integrate drivers and updates, and build a custom ISO before installation | [ntlite.com](https://www.ntlite.com/) |
|
||||
|
||||
|
||||
## Flash ISOs to USB
|
||||
|
||||
| Tool | Description | Website |
|
||||
|------|-------------|---------|
|
||||
| **[Rufus](https://rufus.ie/)** | The go-to tool for creating bootable Windows USB drives. Supports bypassing Windows 11 TPM/Secure Boot requirements and downloading ISOs directly | [rufus.ie](https://rufus.ie/) |
|
||||
| **[Ventoy](https://www.ventoy.net/)** | Install once, then just copy any ISO files onto the USB — supports booting multiple ISOs from a single drive without re-flashing | [ventoy.net](https://www.ventoy.net/) |
|
||||
| **[balenaEtcher](https://etcher.balena.io/)** | Simple, beginner-friendly ISO flasher with a clean interface | [etcher.balena.io](https://etcher.balena.io/) |
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
> [!TIP]
|
||||
> Already have a Windows 11 ISO? Skip the third-party tools and use Winutil's built-in **[Win11 Creator](#using-winutilss-win11-creator)** at the top of this page.
|
||||
|
||||
> [!NOTE]
|
||||
> Always download Windows ISOs from official Microsoft sources or trusted tools like Rufus/UUP Dump to avoid tampered images.
|
||||
|
||||
> [!NOTE]
|
||||
> Newer Windows 11 ISOs may not boot correctly on older versions of Ventoy — make sure Ventoy is up to date before use. If issues persist after updating, this is a Ventoy compatibility limitation outside of Winutil's control.
|
||||
@@ -1,19 +1,29 @@
|
||||
function Write-Win11ISOLog {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Appends a timestamped message to the Win11ISO status log TextBox.
|
||||
.PARAMETER Message
|
||||
The message to append.
|
||||
#>
|
||||
param([string]$Message)
|
||||
$ts = (Get-Date).ToString("HH:mm:ss")
|
||||
$timestamp = (Get-Date).ToString("HH:mm:ss")
|
||||
$sync["WPFWin11ISOStatusLog"].Dispatcher.Invoke([action]{
|
||||
$current = $sync["WPFWin11ISOStatusLog"].Text
|
||||
if ($current -eq "Ready. Please select a Windows 11 ISO to begin.") {
|
||||
$sync["WPFWin11ISOStatusLog"].Text = "[$ts] $Message"
|
||||
$sync["WPFWin11ISOStatusLog"].Text = "[$timestamp] $Message"
|
||||
} else {
|
||||
$sync["WPFWin11ISOStatusLog"].Text += "`n[$ts] $Message"
|
||||
$sync["WPFWin11ISOStatusLog"].Text += "`n[$timestamp] $Message"
|
||||
}
|
||||
$sync["WPFWin11ISOStatusLog"].CaretIndex = $sync["WPFWin11ISOStatusLog"].Text.Length
|
||||
$sync["WPFWin11ISOStatusLog"].ScrollToEnd()
|
||||
})
|
||||
}
|
||||
|
||||
function Invoke-WinUtilISOBrowse {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Opens an OpenFileDialog so the user can choose a Windows 11 ISO file.
|
||||
Populates WPFWin11ISOPath and reveals the Mount & Verify section (Step 2).
|
||||
#>
|
||||
Add-Type -AssemblyName System.Windows.Forms
|
||||
|
||||
$dlg = [System.Windows.Forms.OpenFileDialog]::new()
|
||||
@@ -24,12 +34,18 @@ function Invoke-WinUtilISOBrowse {
|
||||
if ($dlg.ShowDialog() -ne [System.Windows.Forms.DialogResult]::OK) { return }
|
||||
|
||||
$isoPath = $dlg.FileName
|
||||
|
||||
# ── Basic size sanity-check (a Win11 ISO is typically > 4 GB) ──
|
||||
$fileSizeGB = [math]::Round((Get-Item $isoPath).Length / 1GB, 2)
|
||||
|
||||
$sync["WPFWin11ISOPath"].Text = $isoPath
|
||||
$sync["WPFWin11ISOFileInfo"].Text = "File size: $fileSizeGB GB"
|
||||
$sync["WPFWin11ISOFileInfo"].Visibility = "Visible"
|
||||
|
||||
# Reveal Step 2
|
||||
$sync["WPFWin11ISOMountSection"].Visibility = "Visible"
|
||||
|
||||
# Collapse all later steps whenever a new ISO is chosen
|
||||
$sync["WPFWin11ISOVerifyResultPanel"].Visibility = "Collapsed"
|
||||
$sync["WPFWin11ISOModifySection"].Visibility = "Collapsed"
|
||||
$sync["WPFWin11ISOOutputSection"].Visibility = "Collapsed"
|
||||
@@ -38,10 +54,17 @@ function Invoke-WinUtilISOBrowse {
|
||||
}
|
||||
|
||||
function Invoke-WinUtilISOMountAndVerify {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Mounts the selected ISO, verifies it is a valid Windows 11 image,
|
||||
and populates the edition list. Reveals Step 3 on success.
|
||||
#>
|
||||
$isoPath = $sync["WPFWin11ISOPath"].Text
|
||||
|
||||
if ([string]::IsNullOrWhiteSpace($isoPath) -or $isoPath -eq "No ISO selected...") {
|
||||
[System.Windows.MessageBox]::Show("Please select an ISO file first.", "No ISO Selected", "OK", "Warning")
|
||||
[System.Windows.MessageBox]::Show(
|
||||
"Please select an ISO file first.",
|
||||
"No ISO Selected", "OK", "Warning")
|
||||
return
|
||||
}
|
||||
|
||||
@@ -49,12 +72,14 @@ function Invoke-WinUtilISOMountAndVerify {
|
||||
Set-WinUtilProgressBar -Label "Mounting ISO..." -Percent 10
|
||||
|
||||
try {
|
||||
# Mount the ISO
|
||||
$diskImage = Mount-DiskImage -ImagePath $isoPath -PassThru -ErrorAction Stop
|
||||
$driveLetter = ($diskImage | Get-Volume).DriveLetter + ":"
|
||||
Write-Win11ISOLog "Mounted at drive $driveLetter"
|
||||
|
||||
Set-WinUtilProgressBar -Label "Verifying ISO contents..." -Percent 30
|
||||
|
||||
# ── Verify install.wim / install.esd presence ──
|
||||
$wimPath = Join-Path $driveLetter "sources\install.wim"
|
||||
$esdPath = Join-Path $driveLetter "sources\install.esd"
|
||||
|
||||
@@ -70,10 +95,14 @@ function Invoke-WinUtilISOMountAndVerify {
|
||||
|
||||
$activeWim = if (Test-Path $wimPath) { $wimPath } else { $esdPath }
|
||||
|
||||
# ── Read edition / architecture info ──
|
||||
Set-WinUtilProgressBar -Label "Reading image metadata..." -Percent 55
|
||||
$imageInfo = Get-WindowsImage -ImagePath $activeWim | Select-Object ImageIndex, ImageName
|
||||
|
||||
if (-not ($imageInfo | Where-Object { $_.ImageName -match "Windows 11" })) {
|
||||
$editions = Get-WindowsImage -ImagePath $activeWim | Select-Object -ExpandProperty ImageName
|
||||
|
||||
# ── Verify at least one Win11 edition is present ──
|
||||
$isWin11 = $editions | Where-Object { $_ -match "Windows 11" }
|
||||
if (-not $isWin11) {
|
||||
Dismount-DiskImage -ImagePath $isoPath | Out-Null
|
||||
Write-Win11ISOLog "ERROR: No 'Windows 11' edition found in the image."
|
||||
[System.Windows.MessageBox]::Show(
|
||||
@@ -83,45 +112,45 @@ function Invoke-WinUtilISOMountAndVerify {
|
||||
return
|
||||
}
|
||||
|
||||
$sync["Win11ISOImageInfo"] = $imageInfo
|
||||
|
||||
# ── Populate UI ──
|
||||
$sync["WPFWin11ISOMountDriveLetter"].Text = "Mounted at: $driveLetter | Image file: $(Split-Path $activeWim -Leaf)"
|
||||
$sync["WPFWin11ISOEditionComboBox"].Dispatcher.Invoke([action]{
|
||||
$sync["WPFWin11ISOEditionComboBox"].Items.Clear()
|
||||
foreach ($img in $imageInfo) {
|
||||
[void]$sync["WPFWin11ISOEditionComboBox"].Items.Add("$($img.ImageIndex): $($img.ImageName)")
|
||||
}
|
||||
if ($sync["WPFWin11ISOEditionComboBox"].Items.Count -gt 0) {
|
||||
$proIndex = -1
|
||||
for ($i = 0; $i -lt $sync["WPFWin11ISOEditionComboBox"].Items.Count; $i++) {
|
||||
if ($sync["WPFWin11ISOEditionComboBox"].Items[$i] -match "Windows 11 Pro(?![\w ])") {
|
||||
$proIndex = $i; break
|
||||
}
|
||||
}
|
||||
$sync["WPFWin11ISOEditionComboBox"].SelectedIndex = if ($proIndex -ge 0) { $proIndex } else { 0 }
|
||||
}
|
||||
})
|
||||
$sync["WPFWin11ISOEditionList"].Text = ($editions -join "`n")
|
||||
$sync["WPFWin11ISOVerifyResultPanel"].Visibility = "Visible"
|
||||
|
||||
# Store for later steps
|
||||
$sync["Win11ISODriveLetter"] = $driveLetter
|
||||
$sync["Win11ISOWimPath"] = $activeWim
|
||||
$sync["Win11ISOImagePath"] = $isoPath
|
||||
|
||||
# Reveal Step 3
|
||||
$sync["WPFWin11ISOModifySection"].Visibility = "Visible"
|
||||
|
||||
Set-WinUtilProgressBar -Label "ISO verified" -Percent 100
|
||||
Write-Win11ISOLog "ISO verified OK. Editions found: $($imageInfo.Count)"
|
||||
} catch {
|
||||
Set-WinUtilProgressBar -Label "ISO verified ✔" -Percent 100
|
||||
Write-Win11ISOLog "ISO verified OK. Editions found: $($editions.Count)"
|
||||
}
|
||||
catch {
|
||||
Write-Win11ISOLog "ERROR during mount/verify: $_"
|
||||
[System.Windows.MessageBox]::Show(
|
||||
"An error occurred while mounting or verifying the ISO:`n`n$_",
|
||||
"Error", "OK", "Error")
|
||||
} finally {
|
||||
}
|
||||
finally {
|
||||
Start-Sleep -Milliseconds 800
|
||||
Set-WinUtilProgressBar -Label "" -Percent 0
|
||||
}
|
||||
}
|
||||
|
||||
function Invoke-WinUtilISOModify {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Extracts ISO contents to a temp working directory, modifies install.wim,
|
||||
then repackages the image. Reveals Step 4 (output options) on success.
|
||||
|
||||
.NOTES
|
||||
This function runs inside a PowerShell runspace so the UI stays responsive.
|
||||
Placeholder modification logic is provided; extend as needed.
|
||||
#>
|
||||
|
||||
$isoPath = $sync["Win11ISOImagePath"]
|
||||
$driveLetter= $sync["Win11ISODriveLetter"]
|
||||
$wimPath = $sync["Win11ISOWimPath"]
|
||||
@@ -133,70 +162,50 @@ function Invoke-WinUtilISOModify {
|
||||
return
|
||||
}
|
||||
|
||||
$selectedItem = $sync["WPFWin11ISOEditionComboBox"].SelectedItem
|
||||
$selectedWimIndex = 1
|
||||
if ($selectedItem -and $selectedItem -match '^(\d+):') {
|
||||
$selectedWimIndex = [int]$Matches[1]
|
||||
} elseif ($sync["Win11ISOImageInfo"]) {
|
||||
$selectedWimIndex = $sync["Win11ISOImageInfo"][0].ImageIndex
|
||||
}
|
||||
$selectedEditionName = if ($selectedItem) { ($selectedItem -replace '^\d+:\s*', '') } else { "Unknown" }
|
||||
Write-Win11ISOLog "Selected edition: $selectedEditionName (Index $selectedWimIndex)"
|
||||
|
||||
# Disable the modify button to prevent double-click
|
||||
$sync["WPFWin11ISOModifyButton"].IsEnabled = $false
|
||||
|
||||
$existingWorkDir = Get-Item -Path (Join-Path $env:TEMP "WinUtil_Win11ISO*") -ErrorAction SilentlyContinue |
|
||||
Where-Object { $_.PSIsContainer } | Sort-Object LastWriteTime -Descending | Select-Object -First 1
|
||||
|
||||
$workDir = if ($existingWorkDir) {
|
||||
Write-Win11ISOLog "Reusing existing temp directory: $($existingWorkDir.FullName)"
|
||||
$existingWorkDir.FullName
|
||||
} else {
|
||||
Join-Path $env:TEMP "WinUtil_Win11ISO_$(Get-Date -Format 'yyyyMMdd_HHmmss')"
|
||||
}
|
||||
|
||||
$autounattendContent = if ($WinUtilAutounattendXml) {
|
||||
$WinUtilAutounattendXml
|
||||
} else {
|
||||
$toolsXml = Join-Path $PSScriptRoot "..\..\tools\autounattend.xml"
|
||||
if (Test-Path $toolsXml) { Get-Content $toolsXml -Raw } else { "" }
|
||||
}
|
||||
$workDir = Join-Path $env:TEMP "WinUtil_Win11ISO_$(Get-Date -Format 'yyyyMMdd_HHmmss')"
|
||||
|
||||
# ── Run modification in a background runspace ──
|
||||
$runspace = [Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace()
|
||||
$runspace.ApartmentState = "STA"
|
||||
$runspace.ThreadOptions = "ReuseThread"
|
||||
$runspace.Open()
|
||||
$injectDrivers = $sync["WPFWin11ISOInjectDrivers"].IsChecked -eq $true
|
||||
|
||||
$runspace.SessionStateProxy.SetVariable("sync", $sync)
|
||||
$runspace.SessionStateProxy.SetVariable("isoPath", $isoPath)
|
||||
$runspace.SessionStateProxy.SetVariable("driveLetter", $driveLetter)
|
||||
$runspace.SessionStateProxy.SetVariable("wimPath", $wimPath)
|
||||
$runspace.SessionStateProxy.SetVariable("workDir", $workDir)
|
||||
$runspace.SessionStateProxy.SetVariable("selectedWimIndex", $selectedWimIndex)
|
||||
$runspace.SessionStateProxy.SetVariable("selectedEditionName", $selectedEditionName)
|
||||
$runspace.SessionStateProxy.SetVariable("autounattendContent", $autounattendContent)
|
||||
$runspace.SessionStateProxy.SetVariable("injectDrivers", $injectDrivers)
|
||||
|
||||
$isoScriptFuncDef = "function Invoke-WinUtilISOScript {`n" + ${function:Invoke-WinUtilISOScript}.ToString() + "`n}"
|
||||
$win11ISOLogFuncDef = "function Write-Win11ISOLog {`n" + ${function:Write-Win11ISOLog}.ToString() + "`n}"
|
||||
# Serialize functions so they are available inside the runspace
|
||||
$isoScriptFuncDef = "function Invoke-WinUtilISOScript {`n" + `
|
||||
${function:Invoke-WinUtilISOScript}.ToString() + "`n}"
|
||||
$runspace.SessionStateProxy.SetVariable("isoScriptFuncDef", $isoScriptFuncDef)
|
||||
|
||||
$win11ISOLogFuncDef = "function Write-Win11ISOLog {`n" + `
|
||||
${function:Write-Win11ISOLog}.ToString() + "`n}"
|
||||
$runspace.SessionStateProxy.SetVariable("win11ISOLogFuncDef", $win11ISOLogFuncDef)
|
||||
|
||||
$refreshUSBFuncDef = "function Invoke-WinUtilISORefreshUSBDrives {`n" + `
|
||||
${function:Invoke-WinUtilISORefreshUSBDrives}.ToString() + "`n}"
|
||||
$runspace.SessionStateProxy.SetVariable("refreshUSBFuncDef", $refreshUSBFuncDef)
|
||||
|
||||
$script = [Management.Automation.PowerShell]::Create()
|
||||
$script.Runspace = $runspace
|
||||
$script.AddScript({
|
||||
|
||||
# Import helper functions into this runspace
|
||||
. ([scriptblock]::Create($isoScriptFuncDef))
|
||||
. ([scriptblock]::Create($win11ISOLogFuncDef))
|
||||
. ([scriptblock]::Create($refreshUSBFuncDef))
|
||||
|
||||
function Log($msg) {
|
||||
$ts = (Get-Date).ToString("HH:mm:ss")
|
||||
$sync["WPFWin11ISOStatusLog"].Dispatcher.Invoke([action]{
|
||||
$sync["WPFWin11ISOStatusLog"].Text += "`n[$ts] $msg"
|
||||
$sync["WPFWin11ISOStatusLog"].CaretIndex = $sync["WPFWin11ISOStatusLog"].Text.Length
|
||||
$sync["WPFWin11ISOStatusLog"].ScrollToEnd()
|
||||
})
|
||||
Add-Content -Path (Join-Path $workDir "WinUtil_Win11ISO.log") -Value "[$ts] $msg" -ErrorAction SilentlyContinue
|
||||
}
|
||||
|
||||
function SetProgress($label, $pct) {
|
||||
@@ -208,285 +217,77 @@ function Invoke-WinUtilISOModify {
|
||||
}
|
||||
|
||||
try {
|
||||
$sync["WPFWin11ISOStatusLog"].Dispatcher.Invoke([action]{
|
||||
$sync["WPFWin11ISOSelectSection"].Visibility = "Collapsed"
|
||||
$sync["WPFWin11ISOMountSection"].Visibility = "Collapsed"
|
||||
$sync["WPFWin11ISOModifySection"].Visibility = "Collapsed"
|
||||
})
|
||||
|
||||
# ── 1. Create working directory structure ──
|
||||
Log "Creating working directory: $workDir"
|
||||
$isoContents = Join-Path $workDir "iso_contents"
|
||||
$mountDir = Join-Path $workDir "wim_mount"
|
||||
New-Item -ItemType Directory -Path $isoContents, $mountDir -Force | Out-Null
|
||||
SetProgress "Copying ISO contents..." 10
|
||||
|
||||
# ── 2. Copy all ISO contents to the working directory ──
|
||||
Log "Copying ISO contents from $driveLetter to $isoContents..."
|
||||
& robocopy $driveLetter $isoContents /E /NFL /NDL /NJH /NJS | Out-Null
|
||||
$robocopyArgs = @($driveLetter, $isoContents, "/E", "/NFL", "/NDL", "/NJH", "/NJS")
|
||||
& robocopy @robocopyArgs | Out-Null
|
||||
Log "ISO contents copied."
|
||||
SetProgress "Mounting install.wim..." 25
|
||||
|
||||
# ── 3. Copy install.wim to working dir (it may be read-only on the DVD) ──
|
||||
$localWim = Join-Path $isoContents "sources\install.wim"
|
||||
if (-not (Test-Path $localWim)) { $localWim = Join-Path $isoContents "sources\install.esd" }
|
||||
if (-not (Test-Path $localWim)) {
|
||||
# ESD path
|
||||
$localWim = Join-Path $isoContents "sources\install.esd"
|
||||
}
|
||||
# Ensure the file is writable
|
||||
Set-ItemProperty -Path $localWim -Name IsReadOnly -Value $false
|
||||
|
||||
Log "Mounting install.wim (Index ${selectedWimIndex}: $selectedEditionName) at $mountDir..."
|
||||
Mount-WindowsImage -ImagePath $localWim -Index $selectedWimIndex -Path $mountDir -ErrorAction Stop | Out-Null
|
||||
# ── 4. Mount the first index of install.wim ──
|
||||
Log "Mounting install.wim (Index 1) at $mountDir..."
|
||||
Mount-WindowsImage -ImagePath $localWim -Index 1 -Path $mountDir -ErrorAction Stop | Out-Null
|
||||
SetProgress "Modifying install.wim..." 45
|
||||
|
||||
# ── Apply all WinUtil modifications via Invoke-WinUtilISOScript ──
|
||||
Log "Applying WinUtil modifications to install.wim..."
|
||||
Invoke-WinUtilISOScript -ScratchDir $mountDir -ISOContentsDir $isoContents -AutoUnattendXml $autounattendContent -InjectCurrentSystemDrivers $injectDrivers -Log { param($m) Log $m }
|
||||
|
||||
SetProgress "Cleaning up component store (WinSxS)..." 56
|
||||
Log "Running DISM component store cleanup (/ResetBase)..."
|
||||
& dism /English "/image:$mountDir" /Cleanup-Image /StartComponentCleanup /ResetBase | ForEach-Object { Log $_ }
|
||||
Log "Component store cleanup complete."
|
||||
Invoke-WinUtilISOScript -ScratchDir $mountDir -Log { param($m) Log $m }
|
||||
|
||||
# ── 5. Save and dismount the WIM ──
|
||||
SetProgress "Saving modified install.wim..." 65
|
||||
Log "Dismounting and saving install.wim. This will take several minutes..."
|
||||
Log "Dismounting and saving install.wim..."
|
||||
Dismount-WindowsImage -Path $mountDir -Save -ErrorAction Stop | Out-Null
|
||||
Log "install.wim saved."
|
||||
|
||||
SetProgress "Removing unused editions from install.wim..." 70
|
||||
Log "Exporting edition '$selectedEditionName' (Index $selectedWimIndex) to a single-edition install.wim..."
|
||||
$exportWim = Join-Path $isoContents "sources\install_export.wim"
|
||||
Export-WindowsImage -SourceImagePath $localWim -SourceIndex $selectedWimIndex -DestinationImagePath $exportWim -ErrorAction Stop | Out-Null
|
||||
Remove-Item -Path $localWim -Force
|
||||
Rename-Item -Path $exportWim -NewName "install.wim" -Force
|
||||
$localWim = Join-Path $isoContents "sources\install.wim"
|
||||
Log "Unused editions removed. install.wim now contains only '$selectedEditionName'."
|
||||
|
||||
SetProgress "Dismounting source ISO..." 80
|
||||
|
||||
# ── 6. Dismount the original ISO ──
|
||||
Log "Dismounting original ISO..."
|
||||
Dismount-DiskImage -ImagePath $isoPath | Out-Null
|
||||
|
||||
# Store work directory for output steps
|
||||
$sync["Win11ISOWorkDir"] = $workDir
|
||||
$sync["Win11ISOContentsDir"] = $isoContents
|
||||
|
||||
SetProgress "Modification complete" 100
|
||||
Log "install.wim modification complete. Choose an output option in Step 4."
|
||||
SetProgress "Modification complete ✔" 100
|
||||
Log "install.wim modification complete. Select an output option in Step 4."
|
||||
|
||||
# ── Reveal Step 4 on the UI thread ──
|
||||
$sync["WPFWin11ISOOutputSection"].Dispatcher.Invoke([action]{
|
||||
$sync["WPFWin11ISOOutputSection"].Visibility = "Visible"
|
||||
Invoke-WinUtilISORefreshUSBDrives
|
||||
})
|
||||
} catch {
|
||||
}
|
||||
catch {
|
||||
Log "ERROR during modification: $_"
|
||||
|
||||
try {
|
||||
if (Test-Path $mountDir) {
|
||||
$mountedImages = Get-WindowsImage -Mounted -ErrorAction SilentlyContinue | Where-Object { $_.Path -eq $mountDir }
|
||||
if ($mountedImages) {
|
||||
Log "Cleaning up: dismounting install.wim (discarding changes)..."
|
||||
Dismount-WindowsImage -Path $mountDir -Discard -ErrorAction SilentlyContinue | Out-Null
|
||||
}
|
||||
}
|
||||
} catch { Log "Warning: could not dismount install.wim during cleanup: $_" }
|
||||
|
||||
try {
|
||||
$mountedISO = Get-DiskImage -ImagePath $isoPath -ErrorAction SilentlyContinue
|
||||
if ($mountedISO -and $mountedISO.Attached) {
|
||||
Log "Cleaning up: dismounting source ISO..."
|
||||
Dismount-DiskImage -ImagePath $isoPath -ErrorAction SilentlyContinue | Out-Null
|
||||
}
|
||||
} catch { Log "Warning: could not dismount ISO during cleanup: $_" }
|
||||
|
||||
try {
|
||||
if (Test-Path $workDir) {
|
||||
Log "Cleaning up: removing temp directory $workDir..."
|
||||
Remove-Item -Path $workDir -Recurse -Force -ErrorAction SilentlyContinue
|
||||
}
|
||||
} catch { Log "Warning: could not remove temp directory during cleanup: $_" }
|
||||
|
||||
$sync["WPFWin11ISOStatusLog"].Dispatcher.Invoke([action]{
|
||||
[System.Windows.MessageBox]::Show(
|
||||
"An error occurred during install.wim modification:`n`n$_",
|
||||
"Modification Error", "OK", "Error")
|
||||
})
|
||||
} finally {
|
||||
}
|
||||
finally {
|
||||
Start-Sleep -Milliseconds 800
|
||||
$sync["WPFWin11ISOStatusLog"].Dispatcher.Invoke([action]{
|
||||
$sync.progressBarTextBlock.Text = ""
|
||||
$sync.progressBarTextBlock.ToolTip = ""
|
||||
$sync.ProgressBar.Value = 0
|
||||
$sync["WPFWin11ISOModifyButton"].IsEnabled = $true
|
||||
if ($sync["WPFWin11ISOOutputSection"].Visibility -ne "Visible") {
|
||||
$sync["WPFWin11ISOSelectSection"].Visibility = "Visible"
|
||||
$sync["WPFWin11ISOMountSection"].Visibility = "Visible"
|
||||
$sync["WPFWin11ISOModifySection"].Visibility = "Visible"
|
||||
}
|
||||
})
|
||||
}
|
||||
}) | Out-Null
|
||||
|
||||
$script.BeginInvoke() | Out-Null
|
||||
}
|
||||
|
||||
function Invoke-WinUtilISOCheckExistingWork {
|
||||
if ($sync["Win11ISOContentsDir"] -and (Test-Path $sync["Win11ISOContentsDir"])) { return }
|
||||
|
||||
$existingWorkDir = Get-Item -Path (Join-Path $env:TEMP "WinUtil_Win11ISO*") -ErrorAction SilentlyContinue |
|
||||
Where-Object { $_.PSIsContainer } | Sort-Object LastWriteTime -Descending | Select-Object -First 1
|
||||
|
||||
if (-not $existingWorkDir) { return }
|
||||
|
||||
$isoContents = Join-Path $existingWorkDir.FullName "iso_contents"
|
||||
if (-not (Test-Path $isoContents)) { return }
|
||||
|
||||
$sync["Win11ISOWorkDir"] = $existingWorkDir.FullName
|
||||
$sync["Win11ISOContentsDir"] = $isoContents
|
||||
|
||||
$sync["WPFWin11ISOSelectSection"].Visibility = "Collapsed"
|
||||
$sync["WPFWin11ISOMountSection"].Visibility = "Collapsed"
|
||||
$sync["WPFWin11ISOModifySection"].Visibility = "Collapsed"
|
||||
$sync["WPFWin11ISOOutputSection"].Visibility = "Visible"
|
||||
|
||||
$modified = $existingWorkDir.LastWriteTime.ToString("yyyy-MM-dd HH:mm")
|
||||
Write-Win11ISOLog "Existing working directory found: $($existingWorkDir.FullName)"
|
||||
Write-Win11ISOLog "Last modified: $modified - Skipping Steps 1-3 and resuming at Step 4."
|
||||
Write-Win11ISOLog "Click 'Clean & Reset' if you want to start over with a new ISO."
|
||||
|
||||
[System.Windows.MessageBox]::Show(
|
||||
"A previous WinUtil ISO working directory was found:`n`n$($existingWorkDir.FullName)`n`n(Last modified: $modified)`n`nStep 4 (output options) has been restored so you can save the already-modified image.`n`nClick 'Clean & Reset' in Step 4 if you want to start over.",
|
||||
"Existing Work Found", "OK", "Info")
|
||||
}
|
||||
|
||||
function Invoke-WinUtilISOCleanAndReset {
|
||||
$workDir = $sync["Win11ISOWorkDir"]
|
||||
|
||||
if ($workDir -and (Test-Path $workDir)) {
|
||||
$confirm = [System.Windows.MessageBox]::Show(
|
||||
"This will delete the temporary working directory:`n`n$workDir`n`nAnd reset the interface back to the start.`n`nContinue?",
|
||||
"Clean & Reset", "YesNo", "Warning")
|
||||
if ($confirm -ne "Yes") { return }
|
||||
}
|
||||
|
||||
$sync["WPFWin11ISOCleanResetButton"].IsEnabled = $false
|
||||
|
||||
$runspace = [Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace()
|
||||
$runspace.ApartmentState = "STA"
|
||||
$runspace.ThreadOptions = "ReuseThread"
|
||||
$runspace.Open()
|
||||
$runspace.SessionStateProxy.SetVariable("sync", $sync)
|
||||
$runspace.SessionStateProxy.SetVariable("workDir", $workDir)
|
||||
|
||||
$script = [Management.Automation.PowerShell]::Create()
|
||||
$script.Runspace = $runspace
|
||||
$script.AddScript({
|
||||
|
||||
function Log($msg) {
|
||||
$ts = (Get-Date).ToString("HH:mm:ss")
|
||||
$sync["WPFWin11ISOStatusLog"].Dispatcher.Invoke([action]{
|
||||
$sync["WPFWin11ISOStatusLog"].Text += "`n[$ts] $msg"
|
||||
$sync["WPFWin11ISOStatusLog"].CaretIndex = $sync["WPFWin11ISOStatusLog"].Text.Length
|
||||
$sync["WPFWin11ISOStatusLog"].ScrollToEnd()
|
||||
})
|
||||
Add-Content -Path (Join-Path $workDir "WinUtil_Win11ISO.log") -Value "[$ts] $msg" -ErrorAction SilentlyContinue
|
||||
}
|
||||
|
||||
function SetProgress($label, $pct) {
|
||||
$sync["WPFWin11ISOStatusLog"].Dispatcher.Invoke([action]{
|
||||
$sync.progressBarTextBlock.Text = $label
|
||||
$sync.progressBarTextBlock.ToolTip = $label
|
||||
$sync.ProgressBar.Value = [Math]::Max($pct, 5)
|
||||
})
|
||||
}
|
||||
|
||||
try {
|
||||
if ($workDir) {
|
||||
$mountDir = Join-Path $workDir "wim_mount"
|
||||
try {
|
||||
$mountedImages = Get-WindowsImage -Mounted -ErrorAction SilentlyContinue |
|
||||
Where-Object { $_.Path -like "$workDir*" }
|
||||
if ($mountedImages) {
|
||||
foreach ($img in $mountedImages) {
|
||||
Log "Dismounting WIM at: $($img.Path) (discarding changes)..."
|
||||
SetProgress "Dismounting WIM image..." 3
|
||||
Dismount-WindowsImage -Path $img.Path -Discard -ErrorAction Stop | Out-Null
|
||||
Log "WIM dismounted successfully."
|
||||
}
|
||||
} elseif (Test-Path $mountDir) {
|
||||
Log "No mounted WIM reported by Get-WindowsImage, running DISM /Cleanup-Wim as a precaution..."
|
||||
SetProgress "Running DISM cleanup..." 3
|
||||
& dism /English /Cleanup-Wim 2>&1 | ForEach-Object { Log $_ }
|
||||
}
|
||||
} catch {
|
||||
Log "Warning: could not dismount WIM cleanly, attempting DISM /Cleanup-Wim fallback: $_"
|
||||
try { & dism /English /Cleanup-Wim 2>&1 | ForEach-Object { Log $_ } }
|
||||
catch { Log "Warning: DISM /Cleanup-Wim also failed: $_" }
|
||||
}
|
||||
}
|
||||
|
||||
if ($workDir -and (Test-Path $workDir)) {
|
||||
Log "Scanning files to delete in: $workDir"
|
||||
SetProgress "Scanning files..." 5
|
||||
|
||||
$allFiles = @(Get-ChildItem -Path $workDir -File -Recurse -Force -ErrorAction SilentlyContinue)
|
||||
$allDirs = @(Get-ChildItem -Path $workDir -Directory -Recurse -Force -ErrorAction SilentlyContinue |
|
||||
Sort-Object { $_.FullName.Length } -Descending)
|
||||
$total = $allFiles.Count
|
||||
$deleted = 0
|
||||
|
||||
Log "Found $total files to delete."
|
||||
|
||||
foreach ($f in $allFiles) {
|
||||
try { Remove-Item -Path $f.FullName -Force -ErrorAction Stop } catch { Log "WARNING: could not delete $($f.FullName): $_" }
|
||||
$deleted++
|
||||
if ($deleted % 100 -eq 0 -or $deleted -eq $total) {
|
||||
$pct = [math]::Round(($deleted / [Math]::Max($total, 1)) * 85) + 5
|
||||
SetProgress "Deleting files in $($f.Directory.Name)... ($deleted / $total)" $pct
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($d in $allDirs) {
|
||||
try { Remove-Item -Path $d.FullName -Force -ErrorAction SilentlyContinue } catch {}
|
||||
}
|
||||
|
||||
try { Remove-Item -Path $workDir -Recurse -Force -ErrorAction Stop } catch {}
|
||||
|
||||
if (Test-Path $workDir) {
|
||||
Log "WARNING: some items could not be deleted in $workDir"
|
||||
} else {
|
||||
Log "Temp directory deleted successfully."
|
||||
}
|
||||
} else {
|
||||
Log "No temp directory found — resetting UI."
|
||||
}
|
||||
|
||||
SetProgress "Resetting UI..." 95
|
||||
Log "Resetting interface..."
|
||||
|
||||
$sync["WPFWin11ISOStatusLog"].Dispatcher.Invoke([action]{
|
||||
$sync["Win11ISOWorkDir"] = $null
|
||||
$sync["Win11ISOContentsDir"] = $null
|
||||
$sync["Win11ISOImagePath"] = $null
|
||||
$sync["Win11ISODriveLetter"] = $null
|
||||
$sync["Win11ISOWimPath"] = $null
|
||||
$sync["Win11ISOImageInfo"] = $null
|
||||
$sync["Win11ISOUSBDisks"] = $null
|
||||
|
||||
$sync["WPFWin11ISOPath"].Text = "No ISO selected..."
|
||||
$sync["WPFWin11ISOFileInfo"].Visibility = "Collapsed"
|
||||
$sync["WPFWin11ISOVerifyResultPanel"].Visibility = "Collapsed"
|
||||
$sync["WPFWin11ISOOptionUSB"].Visibility = "Collapsed"
|
||||
$sync["WPFWin11ISOOutputSection"].Visibility = "Collapsed"
|
||||
$sync["WPFWin11ISOModifySection"].Visibility = "Collapsed"
|
||||
$sync["WPFWin11ISOMountSection"].Visibility = "Collapsed"
|
||||
$sync["WPFWin11ISOSelectSection"].Visibility = "Visible"
|
||||
$sync["WPFWin11ISOModifyButton"].IsEnabled = $true
|
||||
$sync["WPFWin11ISOCleanResetButton"].IsEnabled = $true
|
||||
|
||||
$sync.progressBarTextBlock.Text = ""
|
||||
$sync.progressBarTextBlock.ToolTip = ""
|
||||
$sync.ProgressBar.Value = 0
|
||||
|
||||
$sync["WPFWin11ISOStatusLog"].Text = "Ready. Please select a Windows 11 ISO to begin."
|
||||
})
|
||||
} catch {
|
||||
Log "ERROR during Clean & Reset: $_"
|
||||
$sync["WPFWin11ISOStatusLog"].Dispatcher.Invoke([action]{
|
||||
$sync.progressBarTextBlock.Text = ""
|
||||
$sync.progressBarTextBlock.ToolTip = ""
|
||||
$sync.ProgressBar.Value = 0
|
||||
$sync["WPFWin11ISOCleanResetButton"].IsEnabled = $true
|
||||
})
|
||||
}
|
||||
}) | Out-Null
|
||||
@@ -495,11 +296,17 @@ function Invoke-WinUtilISOCleanAndReset {
|
||||
}
|
||||
|
||||
function Invoke-WinUtilISOExport {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Saves the modified ISO contents as a new bootable ISO file.
|
||||
Uses oscdimg.exe (part of the Windows ADK) if present; falls back
|
||||
to a reminder message if not installed.
|
||||
#>
|
||||
$contentsDir = $sync["Win11ISOContentsDir"]
|
||||
|
||||
if (-not $contentsDir -or -not (Test-Path $contentsDir)) {
|
||||
[System.Windows.MessageBox]::Show(
|
||||
"No modified ISO content found. Please complete Steps 1-3 first.",
|
||||
"No modified ISO content found. Please complete Steps 1–3 first.",
|
||||
"Not Ready", "OK", "Warning")
|
||||
return
|
||||
}
|
||||
@@ -515,58 +322,149 @@ function Invoke-WinUtilISOExport {
|
||||
if ($dlg.ShowDialog() -ne [System.Windows.Forms.DialogResult]::OK) { return }
|
||||
|
||||
$outputISO = $dlg.FileName
|
||||
Write-Win11ISOLog "Exporting to ISO: $outputISO"
|
||||
Set-WinUtilProgressBar -Label "Building ISO..." -Percent 10
|
||||
|
||||
# Locate oscdimg.exe (Windows ADK or winget per-user install)
|
||||
# Locate oscdimg.exe (Windows ADK)
|
||||
$oscdimg = Get-ChildItem "C:\Program Files (x86)\Windows Kits" -Recurse -Filter "oscdimg.exe" -ErrorAction SilentlyContinue |
|
||||
Select-Object -First 1 -ExpandProperty FullName
|
||||
if (-not $oscdimg) {
|
||||
$oscdimg = Get-ChildItem "$env:LOCALAPPDATA\Microsoft\WinGet\Packages" -Recurse -Filter "oscdimg.exe" -ErrorAction SilentlyContinue |
|
||||
Where-Object { $_.FullName -match 'Microsoft\.OSCDIMG' } |
|
||||
Select-Object -First 1 -ExpandProperty FullName
|
||||
}
|
||||
|
||||
if (-not $oscdimg) {
|
||||
Write-Win11ISOLog "oscdimg.exe not found. Attempting to install via winget..."
|
||||
try {
|
||||
$winget = Get-Command winget -ErrorAction Stop
|
||||
$result = & $winget install -e --id Microsoft.OSCDIMG --accept-package-agreements --accept-source-agreements 2>&1
|
||||
Write-Win11ISOLog "winget output: $result"
|
||||
$oscdimg = Get-ChildItem "$env:LOCALAPPDATA\Microsoft\WinGet\Packages" -Recurse -Filter "oscdimg.exe" -ErrorAction SilentlyContinue |
|
||||
Where-Object { $_.FullName -match 'Microsoft\.OSCDIMG' } |
|
||||
Select-Object -First 1 -ExpandProperty FullName
|
||||
} catch {
|
||||
Write-Win11ISOLog "winget not available or install failed: $_"
|
||||
}
|
||||
|
||||
if (-not $oscdimg) {
|
||||
Write-Win11ISOLog "oscdimg.exe still not found after install attempt."
|
||||
Set-WinUtilProgressBar -Label "" -Percent 0
|
||||
Write-Win11ISOLog "oscdimg.exe not found. Install Windows ADK to enable ISO export."
|
||||
[System.Windows.MessageBox]::Show(
|
||||
"oscdimg.exe could not be found or installed automatically.`n`nPlease install it manually:`n winget install -e --id Microsoft.OSCDIMG`n`nOr install the Windows ADK from:`nhttps://learn.microsoft.com/windows-hardware/get-started/adk-install",
|
||||
"oscdimg Not Found", "OK", "Warning")
|
||||
"oscdimg.exe was not found.`n`nTo export an ISO you need the Windows Assessment and Deployment Kit (ADK).`n`nDownload it from: https://learn.microsoft.com/windows-hardware/get-started/adk-install",
|
||||
"Windows ADK Required", "OK", "Warning")
|
||||
return
|
||||
}
|
||||
Write-Win11ISOLog "oscdimg.exe installed successfully."
|
||||
|
||||
# Build boot parameters (BIOS + UEFI dual-boot)
|
||||
$bootData = "2#p0,e,b`"$contentsDir\boot\etfsboot.com`"#pEF,e,b`"$contentsDir\efi\microsoft\boot\efisys.bin`""
|
||||
$oscdimgArgs = @(
|
||||
"-m", # ignore source path max size
|
||||
"-o", # optimise storage
|
||||
"-u2", # UDF 2.01
|
||||
"-udfver102",
|
||||
"-bootdata:$bootData",
|
||||
"-l`"CTOS_MODIFIED`"",
|
||||
"`"$contentsDir`"",
|
||||
"`"$outputISO`""
|
||||
)
|
||||
|
||||
try {
|
||||
Write-Win11ISOLog "Running oscdimg..."
|
||||
$proc = Start-Process -FilePath $oscdimg -ArgumentList $oscdimgArgs -Wait -PassThru -NoNewWindow
|
||||
if ($proc.ExitCode -eq 0) {
|
||||
Set-WinUtilProgressBar -Label "ISO exported ✔" -Percent 100
|
||||
Write-Win11ISOLog "ISO exported successfully: $outputISO"
|
||||
[System.Windows.MessageBox]::Show(
|
||||
"ISO exported successfully!`n`n$outputISO",
|
||||
"Export Complete", "OK", "Info")
|
||||
} else {
|
||||
Write-Win11ISOLog "oscdimg exited with code $($proc.ExitCode)."
|
||||
[System.Windows.MessageBox]::Show(
|
||||
"oscdimg exited with code $($proc.ExitCode).`nCheck the status log for details.",
|
||||
"Export Error", "OK", "Error")
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-Win11ISOLog "ERROR during ISO export: $_"
|
||||
[System.Windows.MessageBox]::Show("ISO export failed:`n`n$_","Error","OK","Error")
|
||||
}
|
||||
finally {
|
||||
Start-Sleep -Milliseconds 800
|
||||
Set-WinUtilProgressBar -Label "" -Percent 0
|
||||
}
|
||||
}
|
||||
|
||||
$sync["WPFWin11ISOChooseISOButton"].IsEnabled = $false
|
||||
function Invoke-WinUtilISORefreshUSBDrives {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Populates the USB drive ComboBox with all currently attached removable drives.
|
||||
#>
|
||||
$combo = $sync["WPFWin11ISOUSBDriveComboBox"]
|
||||
$combo.Items.Clear()
|
||||
|
||||
$removable = Get-Disk | Where-Object { $_.BusType -eq "USB" } | Sort-Object Number
|
||||
|
||||
if ($removable.Count -eq 0) {
|
||||
$combo.Items.Add("No USB drives detected")
|
||||
$combo.SelectedIndex = 0
|
||||
Write-Win11ISOLog "No USB drives detected."
|
||||
return
|
||||
}
|
||||
|
||||
foreach ($disk in $removable) {
|
||||
$sizeGB = [math]::Round($disk.Size / 1GB, 1)
|
||||
$label = "Disk $($disk.Number): $($disk.FriendlyName) [$sizeGB GB] — $($disk.PartitionStyle)"
|
||||
$combo.Items.Add($label)
|
||||
}
|
||||
$combo.SelectedIndex = 0
|
||||
Write-Win11ISOLog "Found $($removable.Count) USB drive(s)."
|
||||
|
||||
# Store disk objects for later use
|
||||
$sync["Win11ISOUSBDisks"] = $removable
|
||||
}
|
||||
|
||||
function Invoke-WinUtilISOWriteUSB {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Erases the selected USB drive and writes the modified Windows 11 ISO
|
||||
content as a bootable installation drive (using DISM / robocopy approach).
|
||||
#>
|
||||
$contentsDir = $sync["Win11ISOContentsDir"]
|
||||
$usbDisks = $sync["Win11ISOUSBDisks"]
|
||||
|
||||
if (-not $contentsDir -or -not (Test-Path $contentsDir)) {
|
||||
[System.Windows.MessageBox]::Show(
|
||||
"No modified ISO content found. Please complete Steps 1–3 first.",
|
||||
"Not Ready", "OK", "Warning")
|
||||
return
|
||||
}
|
||||
|
||||
$selectedIndex = $sync["WPFWin11ISOUSBDriveComboBox"].SelectedIndex
|
||||
if ($selectedIndex -lt 0 -or -not $usbDisks -or $selectedIndex -ge $usbDisks.Count) {
|
||||
[System.Windows.MessageBox]::Show(
|
||||
"Please select a USB drive from the dropdown.",
|
||||
"No Drive Selected", "OK", "Warning")
|
||||
return
|
||||
}
|
||||
|
||||
$targetDisk = $usbDisks[$selectedIndex]
|
||||
$diskNum = $targetDisk.Number
|
||||
$sizeGB = [math]::Round($targetDisk.Size / 1GB, 1)
|
||||
|
||||
$confirm = [System.Windows.MessageBox]::Show(
|
||||
"ALL data on Disk $diskNum ($($targetDisk.FriendlyName), $sizeGB GB) will be PERMANENTLY ERASED.`n`nAre you sure you want to continue?",
|
||||
"Confirm USB Erase", "YesNo", "Warning")
|
||||
|
||||
if ($confirm -ne "Yes") {
|
||||
Write-Win11ISOLog "USB write cancelled by user."
|
||||
return
|
||||
}
|
||||
|
||||
$sync["WPFWin11ISOWriteUSBButton"].IsEnabled = $false
|
||||
Write-Win11ISOLog "Starting USB write to Disk $diskNum..."
|
||||
|
||||
$runspace = [Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace()
|
||||
$runspace.ApartmentState = "STA"
|
||||
$runspace.ThreadOptions = "ReuseThread"
|
||||
$runspace.Open()
|
||||
$runspace.SessionStateProxy.SetVariable("sync", $sync)
|
||||
$runspace.SessionStateProxy.SetVariable("diskNum", $diskNum)
|
||||
$runspace.SessionStateProxy.SetVariable("contentsDir", $contentsDir)
|
||||
$runspace.SessionStateProxy.SetVariable("outputISO", $outputISO)
|
||||
$runspace.SessionStateProxy.SetVariable("oscdimg", $oscdimg)
|
||||
|
||||
$win11ISOLogFuncDef = "function Write-Win11ISOLog {`n" + ${function:Write-Win11ISOLog}.ToString() + "`n}"
|
||||
$runspace.SessionStateProxy.SetVariable("win11ISOLogFuncDef", $win11ISOLogFuncDef)
|
||||
|
||||
$script = [Management.Automation.PowerShell]::Create()
|
||||
$script.Runspace = $runspace
|
||||
$script.AddScript({
|
||||
. ([scriptblock]::Create($win11ISOLogFuncDef))
|
||||
|
||||
function Log($msg) {
|
||||
$ts = (Get-Date).ToString("HH:mm:ss")
|
||||
$sync["WPFWin11ISOStatusLog"].Dispatcher.Invoke([action]{
|
||||
$sync["WPFWin11ISOStatusLog"].Text += "`n[$ts] $msg"
|
||||
$sync["WPFWin11ISOStatusLog"].ScrollToEnd()
|
||||
})
|
||||
}
|
||||
function SetProgress($label, $pct) {
|
||||
$sync["WPFWin11ISOStatusLog"].Dispatcher.Invoke([action]{
|
||||
$sync.progressBarTextBlock.Text = $label
|
||||
@@ -576,66 +474,96 @@ function Invoke-WinUtilISOExport {
|
||||
}
|
||||
|
||||
try {
|
||||
Write-Win11ISOLog "Exporting to ISO: $outputISO"
|
||||
SetProgress "Building ISO..." 10
|
||||
SetProgress "Formatting USB drive..." 10
|
||||
|
||||
$bootData = "2#p0,e,b`"$contentsDir\boot\etfsboot.com`"#pEF,e,b`"$contentsDir\efi\microsoft\boot\efisys.bin`""
|
||||
$oscdimgArgs = @("-m", "-o", "-u2", "-udfver102", "-bootdata:$bootData", "-l`"CTOS_MODIFIED`"", "`"$contentsDir`"", "`"$outputISO`"")
|
||||
# ── Diskpart script: clean, GPT, create ESP + data partitions ──
|
||||
$dpScript = @"
|
||||
select disk $diskNum
|
||||
clean
|
||||
convert gpt
|
||||
create partition efi size=512
|
||||
format quick fs=fat32 label="SYSTEM"
|
||||
assign
|
||||
create partition primary
|
||||
format quick fs=fat32 label="WINPE"
|
||||
assign
|
||||
exit
|
||||
"@
|
||||
$dpFile = Join-Path $env:TEMP "winutil_diskpart_$(Get-Random).txt"
|
||||
$dpScript | Set-Content -Path $dpFile -Encoding ASCII
|
||||
Log "Running diskpart on Disk $diskNum..."
|
||||
diskpart /s $dpFile | Out-Null
|
||||
Remove-Item $dpFile -Force
|
||||
|
||||
Write-Win11ISOLog "Running oscdimg..."
|
||||
SetProgress "Identifying USB partitions..." 30
|
||||
Start-Sleep -Seconds 3 # let Windows assign drive letters
|
||||
|
||||
$psi = [System.Diagnostics.ProcessStartInfo]::new()
|
||||
$psi.FileName = $oscdimg
|
||||
$psi.Arguments = $oscdimgArgs -join " "
|
||||
$psi.RedirectStandardOutput = $true
|
||||
$psi.RedirectStandardError = $true
|
||||
$psi.UseShellExecute = $false
|
||||
$psi.CreateNoWindow = $true
|
||||
# Find newly assigned drive letter for the data partition
|
||||
$usbVol = Get-Partition -DiskNumber $diskNum |
|
||||
Where-Object { $_.Type -eq "Basic" } |
|
||||
Get-Volume |
|
||||
Where-Object { $_.FileSystemLabel -eq "WINPE" } |
|
||||
Select-Object -First 1
|
||||
|
||||
$proc = [System.Diagnostics.Process]::new()
|
||||
$proc.StartInfo = $psi
|
||||
$proc.Start() | Out-Null
|
||||
|
||||
# Stream stdout line-by-line as oscdimg runs
|
||||
while (-not $proc.StandardOutput.EndOfStream) {
|
||||
$line = $proc.StandardOutput.ReadLine()
|
||||
if ($line.Trim()) { Write-Win11ISOLog $line }
|
||||
if (-not $usbVol) {
|
||||
throw "Could not locate the formatted USB data partition. Drive letter may not have been assigned automatically."
|
||||
}
|
||||
|
||||
$proc.WaitForExit()
|
||||
$usbDrive = "$($usbVol.DriveLetter):"
|
||||
Log "USB data partition: $usbDrive"
|
||||
SetProgress "Copying Windows 11 files to USB..." 45
|
||||
|
||||
# Flush any stderr after process exits
|
||||
$stderr = $proc.StandardError.ReadToEnd()
|
||||
foreach ($line in ($stderr -split "`r?`n")) {
|
||||
if ($line.Trim()) { Write-Win11ISOLog "[stderr]$line" }
|
||||
}
|
||||
# ── Copy files (split large install.wim if > 4 GB for FAT32) ──
|
||||
$installWim = Join-Path $contentsDir "sources\install.wim"
|
||||
if (Test-Path $installWim) {
|
||||
$wimSizeMB = [math]::Round((Get-Item $installWim).Length / 1MB)
|
||||
if ($wimSizeMB -gt 3800) {
|
||||
# FAT32 limit – split with DISM
|
||||
Log "install.wim is $wimSizeMB MB – splitting for FAT32 compatibility..."
|
||||
$splitDest = Join-Path $usbDrive "sources\install.swm"
|
||||
New-Item -ItemType Directory -Path (Split-Path $splitDest) -Force | Out-Null
|
||||
Split-WindowsImage -ImagePath $installWim `
|
||||
-SplitImagePath $splitDest `
|
||||
-FileSize 3800 -CheckIntegrity | Out-Null
|
||||
Log "install.wim split complete."
|
||||
|
||||
if ($proc.ExitCode -eq 0) {
|
||||
SetProgress "ISO exported" 100
|
||||
Write-Win11ISOLog "ISO exported successfully: $outputISO"
|
||||
$sync["WPFWin11ISOStatusLog"].Dispatcher.Invoke([action]{
|
||||
[System.Windows.MessageBox]::Show("ISO exported successfully!`n`n$outputISO", "Export Complete", "OK", "Info")
|
||||
})
|
||||
# Copy everything else (exclude install.wim)
|
||||
$robocopyArgs = @($contentsDir, $usbDrive, "/E", "/XF", "install.wim", "/NFL", "/NDL", "/NJH", "/NJS")
|
||||
& robocopy @robocopyArgs | Out-Null
|
||||
} else {
|
||||
Write-Win11ISOLog "oscdimg exited with code $($proc.ExitCode)."
|
||||
& robocopy $contentsDir $usbDrive /E /NFL /NDL /NJH /NJS | Out-Null
|
||||
}
|
||||
} else {
|
||||
& robocopy $contentsDir $usbDrive /E /NFL /NDL /NJH /NJS | Out-Null
|
||||
}
|
||||
|
||||
SetProgress "Finalising USB drive..." 90
|
||||
Log "Files copied to USB."
|
||||
|
||||
SetProgress "USB write complete ✔" 100
|
||||
Log "USB drive is ready for use."
|
||||
|
||||
$sync["WPFWin11ISOStatusLog"].Dispatcher.Invoke([action]{
|
||||
[System.Windows.MessageBox]::Show(
|
||||
"oscdimg exited with code $($proc.ExitCode).`nCheck the status log for details.",
|
||||
"Export Error", "OK", "Error")
|
||||
"USB drive created successfully!`n`nYou can now boot from this drive to install Windows 11.",
|
||||
"USB Ready", "OK", "Info")
|
||||
})
|
||||
}
|
||||
} catch {
|
||||
Write-Win11ISOLog "ERROR during ISO export: $_"
|
||||
catch {
|
||||
Log "ERROR during USB write: $_"
|
||||
$sync["WPFWin11ISOStatusLog"].Dispatcher.Invoke([action]{
|
||||
[System.Windows.MessageBox]::Show("ISO export failed:`n`n$_", "Error", "OK", "Error")
|
||||
[System.Windows.MessageBox]::Show(
|
||||
"USB write failed:`n`n$_",
|
||||
"USB Write Error", "OK", "Error")
|
||||
})
|
||||
} finally {
|
||||
}
|
||||
finally {
|
||||
Start-Sleep -Milliseconds 800
|
||||
$sync["WPFWin11ISOStatusLog"].Dispatcher.Invoke([action]{
|
||||
$sync.progressBarTextBlock.Text = ""
|
||||
$sync.progressBarTextBlock.ToolTip = ""
|
||||
$sync.ProgressBar.Value = 0
|
||||
$sync["WPFWin11ISOChooseISOButton"].IsEnabled = $true
|
||||
$sync["WPFWin11ISOWriteUSBButton"].IsEnabled = $true
|
||||
})
|
||||
}
|
||||
}) | Out-Null
|
||||
|
||||
@@ -1,119 +1,74 @@
|
||||
function Invoke-WinUtilISOScript {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Applies WinUtil modifications to a mounted Windows 11 install.wim image.
|
||||
Applies the standard WinUtil modifications to a mounted Windows 11 install.wim image.
|
||||
|
||||
.DESCRIPTION
|
||||
Removes AppX bloatware and OneDrive, optionally injects all drivers exported from
|
||||
the running system into install.wim and boot.wim (controlled by the
|
||||
-InjectCurrentSystemDrivers switch), applies offline registry tweaks (hardware
|
||||
bypass, privacy, OOBE, telemetry, update suppression), deletes CEIP/WU
|
||||
scheduled-task definition files, and optionally writes autounattend.xml to the ISO
|
||||
root and removes the support\ folder from the ISO contents directory.
|
||||
Removes bloatware AppX packages, Edge, OneDrive, applies privacy/telemetry
|
||||
registry tweaks, disables sponsored-app delivery, bypasses hardware checks,
|
||||
copies autounattend.xml for local-account OOBE, and deletes unwanted
|
||||
scheduled-task definition files — all against an already-mounted WIM image.
|
||||
|
||||
All setup scripts embedded in the autounattend.xml <Extensions><File> nodes are
|
||||
written directly into the WIM at their target paths under C:\Windows\Setup\Scripts\
|
||||
to ensure they survive Windows Setup stripping unrecognised-namespace XML elements
|
||||
from the Panther copy of the answer file.
|
||||
|
||||
Mounting/dismounting the WIM is the caller's responsibility (e.g. Invoke-WinUtilISO).
|
||||
Mounting and dismounting the WIM is the responsibility of the caller
|
||||
(e.g. Invoke-WinUtilISOModify).
|
||||
|
||||
.PARAMETER ScratchDir
|
||||
Mandatory. Full path to the directory where the Windows image is currently mounted.
|
||||
|
||||
.PARAMETER ISOContentsDir
|
||||
Optional. Root directory of the extracted ISO contents. When supplied,
|
||||
autounattend.xml is written here and the support\ folder is removed.
|
||||
|
||||
.PARAMETER AutoUnattendXml
|
||||
Optional. Full XML content for autounattend.xml. If empty, the OOBE bypass
|
||||
file is skipped and a warning is logged.
|
||||
|
||||
.PARAMETER InjectCurrentSystemDrivers
|
||||
Optional. When $true, exports all drivers from the running system and injects
|
||||
them into install.wim and boot.wim index 2 (Windows Setup PE).
|
||||
Defaults to $false.
|
||||
Full path to the directory where the Windows image is currently mounted
|
||||
(the "scratchdir"). Example: C:\Temp\WinUtil_Win11ISO_20260222\wim_mount
|
||||
|
||||
.PARAMETER Log
|
||||
Optional ScriptBlock for progress/status logging. Receives a single [string] argument.
|
||||
Optional ScriptBlock used for progress/status logging.
|
||||
Receives a single [string] message argument.
|
||||
Defaults to Write-Output when not supplied.
|
||||
|
||||
.EXAMPLE
|
||||
Invoke-WinUtilISOScript -ScratchDir "C:\Temp\wim_mount"
|
||||
|
||||
.EXAMPLE
|
||||
Invoke-WinUtilISOScript `
|
||||
-ScratchDir $mountDir `
|
||||
-ISOContentsDir $isoRoot `
|
||||
-AutoUnattendXml (Get-Content .\tools\autounattend.xml -Raw) `
|
||||
-Log { param($m) Write-Host $m }
|
||||
Invoke-WinUtilISOScript -ScratchDir $mountDir -Log { param($m) Write-Host $m }
|
||||
|
||||
.NOTES
|
||||
Author : Chris Titus @christitustech
|
||||
GitHub : https://github.com/ChrisTitusTech
|
||||
Version : 26.03.02
|
||||
Version : 26.02.22
|
||||
#>
|
||||
param (
|
||||
[Parameter(Mandatory)][string]$ScratchDir,
|
||||
[string]$ISOContentsDir = "",
|
||||
[string]$AutoUnattendXml = "",
|
||||
[bool]$InjectCurrentSystemDrivers = $false,
|
||||
[scriptblock]$Log = { param($m) Write-Output $m }
|
||||
)
|
||||
|
||||
# ── Resolve admin group name (for takeown / icacls) ──────────────────────
|
||||
$adminSID = New-Object System.Security.Principal.SecurityIdentifier('S-1-5-32-544')
|
||||
$adminGroup = $adminSID.Translate([System.Security.Principal.NTAccount])
|
||||
|
||||
function Set-ISOScriptReg {
|
||||
# ── Local helpers ─────────────────────────────────────────────────────────
|
||||
function _ISOScript-SetReg {
|
||||
param ([string]$path, [string]$name, [string]$type, [string]$value)
|
||||
try {
|
||||
& reg add $path /v $name /t $type /d $value /f
|
||||
& reg add $path /v $name /t $type /d $value /f | Out-Null
|
||||
& $Log "Set registry value: $path\$name"
|
||||
} catch {
|
||||
& $Log "Error setting registry value: $_"
|
||||
}
|
||||
}
|
||||
|
||||
function Remove-ISOScriptReg {
|
||||
function _ISOScript-DelReg {
|
||||
param ([string]$path)
|
||||
try {
|
||||
& reg delete $path /f
|
||||
& reg delete $path /f | Out-Null
|
||||
& $Log "Removed registry key: $path"
|
||||
} catch {
|
||||
& $Log "Error removing registry key: $_"
|
||||
}
|
||||
}
|
||||
|
||||
function Add-DriversToImage {
|
||||
param ([string]$MountPath, [string]$DriverDir, [string]$Label = "image", [scriptblock]$Logger)
|
||||
& dism /English "/image:$MountPath" /Add-Driver "/Driver:$DriverDir" /Recurse 2>&1 |
|
||||
ForEach-Object { & $Logger " dism[$Label]: $_" }
|
||||
}
|
||||
|
||||
function Invoke-BootWimInject {
|
||||
param ([string]$BootWimPath, [string]$DriverDir, [scriptblock]$Logger)
|
||||
Set-ItemProperty -Path $BootWimPath -Name IsReadOnly -Value $false -ErrorAction SilentlyContinue
|
||||
$mountDir = Join-Path $env:TEMP "WinUtil_BootMount_$(Get-Random)"
|
||||
New-Item -Path $mountDir -ItemType Directory -Force | Out-Null
|
||||
try {
|
||||
& $Logger "Mounting boot.wim (index 2) for driver injection..."
|
||||
Mount-WindowsImage -ImagePath $BootWimPath -Index 2 -Path $mountDir -ErrorAction Stop | Out-Null
|
||||
Add-DriversToImage -MountPath $mountDir -DriverDir $DriverDir -Label "boot" -Logger $Logger
|
||||
& $Logger "Saving boot.wim..."
|
||||
Dismount-WindowsImage -Path $mountDir -Save -ErrorAction Stop | Out-Null
|
||||
& $Logger "boot.wim driver injection complete."
|
||||
} catch {
|
||||
& $Logger "Warning: boot.wim driver injection failed: $_"
|
||||
try { Dismount-WindowsImage -Path $mountDir -Discard -ErrorAction SilentlyContinue | Out-Null } catch {}
|
||||
} finally {
|
||||
Remove-Item -Path $mountDir -Recurse -Force -ErrorAction SilentlyContinue
|
||||
}
|
||||
}
|
||||
|
||||
# ── 1. Remove provisioned AppX packages ──────────────────────────────────
|
||||
# ═════════════════════════════════════════════════════════════════════════
|
||||
# 1. Remove provisioned AppX packages
|
||||
# ═════════════════════════════════════════════════════════════════════════
|
||||
& $Log "Removing provisioned AppX packages..."
|
||||
|
||||
$packages = & dism /English "/image:$ScratchDir" /Get-ProvisionedAppxPackages |
|
||||
ForEach-Object { if ($_ -match 'PackageName : (.*)') { $matches[1] } }
|
||||
ForEach-Object {
|
||||
if ($_ -match 'PackageName : (.*)') { $matches[1] }
|
||||
}
|
||||
|
||||
$packagePrefixes = @(
|
||||
'AppUp.IntelManagementandSecurityStatus',
|
||||
@@ -125,6 +80,7 @@ function Invoke-WinUtilISOScript {
|
||||
'Microsoft.BingWeather',
|
||||
'Microsoft.Copilot',
|
||||
'Microsoft.Windows.CrossDevice',
|
||||
'Microsoft.GamingApp',
|
||||
'Microsoft.GetHelp',
|
||||
'Microsoft.Getstarted',
|
||||
'Microsoft.Microsoft3DViewer',
|
||||
@@ -152,227 +108,163 @@ function Invoke-WinUtilISOScript {
|
||||
'Microsoft.WindowsFeedbackHub',
|
||||
'Microsoft.WindowsMaps',
|
||||
'Microsoft.WindowsSoundRecorder',
|
||||
'Microsoft.WindowsTerminal',
|
||||
'Microsoft.ZuneMusic',
|
||||
'Microsoft.ZuneVideo',
|
||||
'MicrosoftCorporationII.MicrosoftFamily',
|
||||
'MicrosoftCorporationII.QuickAssist',
|
||||
'MSTeams',
|
||||
'MicrosoftTeams'
|
||||
'MicrosoftTeams',
|
||||
'Microsoft.549981C3F5F10'
|
||||
)
|
||||
|
||||
$packages | Where-Object { $pkg = $_; $packagePrefixes | Where-Object { $pkg -like "*$_*" } } |
|
||||
ForEach-Object { & dism /English "/image:$ScratchDir" /Remove-ProvisionedAppxPackage "/PackageName:$_" }
|
||||
|
||||
# ── 2. Inject current system drivers (optional) ───────────────────────────
|
||||
if ($InjectCurrentSystemDrivers) {
|
||||
& $Log "Exporting all drivers from running system..."
|
||||
$driverExportRoot = Join-Path $env:TEMP "WinUtil_DriverExport_$(Get-Random)"
|
||||
New-Item -Path $driverExportRoot -ItemType Directory -Force | Out-Null
|
||||
try {
|
||||
Export-WindowsDriver -Online -Destination $driverExportRoot | Out-Null
|
||||
|
||||
& $Log "Injecting current system drivers into install.wim..."
|
||||
Add-DriversToImage -MountPath $ScratchDir -DriverDir $driverExportRoot -Label "install" -Logger $Log
|
||||
& $Log "install.wim driver injection complete."
|
||||
|
||||
if ($ISOContentsDir -and (Test-Path $ISOContentsDir)) {
|
||||
$bootWim = Join-Path $ISOContentsDir "sources\boot.wim"
|
||||
if (Test-Path $bootWim) {
|
||||
& $Log "Injecting current system drivers into boot.wim..."
|
||||
Invoke-BootWimInject -BootWimPath $bootWim -DriverDir $driverExportRoot -Logger $Log
|
||||
} else {
|
||||
& $Log "Warning: boot.wim not found — skipping boot.wim driver injection."
|
||||
$packagesToRemove = $packages | Where-Object {
|
||||
$pkg = $_
|
||||
$packagePrefixes | Where-Object { $pkg -like "*$_*" }
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
& $Log "Error during driver export/injection: $_"
|
||||
} finally {
|
||||
Remove-Item -Path $driverExportRoot -Recurse -Force -ErrorAction SilentlyContinue
|
||||
}
|
||||
} else {
|
||||
& $Log "Driver injection skipped."
|
||||
foreach ($package in $packagesToRemove) {
|
||||
& dism /English "/image:$ScratchDir" /Remove-ProvisionedAppxPackage "/PackageName:$package"
|
||||
}
|
||||
|
||||
# ── 3. Remove OneDrive ────────────────────────────────────────────────────
|
||||
# ═════════════════════════════════════════════════════════════════════════
|
||||
# 2. Remove Edge
|
||||
# ═════════════════════════════════════════════════════════════════════════
|
||||
& $Log "Removing Edge..."
|
||||
Remove-Item -Path "$ScratchDir\Program Files (x86)\Microsoft\Edge" -Recurse -Force -ErrorAction SilentlyContinue
|
||||
Remove-Item -Path "$ScratchDir\Program Files (x86)\Microsoft\EdgeUpdate" -Recurse -Force -ErrorAction SilentlyContinue
|
||||
Remove-Item -Path "$ScratchDir\Program Files (x86)\Microsoft\EdgeCore" -Recurse -Force -ErrorAction SilentlyContinue
|
||||
& takeown /f "$ScratchDir\Windows\System32\Microsoft-Edge-Webview" /r | Out-Null
|
||||
& icacls "$ScratchDir\Windows\System32\Microsoft-Edge-Webview" /grant "$($adminGroup.Value):(F)" /T /C | Out-Null
|
||||
Remove-Item -Path "$ScratchDir\Windows\System32\Microsoft-Edge-Webview" -Recurse -Force -ErrorAction SilentlyContinue
|
||||
|
||||
# ═════════════════════════════════════════════════════════════════════════
|
||||
# 3. Remove OneDrive
|
||||
# ═════════════════════════════════════════════════════════════════════════
|
||||
& $Log "Removing OneDrive..."
|
||||
& takeown /f "$ScratchDir\Windows\System32\OneDriveSetup.exe" | Out-Null
|
||||
& icacls "$ScratchDir\Windows\System32\OneDriveSetup.exe" /grant "$($adminGroup.Value):(F)" /T /C | Out-Null
|
||||
Remove-Item -Path "$ScratchDir\Windows\System32\OneDriveSetup.exe" -Force -ErrorAction SilentlyContinue
|
||||
|
||||
# ── 4. Registry tweaks ────────────────────────────────────────────────────
|
||||
# ═════════════════════════════════════════════════════════════════════════
|
||||
# 4. Registry tweaks
|
||||
# ═════════════════════════════════════════════════════════════════════════
|
||||
& $Log "Loading offline registry hives..."
|
||||
reg load HKLM\zCOMPONENTS "$ScratchDir\Windows\System32\config\COMPONENTS"
|
||||
reg load HKLM\zDEFAULT "$ScratchDir\Windows\System32\config\default"
|
||||
reg load HKLM\zNTUSER "$ScratchDir\Users\Default\ntuser.dat"
|
||||
reg load HKLM\zSOFTWARE "$ScratchDir\Windows\System32\config\SOFTWARE"
|
||||
reg load HKLM\zSYSTEM "$ScratchDir\Windows\System32\config\SYSTEM"
|
||||
reg load HKLM\zCOMPONENTS "$ScratchDir\Windows\System32\config\COMPONENTS" | Out-Null
|
||||
reg load HKLM\zDEFAULT "$ScratchDir\Windows\System32\config\default" | Out-Null
|
||||
reg load HKLM\zNTUSER "$ScratchDir\Users\Default\ntuser.dat" | Out-Null
|
||||
reg load HKLM\zSOFTWARE "$ScratchDir\Windows\System32\config\SOFTWARE" | Out-Null
|
||||
reg load HKLM\zSYSTEM "$ScratchDir\Windows\System32\config\SYSTEM" | Out-Null
|
||||
|
||||
& $Log "Bypassing system requirements..."
|
||||
Set-ISOScriptReg 'HKLM\zDEFAULT\Control Panel\UnsupportedHardwareNotificationCache' 'SV1' 'REG_DWORD' '0'
|
||||
Set-ISOScriptReg 'HKLM\zDEFAULT\Control Panel\UnsupportedHardwareNotificationCache' 'SV2' 'REG_DWORD' '0'
|
||||
Set-ISOScriptReg 'HKLM\zNTUSER\Control Panel\UnsupportedHardwareNotificationCache' 'SV1' 'REG_DWORD' '0'
|
||||
Set-ISOScriptReg 'HKLM\zNTUSER\Control Panel\UnsupportedHardwareNotificationCache' 'SV2' 'REG_DWORD' '0'
|
||||
Set-ISOScriptReg 'HKLM\zSYSTEM\Setup\LabConfig' 'BypassCPUCheck' 'REG_DWORD' '1'
|
||||
Set-ISOScriptReg 'HKLM\zSYSTEM\Setup\LabConfig' 'BypassRAMCheck' 'REG_DWORD' '1'
|
||||
Set-ISOScriptReg 'HKLM\zSYSTEM\Setup\LabConfig' 'BypassSecureBootCheck' 'REG_DWORD' '1'
|
||||
Set-ISOScriptReg 'HKLM\zSYSTEM\Setup\LabConfig' 'BypassStorageCheck' 'REG_DWORD' '1'
|
||||
Set-ISOScriptReg 'HKLM\zSYSTEM\Setup\LabConfig' 'BypassTPMCheck' 'REG_DWORD' '1'
|
||||
Set-ISOScriptReg 'HKLM\zSYSTEM\Setup\MoSetup' 'AllowUpgradesWithUnsupportedTPMOrCPU' 'REG_DWORD' '1'
|
||||
_ISOScript-SetReg 'HKLM\zDEFAULT\Control Panel\UnsupportedHardwareNotificationCache' 'SV1' 'REG_DWORD' '0'
|
||||
_ISOScript-SetReg 'HKLM\zDEFAULT\Control Panel\UnsupportedHardwareNotificationCache' 'SV2' 'REG_DWORD' '0'
|
||||
_ISOScript-SetReg 'HKLM\zNTUSER\Control Panel\UnsupportedHardwareNotificationCache' 'SV1' 'REG_DWORD' '0'
|
||||
_ISOScript-SetReg 'HKLM\zNTUSER\Control Panel\UnsupportedHardwareNotificationCache' 'SV2' 'REG_DWORD' '0'
|
||||
_ISOScript-SetReg 'HKLM\zSYSTEM\Setup\LabConfig' 'BypassCPUCheck' 'REG_DWORD' '1'
|
||||
_ISOScript-SetReg 'HKLM\zSYSTEM\Setup\LabConfig' 'BypassRAMCheck' 'REG_DWORD' '1'
|
||||
_ISOScript-SetReg 'HKLM\zSYSTEM\Setup\LabConfig' 'BypassSecureBootCheck' 'REG_DWORD' '1'
|
||||
_ISOScript-SetReg 'HKLM\zSYSTEM\Setup\LabConfig' 'BypassStorageCheck' 'REG_DWORD' '1'
|
||||
_ISOScript-SetReg 'HKLM\zSYSTEM\Setup\LabConfig' 'BypassTPMCheck' 'REG_DWORD' '1'
|
||||
_ISOScript-SetReg 'HKLM\zSYSTEM\Setup\MoSetup' 'AllowUpgradesWithUnsupportedTPMOrCPU' 'REG_DWORD' '1'
|
||||
|
||||
& $Log "Disabling sponsored apps..."
|
||||
Set-ISOScriptReg 'HKLM\zNTUSER\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager' 'OemPreInstalledAppsEnabled' 'REG_DWORD' '0'
|
||||
Set-ISOScriptReg 'HKLM\zNTUSER\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager' 'PreInstalledAppsEnabled' 'REG_DWORD' '0'
|
||||
Set-ISOScriptReg 'HKLM\zNTUSER\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager' 'SilentInstalledAppsEnabled' 'REG_DWORD' '0'
|
||||
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\CloudContent' 'DisableWindowsConsumerFeatures' 'REG_DWORD' '1'
|
||||
Set-ISOScriptReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager' 'ContentDeliveryAllowed' 'REG_DWORD' '0'
|
||||
Set-ISOScriptReg 'HKLM\zSOFTWARE\Microsoft\PolicyManager\current\device\Start' 'ConfigureStartPins' 'REG_SZ' '{"pinnedList": [{}]}'
|
||||
Set-ISOScriptReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager' 'FeatureManagementEnabled' 'REG_DWORD' '0'
|
||||
Set-ISOScriptReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager' 'PreInstalledAppsEverEnabled' 'REG_DWORD' '0'
|
||||
Set-ISOScriptReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager' 'SoftLandingEnabled' 'REG_DWORD' '0'
|
||||
Set-ISOScriptReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager' 'SubscribedContentEnabled' 'REG_DWORD' '0'
|
||||
Set-ISOScriptReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager' 'SubscribedContent-310093Enabled' 'REG_DWORD' '0'
|
||||
Set-ISOScriptReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager' 'SubscribedContent-338388Enabled' 'REG_DWORD' '0'
|
||||
Set-ISOScriptReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager' 'SubscribedContent-338389Enabled' 'REG_DWORD' '0'
|
||||
Set-ISOScriptReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager' 'SubscribedContent-338393Enabled' 'REG_DWORD' '0'
|
||||
Set-ISOScriptReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager' 'SubscribedContent-353694Enabled' 'REG_DWORD' '0'
|
||||
Set-ISOScriptReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager' 'SubscribedContent-353696Enabled' 'REG_DWORD' '0'
|
||||
Set-ISOScriptReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager' 'SystemPaneSuggestionsEnabled' 'REG_DWORD' '0'
|
||||
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\PushToInstall' 'DisablePushToInstall' 'REG_DWORD' '1'
|
||||
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\MRT' 'DontOfferThroughWUAU' 'REG_DWORD' '1'
|
||||
Remove-ISOScriptReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager\Subscriptions'
|
||||
Remove-ISOScriptReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager\SuggestedApps'
|
||||
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\CloudContent' 'DisableConsumerAccountStateContent' 'REG_DWORD' '1'
|
||||
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\CloudContent' 'DisableCloudOptimizedContent' 'REG_DWORD' '1'
|
||||
_ISOScript-SetReg 'HKLM\zNTUSER\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager' 'OemPreInstalledAppsEnabled' 'REG_DWORD' '0'
|
||||
_ISOScript-SetReg 'HKLM\zNTUSER\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager' 'PreInstalledAppsEnabled' 'REG_DWORD' '0'
|
||||
_ISOScript-SetReg 'HKLM\zNTUSER\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager' 'SilentInstalledAppsEnabled' 'REG_DWORD' '0'
|
||||
_ISOScript-SetReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\CloudContent' 'DisableWindowsConsumerFeatures' 'REG_DWORD' '1'
|
||||
_ISOScript-SetReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager' 'ContentDeliveryAllowed' 'REG_DWORD' '0'
|
||||
_ISOScript-SetReg 'HKLM\zSOFTWARE\Microsoft\PolicyManager\current\device\Start' 'ConfigureStartPins' 'REG_SZ' '{"pinnedList": [{}]}'
|
||||
_ISOScript-SetReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager' 'FeatureManagementEnabled' 'REG_DWORD' '0'
|
||||
_ISOScript-SetReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager' 'PreInstalledAppsEverEnabled' 'REG_DWORD' '0'
|
||||
_ISOScript-SetReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager' 'SoftLandingEnabled' 'REG_DWORD' '0'
|
||||
_ISOScript-SetReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager' 'SubscribedContentEnabled' 'REG_DWORD' '0'
|
||||
_ISOScript-SetReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager' 'SubscribedContent-310093Enabled' 'REG_DWORD' '0'
|
||||
_ISOScript-SetReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager' 'SubscribedContent-338388Enabled' 'REG_DWORD' '0'
|
||||
_ISOScript-SetReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager' 'SubscribedContent-338389Enabled' 'REG_DWORD' '0'
|
||||
_ISOScript-SetReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager' 'SubscribedContent-338393Enabled' 'REG_DWORD' '0'
|
||||
_ISOScript-SetReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager' 'SubscribedContent-353694Enabled' 'REG_DWORD' '0'
|
||||
_ISOScript-SetReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager' 'SubscribedContent-353696Enabled' 'REG_DWORD' '0'
|
||||
_ISOScript-SetReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager' 'SystemPaneSuggestionsEnabled' 'REG_DWORD' '0'
|
||||
_ISOScript-SetReg 'HKLM\zSOFTWARE\Policies\Microsoft\PushToInstall' 'DisablePushToInstall' 'REG_DWORD' '1'
|
||||
_ISOScript-SetReg 'HKLM\zSOFTWARE\Policies\Microsoft\MRT' 'DontOfferThroughWUAU' 'REG_DWORD' '1'
|
||||
_ISOScript-DelReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager\Subscriptions'
|
||||
_ISOScript-DelReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager\SuggestedApps'
|
||||
_ISOScript-SetReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\CloudContent' 'DisableConsumerAccountStateContent' 'REG_DWORD' '1'
|
||||
_ISOScript-SetReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\CloudContent' 'DisableCloudOptimizedContent' 'REG_DWORD' '1'
|
||||
|
||||
& $Log "Enabling local accounts on OOBE..."
|
||||
Set-ISOScriptReg 'HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\OOBE' 'BypassNRO' 'REG_DWORD' '1'
|
||||
_ISOScript-SetReg 'HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\OOBE' 'BypassNRO' 'REG_DWORD' '1'
|
||||
|
||||
if ($AutoUnattendXml) {
|
||||
try {
|
||||
$xmlDoc = [xml]::new()
|
||||
$xmlDoc.LoadXml($AutoUnattendXml)
|
||||
|
||||
$nsMgr = New-Object System.Xml.XmlNamespaceManager($xmlDoc.NameTable)
|
||||
$nsMgr.AddNamespace("sg", "https://schneegans.de/windows/unattend-generator/")
|
||||
|
||||
$fileNodes = $xmlDoc.SelectNodes("//sg:File", $nsMgr)
|
||||
if ($fileNodes -and $fileNodes.Count -gt 0) {
|
||||
foreach ($fileNode in $fileNodes) {
|
||||
$absPath = $fileNode.GetAttribute("path")
|
||||
$relPath = $absPath -replace '^[A-Za-z]:[/\\]', ''
|
||||
$destPath = Join-Path $ScratchDir $relPath
|
||||
New-Item -Path (Split-Path $destPath -Parent) -ItemType Directory -Force -ErrorAction SilentlyContinue | Out-Null
|
||||
|
||||
$ext = [IO.Path]::GetExtension($destPath).ToLower()
|
||||
$encoding = switch ($ext) {
|
||||
{ $_ -in '.ps1', '.xml' } { [System.Text.Encoding]::UTF8 }
|
||||
{ $_ -in '.reg', '.vbs', '.js' } { [System.Text.UnicodeEncoding]::new($false, $true) }
|
||||
default { [System.Text.Encoding]::Default }
|
||||
}
|
||||
[System.IO.File]::WriteAllBytes($destPath, ($encoding.GetPreamble() + $encoding.GetBytes($fileNode.InnerText.Trim())))
|
||||
& $Log "Pre-staged setup script: $relPath"
|
||||
}
|
||||
} else {
|
||||
& $Log "Warning: no <Extensions><File> nodes found in autounattend.xml — setup scripts not pre-staged."
|
||||
}
|
||||
} catch {
|
||||
& $Log "Warning: could not pre-stage setup scripts from autounattend.xml: $_"
|
||||
}
|
||||
|
||||
if ($ISOContentsDir -and (Test-Path $ISOContentsDir)) {
|
||||
$isoDest = Join-Path $ISOContentsDir "autounattend.xml"
|
||||
Set-Content -Path $isoDest -Value $AutoUnattendXml -Encoding UTF8 -Force
|
||||
& $Log "Written autounattend.xml to ISO root ($isoDest)."
|
||||
}
|
||||
} else {
|
||||
& $Log "Warning: autounattend.xml content is empty — skipping OOBE bypass file."
|
||||
}
|
||||
$sysprepDest = "$ScratchDir\Windows\System32\Sysprep\autounattend.xml"
|
||||
Set-Content -Path $sysprepDest -Value $WinUtilAutounattendXml -Encoding UTF8 -Force
|
||||
& $Log "Written autounattend.xml to Sysprep directory."
|
||||
|
||||
& $Log "Disabling reserved storage..."
|
||||
Set-ISOScriptReg 'HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\ReserveManager' 'ShippedWithReserves' 'REG_DWORD' '0'
|
||||
_ISOScript-SetReg 'HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\ReserveManager' 'ShippedWithReserves' 'REG_DWORD' '0'
|
||||
|
||||
& $Log "Disabling BitLocker device encryption..."
|
||||
Set-ISOScriptReg 'HKLM\zSYSTEM\ControlSet001\Control\BitLocker' 'PreventDeviceEncryption' 'REG_DWORD' '1'
|
||||
_ISOScript-SetReg 'HKLM\zSYSTEM\ControlSet001\Control\BitLocker' 'PreventDeviceEncryption' 'REG_DWORD' '1'
|
||||
|
||||
& $Log "Disabling Chat icon..."
|
||||
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\Windows Chat' 'ChatIcon' 'REG_DWORD' '3'
|
||||
Set-ISOScriptReg 'HKLM\zNTUSER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced' 'TaskbarMn' 'REG_DWORD' '0'
|
||||
_ISOScript-SetReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\Windows Chat' 'ChatIcon' 'REG_DWORD' '3'
|
||||
_ISOScript-SetReg 'HKLM\zNTUSER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced' 'TaskbarMn' 'REG_DWORD' '0'
|
||||
|
||||
& $Log "Removing Edge registry entries..."
|
||||
_ISOScript-DelReg 'HKLM\zSOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft Edge'
|
||||
_ISOScript-DelReg 'HKLM\zSOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft Edge Update'
|
||||
|
||||
& $Log "Disabling OneDrive folder backup..."
|
||||
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\OneDrive' 'DisableFileSyncNGSC' 'REG_DWORD' '1'
|
||||
_ISOScript-SetReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\OneDrive' 'DisableFileSyncNGSC' 'REG_DWORD' '1'
|
||||
|
||||
& $Log "Disabling telemetry..."
|
||||
Set-ISOScriptReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\AdvertisingInfo' 'Enabled' 'REG_DWORD' '0'
|
||||
Set-ISOScriptReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\Privacy' 'TailoredExperiencesWithDiagnosticDataEnabled' 'REG_DWORD' '0'
|
||||
Set-ISOScriptReg 'HKLM\zNTUSER\Software\Microsoft\Speech_OneCore\Settings\OnlineSpeechPrivacy' 'HasAccepted' 'REG_DWORD' '0'
|
||||
Set-ISOScriptReg 'HKLM\zNTUSER\Software\Microsoft\Input\TIPC' 'Enabled' 'REG_DWORD' '0'
|
||||
Set-ISOScriptReg 'HKLM\zNTUSER\Software\Microsoft\InputPersonalization' 'RestrictImplicitInkCollection' 'REG_DWORD' '1'
|
||||
Set-ISOScriptReg 'HKLM\zNTUSER\Software\Microsoft\InputPersonalization' 'RestrictImplicitTextCollection' 'REG_DWORD' '1'
|
||||
Set-ISOScriptReg 'HKLM\zNTUSER\Software\Microsoft\InputPersonalization\TrainedDataStore' 'HarvestContacts' 'REG_DWORD' '0'
|
||||
Set-ISOScriptReg 'HKLM\zNTUSER\Software\Microsoft\Personalization\Settings' 'AcceptedPrivacyPolicy' 'REG_DWORD' '0'
|
||||
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\DataCollection' 'AllowTelemetry' 'REG_DWORD' '0'
|
||||
Set-ISOScriptReg 'HKLM\zSYSTEM\ControlSet001\Services\dmwappushservice' 'Start' 'REG_DWORD' '4'
|
||||
_ISOScript-SetReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\AdvertisingInfo' 'Enabled' 'REG_DWORD' '0'
|
||||
_ISOScript-SetReg 'HKLM\zNTUSER\Software\Microsoft\Windows\CurrentVersion\Privacy' 'TailoredExperiencesWithDiagnosticDataEnabled' 'REG_DWORD' '0'
|
||||
_ISOScript-SetReg 'HKLM\zNTUSER\Software\Microsoft\Speech_OneCore\Settings\OnlineSpeechPrivacy' 'HasAccepted' 'REG_DWORD' '0'
|
||||
_ISOScript-SetReg 'HKLM\zNTUSER\Software\Microsoft\Input\TIPC' 'Enabled' 'REG_DWORD' '0'
|
||||
_ISOScript-SetReg 'HKLM\zNTUSER\Software\Microsoft\InputPersonalization' 'RestrictImplicitInkCollection' 'REG_DWORD' '1'
|
||||
_ISOScript-SetReg 'HKLM\zNTUSER\Software\Microsoft\InputPersonalization' 'RestrictImplicitTextCollection' 'REG_DWORD' '1'
|
||||
_ISOScript-SetReg 'HKLM\zNTUSER\Software\Microsoft\InputPersonalization\TrainedDataStore' 'HarvestContacts' 'REG_DWORD' '0'
|
||||
_ISOScript-SetReg 'HKLM\zNTUSER\Software\Microsoft\Personalization\Settings' 'AcceptedPrivacyPolicy' 'REG_DWORD' '0'
|
||||
_ISOScript-SetReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\DataCollection' 'AllowTelemetry' 'REG_DWORD' '0'
|
||||
_ISOScript-SetReg 'HKLM\zSYSTEM\ControlSet001\Services\dmwappushservice' 'Start' 'REG_DWORD' '4'
|
||||
|
||||
& $Log "Preventing installation of DevHome and Outlook..."
|
||||
Set-ISOScriptReg 'HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Orchestrator\UScheduler_Oobe\OutlookUpdate' 'workCompleted' 'REG_DWORD' '1'
|
||||
Set-ISOScriptReg 'HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Orchestrator\UScheduler\OutlookUpdate' 'workCompleted' 'REG_DWORD' '1'
|
||||
Set-ISOScriptReg 'HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Orchestrator\UScheduler\DevHomeUpdate' 'workCompleted' 'REG_DWORD' '1'
|
||||
Remove-ISOScriptReg 'HKLM\zSOFTWARE\Microsoft\WindowsUpdate\Orchestrator\UScheduler_Oobe\OutlookUpdate'
|
||||
Remove-ISOScriptReg 'HKLM\zSOFTWARE\Microsoft\WindowsUpdate\Orchestrator\UScheduler_Oobe\DevHomeUpdate'
|
||||
_ISOScript-SetReg 'HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Orchestrator\UScheduler_Oobe\OutlookUpdate' 'workCompleted' 'REG_DWORD' '1'
|
||||
_ISOScript-SetReg 'HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Orchestrator\UScheduler\OutlookUpdate' 'workCompleted' 'REG_DWORD' '1'
|
||||
_ISOScript-SetReg 'HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Orchestrator\UScheduler\DevHomeUpdate' 'workCompleted' 'REG_DWORD' '1'
|
||||
_ISOScript-DelReg 'HKLM\zSOFTWARE\Microsoft\WindowsUpdate\Orchestrator\UScheduler_Oobe\OutlookUpdate'
|
||||
_ISOScript-DelReg 'HKLM\zSOFTWARE\Microsoft\WindowsUpdate\Orchestrator\UScheduler_Oobe\DevHomeUpdate'
|
||||
|
||||
& $Log "Disabling Copilot..."
|
||||
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\WindowsCopilot' 'TurnOffWindowsCopilot' 'REG_DWORD' '1'
|
||||
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Edge' 'HubsSidebarEnabled' 'REG_DWORD' '0'
|
||||
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\Explorer' 'DisableSearchBoxSuggestions' 'REG_DWORD' '1'
|
||||
|
||||
& $Log "Disabling Windows Update during OOBE (re-enabled on first logon via FirstLogon.ps1)..."
|
||||
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU' 'NoAutoUpdate' 'REG_DWORD' '1'
|
||||
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU' 'AUOptions' 'REG_DWORD' '1'
|
||||
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU' 'UseWUServer' 'REG_DWORD' '1'
|
||||
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\WindowsUpdate' 'DisableWindowsUpdateAccess' 'REG_DWORD' '1'
|
||||
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\WindowsUpdate' 'WUServer' 'REG_SZ' 'http://localhost:8080'
|
||||
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\WindowsUpdate' 'WUStatusServer' 'REG_SZ' 'http://localhost:8080'
|
||||
Set-ISOScriptReg 'HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Orchestrator\UScheduler_Oobe\WindowsUpdate' 'workCompleted' 'REG_DWORD' '1'
|
||||
Remove-ISOScriptReg 'HKLM\zSOFTWARE\Microsoft\WindowsUpdate\Orchestrator\UScheduler_Oobe\WindowsUpdate'
|
||||
Set-ISOScriptReg 'HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\DeliveryOptimization\Config' 'DODownloadMode' 'REG_DWORD' '0'
|
||||
Set-ISOScriptReg 'HKLM\zSYSTEM\ControlSet001\Services\BITS' 'Start' 'REG_DWORD' '4'
|
||||
Set-ISOScriptReg 'HKLM\zSYSTEM\ControlSet001\Services\wuauserv' 'Start' 'REG_DWORD' '4'
|
||||
Set-ISOScriptReg 'HKLM\zSYSTEM\ControlSet001\Services\UsoSvc' 'Start' 'REG_DWORD' '4'
|
||||
Set-ISOScriptReg 'HKLM\zSYSTEM\ControlSet001\Services\WaaSMedicSvc' 'Start' 'REG_DWORD' '4'
|
||||
_ISOScript-SetReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\WindowsCopilot' 'TurnOffWindowsCopilot' 'REG_DWORD' '1'
|
||||
_ISOScript-SetReg 'HKLM\zSOFTWARE\Policies\Microsoft\Edge' 'HubsSidebarEnabled' 'REG_DWORD' '0'
|
||||
_ISOScript-SetReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\Explorer' 'DisableSearchBoxSuggestions' 'REG_DWORD' '1'
|
||||
|
||||
& $Log "Preventing installation of Teams..."
|
||||
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Teams' 'DisableInstallation' 'REG_DWORD' '1'
|
||||
_ISOScript-SetReg 'HKLM\zSOFTWARE\Policies\Microsoft\Teams' 'DisableInstallation' 'REG_DWORD' '1'
|
||||
|
||||
& $Log "Preventing installation of new Outlook..."
|
||||
Set-ISOScriptReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\Windows Mail' 'PreventRun' 'REG_DWORD' '1'
|
||||
_ISOScript-SetReg 'HKLM\zSOFTWARE\Policies\Microsoft\Windows\Windows Mail' 'PreventRun' 'REG_DWORD' '1'
|
||||
|
||||
& $Log "Unloading offline registry hives..."
|
||||
reg unload HKLM\zCOMPONENTS
|
||||
reg unload HKLM\zDEFAULT
|
||||
reg unload HKLM\zNTUSER
|
||||
reg unload HKLM\zSOFTWARE
|
||||
reg unload HKLM\zSYSTEM
|
||||
reg unload HKLM\zCOMPONENTS | Out-Null
|
||||
reg unload HKLM\zDEFAULT | Out-Null
|
||||
reg unload HKLM\zNTUSER | Out-Null
|
||||
reg unload HKLM\zSOFTWARE | Out-Null
|
||||
reg unload HKLM\zSYSTEM | Out-Null
|
||||
|
||||
# ── 5. Delete scheduled task definition files ─────────────────────────────
|
||||
# ═════════════════════════════════════════════════════════════════════════
|
||||
# 5. Delete scheduled task definition files
|
||||
# ═════════════════════════════════════════════════════════════════════════
|
||||
& $Log "Deleting scheduled task definition files..."
|
||||
$tasksPath = "$ScratchDir\Windows\System32\Tasks"
|
||||
|
||||
Remove-Item "$tasksPath\Microsoft\Windows\Application Experience\Microsoft Compatibility Appraiser" -Force -ErrorAction SilentlyContinue
|
||||
Remove-Item "$tasksPath\Microsoft\Windows\Customer Experience Improvement Program" -Recurse -Force -ErrorAction SilentlyContinue
|
||||
Remove-Item "$tasksPath\Microsoft\Windows\Application Experience\ProgramDataUpdater" -Force -ErrorAction SilentlyContinue
|
||||
Remove-Item "$tasksPath\Microsoft\Windows\Chkdsk\Proxy" -Force -ErrorAction SilentlyContinue
|
||||
Remove-Item "$tasksPath\Microsoft\Windows\Windows Error Reporting\QueueReporting" -Force -ErrorAction SilentlyContinue
|
||||
Remove-Item "$tasksPath\Microsoft\Windows\InstallService" -Recurse -Force -ErrorAction SilentlyContinue
|
||||
Remove-Item "$tasksPath\Microsoft\Windows\UpdateOrchestrator" -Recurse -Force -ErrorAction SilentlyContinue
|
||||
Remove-Item "$tasksPath\Microsoft\Windows\UpdateAssistant" -Recurse -Force -ErrorAction SilentlyContinue
|
||||
Remove-Item "$tasksPath\Microsoft\Windows\WaaSMedic" -Recurse -Force -ErrorAction SilentlyContinue
|
||||
Remove-Item "$tasksPath\Microsoft\Windows\WindowsUpdate" -Recurse -Force -ErrorAction SilentlyContinue
|
||||
Remove-Item "$tasksPath\Microsoft\WindowsUpdate" -Recurse -Force -ErrorAction SilentlyContinue
|
||||
& $Log "Scheduled task files deleted."
|
||||
|
||||
# ── 6. Remove ISO support folder ─────────────────────────────────────────
|
||||
if ($ISOContentsDir -and (Test-Path $ISOContentsDir)) {
|
||||
& $Log "Removing ISO support\ folder..."
|
||||
Remove-Item -Path (Join-Path $ISOContentsDir "support") -Recurse -Force -ErrorAction SilentlyContinue
|
||||
& $Log "ISO support\ folder removed."
|
||||
}
|
||||
& $Log "Scheduled task files deleted."
|
||||
}
|
||||
|
||||
|
||||
@@ -1,240 +0,0 @@
|
||||
function Invoke-WinUtilISORefreshUSBDrives {
|
||||
$combo = $sync["WPFWin11ISOUSBDriveComboBox"]
|
||||
$removable = @(Get-Disk | Where-Object { $_.BusType -eq "USB" } | Sort-Object Number)
|
||||
|
||||
$combo.Items.Clear()
|
||||
|
||||
if ($removable.Count -eq 0) {
|
||||
$combo.Items.Add("No USB drives detected")
|
||||
$combo.SelectedIndex = 0
|
||||
$sync["Win11ISOUSBDisks"] = @()
|
||||
Write-Win11ISOLog "No USB drives detected."
|
||||
return
|
||||
}
|
||||
|
||||
foreach ($disk in $removable) {
|
||||
$sizeGB = [math]::Round($disk.Size / 1GB, 1)
|
||||
$combo.Items.Add("Disk $($disk.Number): $($disk.FriendlyName) [$sizeGB GB] - $($disk.PartitionStyle)")
|
||||
}
|
||||
$combo.SelectedIndex = 0
|
||||
Write-Win11ISOLog "Found $($removable.Count) USB drive(s)."
|
||||
$sync["Win11ISOUSBDisks"] = $removable
|
||||
}
|
||||
|
||||
function Invoke-WinUtilISOWriteUSB {
|
||||
$contentsDir = $sync["Win11ISOContentsDir"]
|
||||
$usbDisks = $sync["Win11ISOUSBDisks"]
|
||||
|
||||
if (-not $contentsDir -or -not (Test-Path $contentsDir)) {
|
||||
[System.Windows.MessageBox]::Show("No modified ISO content found. Please complete Steps 1-3 first.", "Not Ready", "OK", "Warning")
|
||||
return
|
||||
}
|
||||
|
||||
$combo = $sync["WPFWin11ISOUSBDriveComboBox"]
|
||||
$selectedIndex = $combo.SelectedIndex
|
||||
$selectedItemText = [string]$combo.SelectedItem
|
||||
$usbDisks = @($usbDisks)
|
||||
|
||||
$targetDisk = $null
|
||||
if ($selectedIndex -ge 0 -and $selectedIndex -lt $usbDisks.Count) {
|
||||
$targetDisk = $usbDisks[$selectedIndex]
|
||||
} elseif ($selectedItemText -match 'Disk\s+(\d+):') {
|
||||
$selectedDiskNum = [int]$matches[1]
|
||||
$targetDisk = $usbDisks | Where-Object { $_.Number -eq $selectedDiskNum } | Select-Object -First 1
|
||||
}
|
||||
|
||||
if (-not $targetDisk) {
|
||||
[System.Windows.MessageBox]::Show("Please select a USB drive from the dropdown.", "No Drive Selected", "OK", "Warning")
|
||||
return
|
||||
}
|
||||
|
||||
$diskNum = $targetDisk.Number
|
||||
$sizeGB = [math]::Round($targetDisk.Size / 1GB, 1)
|
||||
|
||||
$confirm = [System.Windows.MessageBox]::Show(
|
||||
"ALL data on Disk $diskNum ($($targetDisk.FriendlyName), $sizeGB GB) will be PERMANENTLY ERASED.`n`nAre you sure you want to continue?",
|
||||
"Confirm USB Erase", "YesNo", "Warning")
|
||||
|
||||
if ($confirm -ne "Yes") {
|
||||
Write-Win11ISOLog "USB write cancelled by user."
|
||||
return
|
||||
}
|
||||
|
||||
$sync["WPFWin11ISOWriteUSBButton"].IsEnabled = $false
|
||||
Write-Win11ISOLog "Starting USB write to Disk $diskNum..."
|
||||
|
||||
$runspace = [Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace()
|
||||
$runspace.ApartmentState = "STA"
|
||||
$runspace.ThreadOptions = "ReuseThread"
|
||||
$runspace.Open()
|
||||
$runspace.SessionStateProxy.SetVariable("sync", $sync)
|
||||
$runspace.SessionStateProxy.SetVariable("diskNum", $diskNum)
|
||||
$runspace.SessionStateProxy.SetVariable("contentsDir", $contentsDir)
|
||||
|
||||
$script = [Management.Automation.PowerShell]::Create()
|
||||
$script.Runspace = $runspace
|
||||
$script.AddScript({
|
||||
|
||||
function Log($msg) {
|
||||
$ts = (Get-Date).ToString("HH:mm:ss")
|
||||
$sync["WPFWin11ISOStatusLog"].Dispatcher.Invoke([action]{
|
||||
$sync["WPFWin11ISOStatusLog"].Text += "`n[$ts] $msg"
|
||||
$sync["WPFWin11ISOStatusLog"].CaretIndex = $sync["WPFWin11ISOStatusLog"].Text.Length
|
||||
$sync["WPFWin11ISOStatusLog"].ScrollToEnd()
|
||||
})
|
||||
}
|
||||
|
||||
function SetProgress($label, $pct) {
|
||||
$sync["WPFWin11ISOStatusLog"].Dispatcher.Invoke([action]{
|
||||
$sync.progressBarTextBlock.Text = $label
|
||||
$sync.progressBarTextBlock.ToolTip = $label
|
||||
$sync.ProgressBar.Value = [Math]::Max($pct, 5)
|
||||
})
|
||||
}
|
||||
|
||||
function Get-FreeDriveLetter {
|
||||
$used = (Get-PSDrive -PSProvider FileSystem -ErrorAction SilentlyContinue).Name
|
||||
foreach ($c in [char[]](68..90)) {
|
||||
if ($used -notcontains [string]$c) { return $c }
|
||||
}
|
||||
return $null
|
||||
}
|
||||
|
||||
try {
|
||||
SetProgress "Formatting USB drive..." 10
|
||||
|
||||
# Phase 1: Clean disk via diskpart
|
||||
$dpFile1 = Join-Path $env:TEMP "winutil_diskpart_$(Get-Random).txt"
|
||||
"select disk $diskNum`nclean`nexit" | Set-Content -Path $dpFile1 -Encoding ASCII
|
||||
Log "Running diskpart clean on Disk $diskNum..."
|
||||
diskpart /s $dpFile1 2>&1 | Where-Object { $_ -match '\S' } | ForEach-Object { Log " diskpart: $_" }
|
||||
Remove-Item $dpFile1 -Force -ErrorAction SilentlyContinue
|
||||
|
||||
# Phase 2: Initialize as GPT
|
||||
Start-Sleep -Seconds 2
|
||||
Update-Disk -Number $diskNum -ErrorAction SilentlyContinue
|
||||
$diskObj = Get-Disk -Number $diskNum -ErrorAction Stop
|
||||
if ($diskObj.PartitionStyle -eq 'RAW') {
|
||||
Initialize-Disk -Number $diskNum -PartitionStyle GPT -ErrorAction Stop
|
||||
Log "Disk $diskNum initialized as GPT."
|
||||
} else {
|
||||
Set-Disk -Number $diskNum -PartitionStyle GPT -ErrorAction Stop
|
||||
Log "Disk $diskNum converted to GPT (was $($diskObj.PartitionStyle))."
|
||||
}
|
||||
|
||||
# Phase 3: Create FAT32 partition via diskpart
|
||||
$volLabel = "W11-" + (Get-Date).ToString('yyMMdd')
|
||||
$dpFile2 = Join-Path $env:TEMP "winutil_diskpart2_$(Get-Random).txt"
|
||||
$maxFat32PartitionMB = 32768
|
||||
$diskSizeMB = [int][Math]::Floor((Get-Disk -Number $diskNum -ErrorAction Stop).Size / 1MB)
|
||||
$createPartitionCommand = "create partition primary"
|
||||
if ($diskSizeMB -gt $maxFat32PartitionMB) {
|
||||
$createPartitionCommand = "create partition primary size=$maxFat32PartitionMB"
|
||||
Log "Disk $diskNum is $diskSizeMB MB; creating FAT32 partition capped at $maxFat32PartitionMB MB (32 GB)."
|
||||
}
|
||||
|
||||
@(
|
||||
"select disk $diskNum"
|
||||
$createPartitionCommand
|
||||
"format quick fs=fat32 label=`"$volLabel`""
|
||||
"exit"
|
||||
) | Set-Content -Path $dpFile2 -Encoding ASCII
|
||||
Log "Creating partitions on Disk $diskNum..."
|
||||
diskpart /s $dpFile2 2>&1 | Where-Object { $_ -match '\S' } | ForEach-Object { Log " diskpart: $_" }
|
||||
Remove-Item $dpFile2 -Force -ErrorAction SilentlyContinue
|
||||
|
||||
SetProgress "Assigning drive letters..." 30
|
||||
Start-Sleep -Seconds 3
|
||||
Update-Disk -Number $diskNum -ErrorAction SilentlyContinue
|
||||
|
||||
$partitions = Get-Partition -DiskNumber $diskNum -ErrorAction Stop
|
||||
Log "Partitions on Disk $diskNum after format: $($partitions.Count)"
|
||||
foreach ($p in $partitions) {
|
||||
Log " Partition $($p.PartitionNumber) Type=$($p.Type) Letter=$($p.DriveLetter) Size=$([math]::Round($p.Size/1MB))MB"
|
||||
}
|
||||
|
||||
$winpePart = $partitions | Where-Object { $_.Type -eq "Basic" } | Select-Object -Last 1
|
||||
if (-not $winpePart) {
|
||||
throw "Could not find the WINPE (Basic) partition on Disk $diskNum after format."
|
||||
}
|
||||
|
||||
try { Remove-PartitionAccessPath -DiskNumber $diskNum -PartitionNumber $winpePart.PartitionNumber -AccessPath "$($winpePart.DriveLetter):" -ErrorAction SilentlyContinue } catch {}
|
||||
$usbLetter = Get-FreeDriveLetter
|
||||
if (-not $usbLetter) { throw "No free drive letters (D-Z) available to assign to the USB data partition." }
|
||||
Set-Partition -DiskNumber $diskNum -PartitionNumber $winpePart.PartitionNumber -NewDriveLetter $usbLetter
|
||||
Log "Assigned drive letter $usbLetter to WINPE partition (Partition $($winpePart.PartitionNumber))."
|
||||
Start-Sleep -Seconds 2
|
||||
|
||||
$usbDrive = "${usbLetter}:"
|
||||
if (-not (Test-Path $usbDrive)) { throw "Drive $usbDrive is not accessible after letter assignment." }
|
||||
Log "USB data partition: $usbDrive"
|
||||
|
||||
$contentSizeBytes = (Get-ChildItem -LiteralPath $contentsDir -File -Recurse -Force -ErrorAction Stop | Measure-Object -Property Length -Sum).Sum
|
||||
if (-not $contentSizeBytes) { $contentSizeBytes = 0 }
|
||||
$usbVolume = Get-Volume -DriveLetter $usbLetter -ErrorAction Stop
|
||||
$partitionCapacityBytes = [int64]$usbVolume.Size
|
||||
$partitionFreeBytes = [int64]$usbVolume.SizeRemaining
|
||||
|
||||
$contentSizeGB = [math]::Round($contentSizeBytes / 1GB, 2)
|
||||
$partitionCapacityGB = [math]::Round($partitionCapacityBytes / 1GB, 2)
|
||||
$partitionFreeGB = [math]::Round($partitionFreeBytes / 1GB, 2)
|
||||
|
||||
Log "Source content size: $contentSizeGB GB. USB partition capacity: $partitionCapacityGB GB, free: $partitionFreeGB GB."
|
||||
|
||||
if ($contentSizeBytes -gt $partitionCapacityBytes) {
|
||||
throw "ISO content ($contentSizeGB GB) is larger than the USB partition capacity ($partitionCapacityGB GB). Use a larger USB drive or reduce image size."
|
||||
}
|
||||
|
||||
if ($contentSizeBytes -gt $partitionFreeBytes) {
|
||||
throw "Insufficient free space on USB partition. Required: $contentSizeGB GB, available: $partitionFreeGB GB."
|
||||
}
|
||||
|
||||
SetProgress "Copying Windows 11 files to USB..." 45
|
||||
|
||||
# Copy files; split install.wim if > 4 GB (FAT32 limit)
|
||||
$installWim = Join-Path $contentsDir "sources\install.wim"
|
||||
if (Test-Path $installWim) {
|
||||
$wimSizeMB = [math]::Round((Get-Item $installWim).Length / 1MB)
|
||||
if ($wimSizeMB -gt 3800) {
|
||||
Log "install.wim is $wimSizeMB MB - splitting for FAT32 compatibility... This will take several minutes."
|
||||
$splitDest = Join-Path $usbDrive "sources\install.swm"
|
||||
New-Item -ItemType Directory -Path (Split-Path $splitDest) -Force | Out-Null
|
||||
Split-WindowsImage -ImagePath $installWim -SplitImagePath $splitDest -FileSize 3800 -CheckIntegrity
|
||||
Log "install.wim split complete."
|
||||
Log "Copying remaining files to USB..."
|
||||
& robocopy $contentsDir $usbDrive /E /XF install.wim /NFL /NDL /NJH /NJS
|
||||
} else {
|
||||
& robocopy $contentsDir $usbDrive /E /NFL /NDL /NJH /NJS
|
||||
}
|
||||
} else {
|
||||
& robocopy $contentsDir $usbDrive /E /NFL /NDL /NJH /NJS
|
||||
}
|
||||
|
||||
SetProgress "Finalising USB drive..." 90
|
||||
Log "Files copied to USB."
|
||||
SetProgress "USB write complete" 100
|
||||
Log "USB drive is ready for use."
|
||||
|
||||
$sync["WPFWin11ISOStatusLog"].Dispatcher.Invoke([action]{
|
||||
[System.Windows.MessageBox]::Show(
|
||||
"USB drive created successfully!`n`nYou can now boot from this drive to install Windows 11.",
|
||||
"USB Ready", "OK", "Info")
|
||||
})
|
||||
} catch {
|
||||
Log "ERROR during USB write: $_"
|
||||
$sync["WPFWin11ISOStatusLog"].Dispatcher.Invoke([action]{
|
||||
[System.Windows.MessageBox]::Show("USB write failed:`n`n$_", "USB Write Error", "OK", "Error")
|
||||
})
|
||||
} finally {
|
||||
Start-Sleep -Milliseconds 800
|
||||
$sync["WPFWin11ISOStatusLog"].Dispatcher.Invoke([action]{
|
||||
$sync.progressBarTextBlock.Text = ""
|
||||
$sync.progressBarTextBlock.ToolTip = ""
|
||||
$sync.ProgressBar.Value = 0
|
||||
$sync["WPFWin11ISOWriteUSBButton"].IsEnabled = $true
|
||||
})
|
||||
}
|
||||
}) | Out-Null
|
||||
|
||||
$script.BeginInvoke() | Out-Null
|
||||
}
|
||||
@@ -8,14 +8,20 @@ function Invoke-WinutilThemeChange {
|
||||
modifying various UI elements such as colors, margins, corner radii, font families, etc.
|
||||
If the '-init' switch is used, it initializes the theme based on the system's current dark mode setting.
|
||||
|
||||
.PARAMETER init
|
||||
A switch parameter. If set to $true, the function initializes the theme based on the system’s current dark mode setting.
|
||||
|
||||
.EXAMPLE
|
||||
Invoke-WinutilThemeChange
|
||||
# Toggles the theme between 'Light' and 'Dark'.
|
||||
|
||||
|
||||
.EXAMPLE
|
||||
Invoke-WinutilThemeChange -init
|
||||
# Initializes the theme based on the system's dark mode and applies the shared theme.
|
||||
#>
|
||||
param (
|
||||
[string]$theme = "Auto"
|
||||
[switch]$init = $false,
|
||||
[string]$theme
|
||||
)
|
||||
|
||||
function Set-WinutilTheme {
|
||||
@@ -123,30 +129,48 @@ function Invoke-WinutilThemeChange {
|
||||
}
|
||||
}
|
||||
|
||||
$sync.preferences.theme = $theme
|
||||
Set-Preferences -save
|
||||
Set-WinutilTheme -currentTheme "shared"
|
||||
$LightPreferencePath = "$winutildir\LightTheme.ini"
|
||||
$DarkPreferencePath = "$winutildir\DarkTheme.ini"
|
||||
|
||||
switch ($sync.preferences.theme) {
|
||||
"Auto" {
|
||||
$systemUsesDarkMode = Get-WinUtilToggleStatus WPFToggleDarkMode
|
||||
if ($systemUsesDarkMode) {
|
||||
if ($init) {
|
||||
Set-WinutilTheme -currentTheme "shared"
|
||||
if (Test-Path $LightPreferencePath) {
|
||||
$theme = "Light"
|
||||
}
|
||||
elseif (Test-Path $DarkPreferencePath) {
|
||||
$theme = "Dark"
|
||||
}
|
||||
else {
|
||||
$theme = "Light"
|
||||
$theme = "Auto"
|
||||
}
|
||||
}
|
||||
|
||||
Set-WinutilTheme -currentTheme $theme
|
||||
switch ($theme) {
|
||||
"Auto" {
|
||||
$systemUsesDarkMode = Get-WinUtilToggleStatus WPFToggleDarkMode
|
||||
if ($systemUsesDarkMode) {
|
||||
Set-WinutilTheme -currentTheme "Dark"
|
||||
}
|
||||
else{
|
||||
Set-WinutilTheme -currentTheme "Light"
|
||||
}
|
||||
|
||||
|
||||
$themeButtonIcon = [char]0xF08C
|
||||
Remove-Item $LightPreferencePath -Force -ErrorAction SilentlyContinue
|
||||
Remove-Item $DarkPreferencePath -Force -ErrorAction SilentlyContinue
|
||||
}
|
||||
"Dark" {
|
||||
Set-WinutilTheme -currentTheme $sync.preferences.theme
|
||||
Set-WinutilTheme -currentTheme $theme
|
||||
$themeButtonIcon = [char]0xE708
|
||||
$null = New-Item $DarkPreferencePath -Force
|
||||
Remove-Item $LightPreferencePath -Force -ErrorAction SilentlyContinue
|
||||
}
|
||||
"Light" {
|
||||
Set-WinutilTheme -currentTheme $sync.preferences.theme
|
||||
Set-WinutilTheme -currentTheme $theme
|
||||
$themeButtonIcon = [char]0xE706
|
||||
$null = New-Item $LightPreferencePath -Force
|
||||
Remove-Item $DarkPreferencePath -Force -ErrorAction SilentlyContinue
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
43
functions/private/Set-PackageManagerPreference.ps1
Normal file
43
functions/private/Set-PackageManagerPreference.ps1
Normal file
@@ -0,0 +1,43 @@
|
||||
function Set-PackageManagerPreference {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the currently selected package manager to global "ManagerPreference" in sync.
|
||||
Also persists preference across Winutil restarts via preference.ini.
|
||||
|
||||
Reads from preference.ini if no argument sent.
|
||||
|
||||
.PARAMETER preferredPackageManager
|
||||
The PackageManager that was selected.
|
||||
#>
|
||||
param(
|
||||
[Parameter(Position=0, Mandatory=$false)]
|
||||
[PackageManagers]$preferredPackageManager
|
||||
)
|
||||
|
||||
$preferencePath = "$winutildir\preferences.ini"
|
||||
$oldChocoPath = "$winutildir\preferChocolatey.ini"
|
||||
|
||||
#Try loading from file if no argument given.
|
||||
if ($null -eq $preferredPackageManager) {
|
||||
# Backwards compat for preferChocolatey.ini
|
||||
if (Test-Path -Path $oldChocoPath) {
|
||||
$preferredPackageManager = [PackageManagers]::Choco
|
||||
Remove-Item -Path $oldChocoPath
|
||||
}
|
||||
elseif (Test-Path -Path $preferencePath) {
|
||||
$potential = Get-Content -Path $preferencePath -TotalCount 1
|
||||
$preferredPackageManager = [PackageManagers]$potential
|
||||
}
|
||||
else {
|
||||
Write-Debug "Creating new preference file, defaulting to winget."
|
||||
$preferredPackageManager = [PackageManagers]::Winget
|
||||
}
|
||||
}
|
||||
|
||||
$sync["ManagerPreference"] = [PackageManagers]::$preferredPackageManager
|
||||
Write-Debug "Manager Preference changed to '$($sync["ManagerPreference"])'"
|
||||
|
||||
|
||||
# Write preference to file to persist across restarts.
|
||||
Out-File -FilePath $preferencePath -InputObject $sync["ManagerPreference"]
|
||||
}
|
||||
@@ -1,83 +0,0 @@
|
||||
function Set-Preferences{
|
||||
|
||||
param(
|
||||
[switch]$save=$false
|
||||
)
|
||||
|
||||
# TODO delete this function sometime later
|
||||
function Clean-OldPrefs{
|
||||
if (Test-Path -Path "$winutildir\LightTheme.ini") {
|
||||
$sync.preferences.theme = "Light"
|
||||
Remove-Item -Path "$winutildir\LightTheme.ini"
|
||||
}
|
||||
|
||||
if (Test-Path -Path "$winutildir\DarkTheme.ini") {
|
||||
$sync.preferences.theme = "Dark"
|
||||
Remove-Item -Path "$winutildir\DarkTheme.ini"
|
||||
}
|
||||
|
||||
# check old prefs, if its first line has no =, then absorb it as pm
|
||||
if (Test-Path -Path $iniPath) {
|
||||
$oldPM = Get-Content $iniPath
|
||||
if ($oldPM -notlike "*=*") {
|
||||
$sync.preferences.packagemanager = $oldPM
|
||||
}
|
||||
}
|
||||
|
||||
if (Test-Path -Path "$winutildir\preferChocolatey.ini") {
|
||||
$sync.preferences.packagemanager = "Choco"
|
||||
Remove-Item -Path "$winutildir\preferChocolatey.ini"
|
||||
}
|
||||
}
|
||||
|
||||
function Save-Preferences{
|
||||
$ini = ""
|
||||
foreach($key in $sync.preferences.Keys) {
|
||||
$pref = "$($key)=$($sync.preferences.$key)"
|
||||
Write-Debug "Saving pref: $($pref)"
|
||||
$ini = $ini + $pref + "`r`n"
|
||||
}
|
||||
$ini | Out-File $iniPath
|
||||
}
|
||||
|
||||
function Load-Preferences{
|
||||
Clean-OldPrefs
|
||||
if (Test-Path -Path $iniPath) {
|
||||
$iniData = Get-Content "$winutildir\preferences.ini"
|
||||
foreach ($line in $iniData) {
|
||||
if ($line -like "*=*") {
|
||||
$arr = $line -split "=",-2
|
||||
$key = $arr[0] -replace "\s",""
|
||||
$value = $arr[1] -replace "\s",""
|
||||
Write-Debug "Preference: Key = '$($key)' Value ='$($value)'"
|
||||
$sync.preferences.$key = $value
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# write defaults in case preferences dont exist
|
||||
if ($null -eq $sync.preferences.theme) {
|
||||
$sync.preferences.theme = "Auto"
|
||||
}
|
||||
if ($null -eq $sync.preferences.packagemanager) {
|
||||
$sync.preferences.packagemanager = "Winget"
|
||||
}
|
||||
|
||||
# convert packagemanager to enum
|
||||
if ($sync.preferences.packagemanager -eq "Choco") {
|
||||
$sync.preferences.packagemanager = [PackageManagers]::Choco
|
||||
}
|
||||
elseif ($sync.preferences.packagemanager -eq "Winget") {
|
||||
$sync.preferences.packagemanager = [PackageManagers]::Winget
|
||||
}
|
||||
}
|
||||
|
||||
$iniPath = "$winutildir\preferences.ini"
|
||||
|
||||
if ($save) {
|
||||
Save-Preferences
|
||||
}
|
||||
else {
|
||||
Load-Preferences
|
||||
}
|
||||
}
|
||||
@@ -14,9 +14,7 @@ function Update-WinUtilSelections {
|
||||
|
||||
Write-Debug "JSON to import: $($flatJson)"
|
||||
|
||||
foreach ($item in $flatJson) {
|
||||
# Ensure each item is treated as a string to handle PSCustomObject from JSON deserialization
|
||||
$cbkey = [string]$item
|
||||
foreach ($cbkey in $flatJson) {
|
||||
$group = if ($cbkey.StartsWith("WPFInstall")) { "Install" }
|
||||
elseif ($cbkey.StartsWith("WPFTweaks")) { "Tweaks" }
|
||||
elseif ($cbkey.StartsWith("WPFToggle")) { "Toggle" }
|
||||
@@ -28,7 +26,7 @@ function Update-WinUtilSelections {
|
||||
if (!$sync.selectedApps.Contains($cbkey)) {
|
||||
$sync.selectedApps.Add($cbkey)
|
||||
# The List type needs to be specified again, because otherwise Sort-Object will convert the list to a string if there is only a single entry
|
||||
[System.Collections.Generic.List[string]]$sync.selectedApps = $sync.SelectedApps | Sort-Object
|
||||
[System.Collections.Generic.List[pscustomobject]]$sync.selectedApps = $sync.SelectedApps | Sort-Object
|
||||
}
|
||||
}
|
||||
"Tweaks" {
|
||||
|
||||
@@ -18,7 +18,7 @@ function Invoke-WPFGetInstalled {
|
||||
if (($sync.ChocoRadioButton.IsChecked -eq $false) -and ((Test-WinUtilPackageManager -winget) -eq "not-installed") -and $checkbox -eq "winget") {
|
||||
return
|
||||
}
|
||||
$managerPreference = $sync.preferences.packagemanager
|
||||
$managerPreference = $sync["ManagerPreference"]
|
||||
|
||||
Invoke-WPFRunspace -ParameterList @(("managerPreference", $managerPreference),("checkbox", $checkbox)) -ScriptBlock {
|
||||
param (
|
||||
|
||||
@@ -44,13 +44,7 @@ function Invoke-WPFImpex {
|
||||
try {
|
||||
$Config = ConfigDialog
|
||||
if ($Config) {
|
||||
$allConfs = ($sync.selectedApps + $sync.selectedTweaks + $sync.selectedToggles + $sync.selectedFeatures) | ForEach-Object { [string]$_ }
|
||||
if (-not $allConfs) {
|
||||
[System.Windows.MessageBox]::Show(
|
||||
"No settings are selected to export. Please select at least one app, tweak, toggle, or feature before exporting.",
|
||||
"Nothing to Export", "OK", "Warning")
|
||||
return
|
||||
}
|
||||
$allConfs = $sync.selectedApps + $sync.selectedTweaks + $sync.selectedToggles + $sync.selectedFeatures
|
||||
$jsonFile = $allConfs | ConvertTo-Json
|
||||
$jsonFile | Out-File $Config -Force
|
||||
"iex ""& { `$(irm https://christitus.com/win) } -Config '$Config'""" | Set-Clipboard
|
||||
@@ -76,21 +70,6 @@ function Invoke-WPFImpex {
|
||||
# TODO how to handle old style? detected json type then flatten it in a func?
|
||||
# $flattenedJson = $jsonFile.PSObject.Properties.Where({ $_.Name -ne "Install" }).ForEach({ $_.Value })
|
||||
$flattenedJson = $jsonFile
|
||||
|
||||
if (-not $flattenedJson) {
|
||||
[System.Windows.MessageBox]::Show(
|
||||
"The selected file contains no settings to import. No changes have been made.",
|
||||
"Empty Configuration", "OK", "Warning")
|
||||
return
|
||||
}
|
||||
|
||||
# Clear all existing selections before importing so the import replaces
|
||||
# the current state rather than merging with it
|
||||
$sync.selectedApps = [System.Collections.Generic.List[string]]::new()
|
||||
$sync.selectedTweaks = [System.Collections.Generic.List[string]]::new()
|
||||
$sync.selectedToggles = [System.Collections.Generic.List[string]]::new()
|
||||
$sync.selectedFeatures = [System.Collections.Generic.List[string]]::new()
|
||||
|
||||
Update-WinUtilSelections -flatJson $flattenedJson
|
||||
|
||||
if (!$PARAM_NOUI) {
|
||||
|
||||
@@ -19,7 +19,7 @@ function Invoke-WPFInstall {
|
||||
return
|
||||
}
|
||||
|
||||
$ManagerPreference = $sync.preferences.packagemanager
|
||||
$ManagerPreference = $sync["ManagerPreference"]
|
||||
|
||||
$handle = Invoke-WPFRunspace -ParameterList @(("PackagesToInstall", $PackagesToInstall),("ManagerPreference", $ManagerPreference)) -ScriptBlock {
|
||||
param($PackagesToInstall, $ManagerPreference)
|
||||
|
||||
@@ -32,8 +32,8 @@ function Invoke-WPFPresets {
|
||||
$CheckBoxesToCheck = $sync.configs.preset.$preset
|
||||
}
|
||||
|
||||
# clear out the filtered pattern so applying a preset replaces the current
|
||||
# state rather than merging with it
|
||||
# clear out the filtered pattern
|
||||
if (!$preset) {
|
||||
switch ($checkboxfilterpattern) {
|
||||
"WPFTweak*" { $sync.selectedTweaks = [System.Collections.Generic.List[string]]::new() }
|
||||
"WPFInstall*" { $sync.selectedApps = [System.Collections.Generic.List[string]]::new() }
|
||||
@@ -41,8 +41,8 @@ function Invoke-WPFPresets {
|
||||
"WPFToggle" { $sync.selectedToggles = [System.Collections.Generic.List[string]]::new() }
|
||||
default {}
|
||||
}
|
||||
|
||||
if ($preset) {
|
||||
}
|
||||
else {
|
||||
Update-WinUtilSelections -flatJson $CheckBoxesToCheck
|
||||
}
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ function Invoke-WPFSelectedCheckboxesUpdate{
|
||||
if (!$sync.selectedApps.Contains($appKey)) {
|
||||
$sync.selectedApps.Add($appKey)
|
||||
# The List type needs to be specified again, because otherwise Sort-Object will convert the list to a string if there is only a single entry
|
||||
[System.Collections.Generic.List[string]]$sync.selectedApps = $sync.SelectedApps | Sort-Object
|
||||
[System.Collections.Generic.List[pscustomobject]]$sync.selectedApps = $sync.SelectedApps | Sort-Object
|
||||
}
|
||||
}
|
||||
else{
|
||||
|
||||
@@ -30,7 +30,7 @@ function Invoke-WPFUnInstall {
|
||||
|
||||
if($confirm -eq "No") {return}
|
||||
|
||||
$ManagerPreference = $sync.preferences.packagemanager
|
||||
$ManagerPreference = $sync["ManagerPreference"]
|
||||
|
||||
Invoke-WPFRunspace -ParameterList @(("PackagesToUninstall", $PackagesToUninstall),("ManagerPreference", $ManagerPreference)) -ScriptBlock {
|
||||
param($PackagesToUninstall, $ManagerPreference)
|
||||
|
||||
@@ -66,7 +66,7 @@ $sync.configs.applications.PSObject.Properties | ForEach-Object {
|
||||
$sync.configs.applicationsHashtable[$_.Name] = $_.Value
|
||||
}
|
||||
|
||||
Set-Preferences
|
||||
Set-PackageManagerPreference
|
||||
|
||||
if ($PARAM_NOUI) {
|
||||
Show-CTTLogo
|
||||
@@ -154,7 +154,7 @@ $sync.Form.Add_Loaded({
|
||||
})
|
||||
})
|
||||
|
||||
Invoke-WinutilThemeChange -theme $sync.preferences.theme
|
||||
Invoke-WinutilThemeChange -init $true
|
||||
|
||||
|
||||
# Now call the function with the final merged config
|
||||
@@ -177,16 +177,10 @@ Invoke-WPFUIElements -configVariable $sync.configs.feature -targetGridName "feat
|
||||
$xaml.SelectNodes("//*[@Name]") | ForEach-Object {$sync["$("$($psitem.Name)")"] = $sync["Form"].FindName($psitem.Name)}
|
||||
|
||||
#Persist Package Manager preference across winutil restarts
|
||||
$sync.ChocoRadioButton.Add_Checked({
|
||||
$sync.preferences.packagemanager = [PackageManagers]::Choco
|
||||
Set-Preferences -save
|
||||
})
|
||||
$sync.WingetRadioButton.Add_Checked({
|
||||
$sync.preferences.packagemanager = [PackageManagers]::Winget
|
||||
Set-Preferences -save
|
||||
})
|
||||
$sync.ChocoRadioButton.Add_Checked({Set-PackageManagerPreference Choco})
|
||||
$sync.WingetRadioButton.Add_Checked({Set-PackageManagerPreference Winget})
|
||||
|
||||
switch ($sync.preferences.packagemanager) {
|
||||
switch ($sync["ManagerPreference"]) {
|
||||
"Choco" {$sync.ChocoRadioButton.IsChecked = $true; break}
|
||||
"Winget" {$sync.WingetRadioButton.IsChecked = $true; break}
|
||||
}
|
||||
@@ -540,10 +534,6 @@ $sync["FontScalingApplyButton"].Add_Click({
|
||||
|
||||
# ── Win11ISO Tab button handlers ──────────────────────────────────────────────
|
||||
|
||||
$sync["WPFTab5BT"].Add_Click({
|
||||
$sync["Form"].Dispatcher.BeginInvoke([System.Windows.Threading.DispatcherPriority]::Background, [action]{ Invoke-WinUtilISOCheckExistingWork }) | Out-Null
|
||||
})
|
||||
|
||||
$sync["WPFWin11ISOBrowseButton"].Add_Click({
|
||||
Write-Debug "WPFWin11ISOBrowseButton clicked"
|
||||
Invoke-WinUtilISOBrowse
|
||||
@@ -564,18 +554,11 @@ $sync["WPFWin11ISOModifyButton"].Add_Click({
|
||||
Invoke-WinUtilISOModify
|
||||
})
|
||||
|
||||
$sync["WPFWin11ISOChooseISOButton"].Add_Click({
|
||||
Write-Debug "WPFWin11ISOChooseISOButton clicked"
|
||||
$sync["WPFWin11ISOOptionUSB"].Visibility = "Collapsed"
|
||||
$sync["WPFWin11ISOExportButton"].Add_Click({
|
||||
Write-Debug "WPFWin11ISOExportButton clicked"
|
||||
Invoke-WinUtilISOExport
|
||||
})
|
||||
|
||||
$sync["WPFWin11ISOChooseUSBButton"].Add_Click({
|
||||
Write-Debug "WPFWin11ISOChooseUSBButton clicked"
|
||||
$sync["WPFWin11ISOOptionUSB"].Visibility = "Visible"
|
||||
Invoke-WinUtilISORefreshUSBDrives
|
||||
})
|
||||
|
||||
$sync["WPFWin11ISORefreshUSBButton"].Add_Click({
|
||||
Write-Debug "WPFWin11ISORefreshUSBButton clicked"
|
||||
Invoke-WinUtilISORefreshUSBDrives
|
||||
@@ -586,11 +569,6 @@ $sync["WPFWin11ISOWriteUSBButton"].Add_Click({
|
||||
Invoke-WinUtilISOWriteUSB
|
||||
})
|
||||
|
||||
$sync["WPFWin11ISOCleanResetButton"].Add_Click({
|
||||
Write-Debug "WPFWin11ISOCleanResetButton clicked"
|
||||
Invoke-WinUtilISOCleanAndReset
|
||||
})
|
||||
|
||||
# ──────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
$sync["Form"].ShowDialog() | out-null
|
||||
|
||||
@@ -37,7 +37,6 @@ $sync.PSScriptRoot = $PSScriptRoot
|
||||
$sync.version = "#{replaceme}"
|
||||
$sync.configs = @{}
|
||||
$sync.Buttons = [System.Collections.Generic.List[PSObject]]::new()
|
||||
$sync.preferences = @{}
|
||||
$sync.ProcessRunning = $false
|
||||
$sync.selectedApps = [System.Collections.Generic.List[string]]::new()
|
||||
$sync.selectedTweaks = [System.Collections.Generic.List[string]]::new()
|
||||
|
||||
@@ -1,516 +1,239 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<unattend xmlns="urn:schemas-microsoft-com:unattend" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State">
|
||||
<!--https://schneegans.de/windows/unattend-generator/?LanguageMode=Interactive&ProcessorArchitecture=amd64&BypassRequirementsCheck=true&ComputerNameMode=Random&CompactOsMode=Default&TimeZoneMode=Implicit&PartitionMode=Interactive&DiskAssertionMode=Skip&WindowsEditionMode=Interactive&InstallFromMode=Automatic&PEMode=Default&UserAccountMode=InteractiveLocal&PasswordExpirationMode=Unlimited&LockoutMode=Default&HideFiles=Hidden&ClassicContextMenu=true&LaunchToThisPC=true&ShowEndTask=true&TaskbarSearch=Hide&TaskbarIconsMode=Empty&DisableWidgets=true&LeftTaskbar=true&HideTaskViewButton=true&StartTilesMode=Default&StartPinsMode=Empty&EnableLongPaths=true&HideEdgeFre=true&DisableEdgeStartupBoost=true&DeleteWindowsOld=true&EffectsMode=Default&DeleteEdgeDesktopIcon=true&DesktopIconsMode=Default&StartFoldersMode=Default&WifiMode=Skip&ExpressSettings=DisableAll&LockKeysMode=Configure&CapsLockInitial=Off&CapsLockBehavior=Toggle&NumLockInitial=On&NumLockBehavior=Toggle&ScrollLockInitial=Off&ScrollLockBehavior=Toggle&StickyKeysMode=Disabled&ColorMode=Custom&SystemColorTheme=Dark&AppsColorTheme=Dark&AccentColor=%230078d4&WallpaperMode=Default&LockScreenMode=Default&WdacMode=Skip&AppLockerMode=Skip-->
|
||||
<settings pass="offlineServicing"></settings>
|
||||
<!--
|
||||
Windows 11 Unattended Installation Answer File
|
||||
================================================
|
||||
UNIVERSAL — no modification required before use.
|
||||
|
||||
What this file does automatically:
|
||||
• Installs "Windows 11 Pro" from any standard Microsoft ISO
|
||||
• Bypasses the Microsoft-account OOBE requirement (local account)
|
||||
• Skips the EULA, wireless, and privacy nag screens
|
||||
• Leaves timezone, language, region, and user account to the user
|
||||
at the two short OOBE screens that remain
|
||||
|
||||
What the user is prompted for during first-run (OOBE):
|
||||
1. Region / Language / Keyboard (one screen)
|
||||
2. Who will use this PC? (local account name + password)
|
||||
|
||||
Timezone is set to UTC and can be adjusted after login.
|
||||
Computer name is auto-generated; rename at any time.
|
||||
|
||||
Tested against: Windows 11 Home / Pro / Home Single Language (amd64)
|
||||
Pass order: windowsPE → specialize → oobeSystem
|
||||
-->
|
||||
<unattend xmlns="urn:schemas-microsoft-com:unattend">
|
||||
|
||||
<!-- ═══════════════════════════════════════════════════════════════════
|
||||
PASS 1 — windowsPE
|
||||
Runs inside the installer environment before the OS is laid down.
|
||||
Handles disk layout and image selection only.
|
||||
Locale is intentionally omitted so the installer inherits the
|
||||
language of whichever ISO is being used.
|
||||
═══════════════════════════════════════════════════════════════════════ -->
|
||||
<settings pass="windowsPE">
|
||||
<component name="Microsoft-Windows-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
<!-- Setup / image selection -->
|
||||
<component name="Microsoft-Windows-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">
|
||||
|
||||
<!-- Disable dynamic updates during setup (keeps installation offline/fast) -->
|
||||
<DynamicUpdate>
|
||||
<Enable>false</Enable>
|
||||
</DynamicUpdate>
|
||||
|
||||
<ImageInstall>
|
||||
<OSImage>
|
||||
<!-- CompactOS saves ~1.5 GB but is slower on spinning drives -->
|
||||
<Compact>false</Compact>
|
||||
<WillShowUI>OnError</WillShowUI>
|
||||
<InstallFrom>
|
||||
<!--
|
||||
Select the edition by NAME rather than by index number.
|
||||
Index numbers vary between ISO builds; the name is stable.
|
||||
Change "Windows 11 Pro" to "Windows 11 Home" etc. if your
|
||||
ISO only contains that edition. To choose interactively,
|
||||
delete this entire <InstallFrom> block.
|
||||
-->
|
||||
<MetaData wcm:action="add">
|
||||
<Key>/IMAGE/NAME</Key>
|
||||
<Value>Windows 11 Pro</Value>
|
||||
</MetaData>
|
||||
</InstallFrom>
|
||||
<!-- InstallTo is omitted — the Windows installer will prompt
|
||||
the user to select the destination disk and partition. -->
|
||||
</OSImage>
|
||||
</ImageInstall>
|
||||
|
||||
<UserData>
|
||||
<ProductKey>
|
||||
<Key>00000-00000-00000-00000-00000</Key>
|
||||
<WillShowUI>Always</WillShowUI>
|
||||
</ProductKey>
|
||||
<AcceptEula>true</AcceptEula>
|
||||
<ProductKey>
|
||||
<!--
|
||||
Leave <Key> absent to use an existing digital licence or
|
||||
to be prompted for one after setup.
|
||||
|
||||
Generic setup keys (allow setup to proceed; do NOT activate):
|
||||
Home : YTMG3-N6DKC-DKB77-7M9GH-8HVX7
|
||||
Home Single Language : 7HNRX-D7KGG-3K4RQ-4WPJ4-YTDFH
|
||||
Pro : VK7JG-NPHTM-C97JM-9MPGT-3V66T
|
||||
Education : YNMGQ-8RYV3-4PGQ3-C8XTP-7CFBY
|
||||
Enterprise : XGVPP-NMH47-7TTHJ-W3FW7-8HV2C
|
||||
-->
|
||||
<WillShowUI>OnError</WillShowUI>
|
||||
</ProductKey>
|
||||
</UserData>
|
||||
<UseConfigurationSet>false</UseConfigurationSet>
|
||||
<RunSynchronous>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>1</Order>
|
||||
<Path>reg.exe add "HKLM\SYSTEM\Setup\LabConfig" /v BypassTPMCheck /t REG_DWORD /d 1 /f</Path>
|
||||
</RunSynchronousCommand>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>2</Order>
|
||||
<Path>reg.exe add "HKLM\SYSTEM\Setup\LabConfig" /v BypassSecureBootCheck /t REG_DWORD /d 1 /f</Path>
|
||||
</RunSynchronousCommand>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>3</Order>
|
||||
<Path>reg.exe add "HKLM\SYSTEM\Setup\LabConfig" /v BypassRAMCheck /t REG_DWORD /d 1 /f</Path>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
|
||||
</component>
|
||||
</settings>
|
||||
<settings pass="generalize"></settings>
|
||||
|
||||
<!-- ═══════════════════════════════════════════════════════════════════
|
||||
PASS 2 — specialize
|
||||
First boot into the installed OS.
|
||||
Machine-level settings that do not vary by user or region.
|
||||
═══════════════════════════════════════════════════════════════════════ -->
|
||||
<settings pass="specialize">
|
||||
<component name="Microsoft-Windows-Deployment" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
<RunSynchronous>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>1</Order>
|
||||
<Path>powershell.exe -WindowStyle "Normal" -NoProfile -Command "$xml = [xml]::new(); $xml.Load('C:\Windows\Panther\unattend.xml'); $sb = [scriptblock]::Create( $xml.unattend.Extensions.ExtractScript ); Invoke-Command -ScriptBlock $sb -ArgumentList $xml;"</Path>
|
||||
</RunSynchronousCommand>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>2</Order>
|
||||
<Path>powershell.exe -WindowStyle "Normal" -ExecutionPolicy "Unrestricted" -NoProfile -File "C:\Windows\Setup\Scripts\Specialize.ps1"</Path>
|
||||
</RunSynchronousCommand>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>3</Order>
|
||||
<Path>reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"</Path>
|
||||
</RunSynchronousCommand>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>4</Order>
|
||||
<Path>powershell.exe -WindowStyle "Normal" -ExecutionPolicy "Unrestricted" -NoProfile -File "C:\Windows\Setup\Scripts\DefaultUser.ps1"</Path>
|
||||
</RunSynchronousCommand>
|
||||
<RunSynchronousCommand wcm:action="add">
|
||||
<Order>5</Order>
|
||||
<Path>reg.exe unload "HKU\DefaultUser"</Path>
|
||||
</RunSynchronousCommand>
|
||||
</RunSynchronous>
|
||||
|
||||
<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">
|
||||
|
||||
<!-- Auto-generate a unique computer name. Rename anytime:
|
||||
Settings › System › About › Rename this PC -->
|
||||
<ComputerName>*</ComputerName>
|
||||
|
||||
<!--
|
||||
UTC is the only timezone that is correct everywhere on Earth
|
||||
without knowing where the machine will be used.
|
||||
Windows will auto-adjust to local time once the user sets their
|
||||
region, or they can change it in Settings › Time & Language.
|
||||
-->
|
||||
<TimeZone>UTC</TimeZone>
|
||||
|
||||
<!-- Suppress the Teams/Chat auto-install prompt during setup -->
|
||||
<ConfigureChatAutoInstall>false</ConfigureChatAutoInstall>
|
||||
|
||||
</component>
|
||||
|
||||
<!-- Reduce telemetry to the minimum permitted by the licence.
|
||||
0 = Security (Enterprise/Education only; treated as 1 on other SKUs)
|
||||
1 = Basic / Required diagnostic data ← effective minimum for Home/Pro -->
|
||||
<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>
|
||||
|
||||
</settings>
|
||||
<settings pass="auditSystem"></settings>
|
||||
<settings pass="auditUser"></settings>
|
||||
|
||||
<!-- ═══════════════════════════════════════════════════════════════════
|
||||
PASS 3 — oobeSystem
|
||||
Out-of-Box Experience (first-run wizard).
|
||||
|
||||
Screens shown to the user (everything else is suppressed):
|
||||
① Region / Language / Keyboard layout — user picks their locale
|
||||
② Create a local account — user picks name + password
|
||||
|
||||
Screens suppressed automatically:
|
||||
• EULA
|
||||
• "Sign in with Microsoft" / online account
|
||||
• Wi-Fi selection (can be done after login)
|
||||
• "Let Microsoft and apps use your location", Cortana, etc.
|
||||
|
||||
Locale settings are intentionally omitted here so that Windows
|
||||
applies whatever the user selects on screen ①.
|
||||
═══════════════════════════════════════════════════════════════════════ -->
|
||||
<settings pass="oobeSystem">
|
||||
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
|
||||
|
||||
<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">
|
||||
|
||||
<OOBE>
|
||||
<ProtectYourPC>3</ProtectYourPC>
|
||||
<!-- Suppress the licence agreement — already accepted in windowsPE -->
|
||||
<HideEULAPage>true</HideEULAPage>
|
||||
<HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
|
||||
|
||||
<!-- KEEP false — this is the screen where the user creates -->
|
||||
<!-- their local account (name + password). Setting it true -->
|
||||
<!-- would skip account creation entirely, leaving only the -->
|
||||
<!-- built-in Administrator account. -->
|
||||
<HideLocalAccountScreen>false</HideLocalAccountScreen>
|
||||
|
||||
<!-- Suppress "Sign in with Microsoft" screens.
|
||||
The user goes straight to local account creation. -->
|
||||
<HideOnlineAccountScreens>true</HideOnlineAccountScreens>
|
||||
|
||||
<!-- Skip Wi-Fi setup — can be connected after first login -->
|
||||
<HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
|
||||
|
||||
<!-- Suppress the privacy / recommended-settings nag screen -->
|
||||
<ProtectYourPC>3</ProtectYourPC>
|
||||
</OOBE>
|
||||
|
||||
<!--
|
||||
UserAccounts and AutoLogon are intentionally absent.
|
||||
The user creates their own account on the OOBE screen above.
|
||||
This is the safest and most universally applicable approach:
|
||||
no hardcoded credentials ship inside the answer file.
|
||||
|
||||
If you want to pre-create an account instead, add:
|
||||
|
||||
<UserAccounts>
|
||||
<LocalAccounts>
|
||||
<LocalAccount wcm:action="add">
|
||||
<Name>YourUsername</Name>
|
||||
<Password>
|
||||
<Value>YourPassword</Value>
|
||||
<PlainText>true</PlainText>
|
||||
</Password>
|
||||
<DisplayName>Your Full Name</DisplayName>
|
||||
<Group>Administrators</Group>
|
||||
</LocalAccount>
|
||||
</LocalAccounts>
|
||||
</UserAccounts>
|
||||
<AutoLogon>
|
||||
<Enabled>true</Enabled>
|
||||
<LogonCount>1</LogonCount>
|
||||
<Username>YourUsername</Username>
|
||||
<Password>
|
||||
<Value>YourPassword</Value>
|
||||
<PlainText>true</PlainText>
|
||||
</Password>
|
||||
</AutoLogon>
|
||||
|
||||
And set HideLocalAccountScreen to true above.
|
||||
-->
|
||||
|
||||
<!--
|
||||
Optional: run a script on first logon.
|
||||
Uncomment and adjust the path/command as needed.
|
||||
|
||||
<FirstLogonCommands>
|
||||
<SynchronousCommand wcm:action="add">
|
||||
<Order>1</Order>
|
||||
<CommandLine>powershell.exe -WindowStyle "Normal" -ExecutionPolicy "Unrestricted" -NoProfile -File "C:\Windows\Setup\Scripts\FirstLogon.ps1"</CommandLine>
|
||||
<CommandLine>powershell -NoProfile -ExecutionPolicy Bypass -Command "irm https://christitus.com/win | iex"</CommandLine>
|
||||
<Description>Launch WinUtil post-install</Description>
|
||||
<RequiresUserInput>false</RequiresUserInput>
|
||||
</SynchronousCommand>
|
||||
</FirstLogonCommands>
|
||||
-->
|
||||
|
||||
</component>
|
||||
</settings>
|
||||
<Extensions xmlns="https://schneegans.de/windows/unattend-generator/">
|
||||
<ExtractScript>
|
||||
param(
|
||||
[xml]$Document
|
||||
);
|
||||
|
||||
foreach( $file in $Document.unattend.Extensions.File ) {
|
||||
$path = [System.Environment]::ExpandEnvironmentVariables( $file.GetAttribute( 'path' ) );
|
||||
mkdir -Path( $path | Split-Path -Parent ) -ErrorAction 'SilentlyContinue';
|
||||
$encoding = switch( [System.IO.Path]::GetExtension( $path ) ) {
|
||||
{ $_ -in '.ps1', '.xml' } { [System.Text.Encoding]::UTF8; }
|
||||
{ $_ -in '.reg', '.vbs', '.js' } { [System.Text.UnicodeEncoding]::new( $false, $true ); }
|
||||
default { [System.Text.Encoding]::Default; }
|
||||
};
|
||||
$bytes = $encoding.GetPreamble() + $encoding.GetBytes( $file.InnerText.Trim() );
|
||||
[System.IO.File]::WriteAllBytes( $path, $bytes );
|
||||
}
|
||||
</ExtractScript>
|
||||
<File path="C:\Windows\Setup\Scripts\TaskbarLayoutModification.xml">
|
||||
<LayoutModificationTemplate xmlns="http://schemas.microsoft.com/Start/2014/LayoutModification" xmlns:defaultlayout="http://schemas.microsoft.com/Start/2014/FullDefaultLayout" xmlns:start="http://schemas.microsoft.com/Start/2014/StartLayout" xmlns:taskbar="http://schemas.microsoft.com/Start/2014/TaskbarLayout" Version="1">
|
||||
<CustomTaskbarLayoutCollection PinListPlacement="Replace">
|
||||
<defaultlayout:TaskbarLayout>
|
||||
<taskbar:TaskbarPinList>
|
||||
<taskbar:DesktopApp DesktopApplicationLinkPath="#leaveempty" />
|
||||
</taskbar:TaskbarPinList>
|
||||
</defaultlayout:TaskbarLayout>
|
||||
</CustomTaskbarLayoutCollection>
|
||||
</LayoutModificationTemplate>
|
||||
</File>
|
||||
<File path="C:\Windows\Setup\Scripts\UnlockStartLayout.vbs">
|
||||
HKU = &H80000003
|
||||
Set reg = GetObject("winmgmts://./root/default:StdRegProv")
|
||||
Set fso = CreateObject("Scripting.FileSystemObject")
|
||||
|
||||
If reg.EnumKey(HKU, "", sids) = 0 Then
|
||||
If Not IsNull(sids) Then
|
||||
For Each sid In sids
|
||||
key = sid + "\Software\Policies\Microsoft\Windows\Explorer"
|
||||
name = "LockedStartLayout"
|
||||
If reg.GetDWORDValue(HKU, key, name, existing) = 0 Then
|
||||
reg.SetDWORDValue HKU, key, name, 0
|
||||
End If
|
||||
Next
|
||||
End If
|
||||
End If
|
||||
</File>
|
||||
<File path="C:\Windows\Setup\Scripts\UnlockStartLayout.xml">
|
||||
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
|
||||
<Triggers>
|
||||
<EventTrigger>
|
||||
<Enabled>true</Enabled>
|
||||
<Subscription>&lt;QueryList&gt;&lt;Query Id="0" Path="Application"&gt;&lt;Select Path="Application"&gt;*[System[Provider[@Name='UnattendGenerator'] and EventID=1]]&lt;/Select&gt;&lt;/Query&gt;&lt;/QueryList&gt;</Subscription>
|
||||
</EventTrigger>
|
||||
</Triggers>
|
||||
<Principals>
|
||||
<Principal id="Author">
|
||||
<UserId>S-1-5-18</UserId>
|
||||
<RunLevel>LeastPrivilege</RunLevel>
|
||||
</Principal>
|
||||
</Principals>
|
||||
<Settings>
|
||||
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
|
||||
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
|
||||
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
|
||||
<AllowHardTerminate>true</AllowHardTerminate>
|
||||
<StartWhenAvailable>false</StartWhenAvailable>
|
||||
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
|
||||
<IdleSettings>
|
||||
<StopOnIdleEnd>true</StopOnIdleEnd>
|
||||
<RestartOnIdle>false</RestartOnIdle>
|
||||
</IdleSettings>
|
||||
<AllowStartOnDemand>true</AllowStartOnDemand>
|
||||
<Enabled>true</Enabled>
|
||||
<Hidden>false</Hidden>
|
||||
<RunOnlyIfIdle>false</RunOnlyIfIdle>
|
||||
<WakeToRun>false</WakeToRun>
|
||||
<ExecutionTimeLimit>PT72H</ExecutionTimeLimit>
|
||||
<Priority>7</Priority>
|
||||
</Settings>
|
||||
<Actions Context="Author">
|
||||
<Exec>
|
||||
<Command>C:\Windows\System32\wscript.exe</Command>
|
||||
<Arguments>C:\Windows\Setup\Scripts\UnlockStartLayout.vbs</Arguments>
|
||||
</Exec>
|
||||
</Actions>
|
||||
</Task>
|
||||
</File>
|
||||
<File path="C:\Windows\Setup\Scripts\SetStartPins.ps1">
|
||||
$json = '{"pinnedList":[]}';
|
||||
if( [System.Environment]::OSVersion.Version.Build -lt 20000 ) {
|
||||
return;
|
||||
}
|
||||
$key = 'Registry::HKLM\SOFTWARE\Microsoft\PolicyManager\current\device\Start';
|
||||
New-Item -Path $key -ItemType 'Directory' -ErrorAction 'SilentlyContinue';
|
||||
Set-ItemProperty -LiteralPath $key -Name 'ConfigureStartPins' -Value $json -Type 'String';
|
||||
</File>
|
||||
<File path="C:\Windows\Setup\Scripts\SetColorTheme.ps1">
|
||||
$lightThemeSystem = 0;
|
||||
$lightThemeApps = 0;
|
||||
$accentColorOnStart = 0;
|
||||
$enableTransparency = 0;
|
||||
$htmlAccentColor = '#0078D4';
|
||||
& {
|
||||
$params = @{
|
||||
LiteralPath = 'Registry::HKCU\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize';
|
||||
Force = $true;
|
||||
Type = 'DWord';
|
||||
};
|
||||
Set-ItemProperty @params -Name 'SystemUsesLightTheme' -Value $lightThemeSystem;
|
||||
Set-ItemProperty @params -Name 'AppsUseLightTheme' -Value $lightThemeApps;
|
||||
Set-ItemProperty @params -Name 'ColorPrevalence' -Value $accentColorOnStart;
|
||||
Set-ItemProperty @params -Name 'EnableTransparency' -Value $enableTransparency;
|
||||
};
|
||||
& {
|
||||
Add-Type -AssemblyName 'System.Drawing';
|
||||
$accentColor = [System.Drawing.ColorTranslator]::FromHtml( $htmlAccentColor );
|
||||
|
||||
function ConvertTo-DWord {
|
||||
param(
|
||||
[System.Drawing.Color]
|
||||
$Color
|
||||
);
|
||||
|
||||
[byte[]]$bytes = @(
|
||||
$Color.R;
|
||||
$Color.G;
|
||||
$Color.B;
|
||||
$Color.A;
|
||||
);
|
||||
return [System.BitConverter]::ToUInt32( $bytes, 0);
|
||||
}
|
||||
|
||||
$startColor = [System.Drawing.Color]::FromArgb( 0xD2, $accentColor );
|
||||
Set-ItemProperty -LiteralPath 'Registry::HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Accent' -Name 'StartColorMenu' -Value( ConvertTo-DWord -Color $accentColor ) -Type 'DWord' -Force;
|
||||
Set-ItemProperty -LiteralPath 'Registry::HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Accent' -Name 'AccentColorMenu' -Value( ConvertTo-DWord -Color $accentColor ) -Type 'DWord' -Force;
|
||||
Set-ItemProperty -LiteralPath 'Registry::HKCU\Software\Microsoft\Windows\DWM' -Name 'AccentColor' -Value( ConvertTo-DWord -Color $accentColor ) -Type 'DWord' -Force;
|
||||
$params = @{
|
||||
LiteralPath = 'Registry::HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Accent';
|
||||
Name = 'AccentPalette';
|
||||
};
|
||||
$palette = Get-ItemPropertyValue @params;
|
||||
$index = 20;
|
||||
$palette[ $index++ ] = $accentColor.R;
|
||||
$palette[ $index++ ] = $accentColor.G;
|
||||
$palette[ $index++ ] = $accentColor.B;
|
||||
$palette[ $index++ ] = $accentColor.A;
|
||||
Set-ItemProperty @params -Value $palette -Type 'Binary' -Force;
|
||||
};
|
||||
</File>
|
||||
<File path="C:\Windows\Setup\Scripts\Specialize.ps1">
|
||||
$scripts = @(
|
||||
{
|
||||
reg.exe add "HKLM\SYSTEM\Setup\MoSetup" /v AllowUpgradesWithUnsupportedTPMOrCPU /t REG_DWORD /d 1 /f;
|
||||
};
|
||||
{
|
||||
net.exe accounts /maxpwage:UNLIMITED;
|
||||
};
|
||||
{
|
||||
reg.exe add "HKLM\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableCloudOptimizedContent" /t REG_DWORD /d 1 /f;
|
||||
[System.Diagnostics.EventLog]::CreateEventSource( 'UnattendGenerator', 'Application' );
|
||||
};
|
||||
{
|
||||
Register-ScheduledTask -TaskName 'UnlockStartLayout' -Xml $( Get-Content -LiteralPath 'C:\Windows\Setup\Scripts\UnlockStartLayout.xml' -Raw );
|
||||
};
|
||||
{
|
||||
reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\FileSystem" /v LongPathsEnabled /t REG_DWORD /d 1 /f
|
||||
};
|
||||
{
|
||||
Remove-Item -LiteralPath 'C:\Users\Public\Desktop\Microsoft Edge.lnk' -ErrorAction 'SilentlyContinue' -Verbose;
|
||||
};
|
||||
{
|
||||
reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Dsh" /v AllowNewsAndInterests /t REG_DWORD /d 0 /f;
|
||||
};
|
||||
{
|
||||
reg.exe add "HKLM\Software\Policies\Microsoft\Edge" /v HideFirstRunExperience /t REG_DWORD /d 1 /f;
|
||||
};
|
||||
{
|
||||
reg.exe add "HKLM\Software\Policies\Microsoft\Edge\Recommended" /v BackgroundModeEnabled /t REG_DWORD /d 0 /f;
|
||||
reg.exe add "HKLM\Software\Policies\Microsoft\Edge\Recommended" /v StartupBoostEnabled /t REG_DWORD /d 0 /f;
|
||||
};
|
||||
{
|
||||
& 'C:\Windows\Setup\Scripts\SetStartPins.ps1';
|
||||
};
|
||||
{
|
||||
reg.exe add "HKU\.DEFAULT\Control Panel\Accessibility\StickyKeys" /v Flags /t REG_SZ /d 10 /f;
|
||||
};
|
||||
{
|
||||
reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v NoAutoUpdate /t REG_DWORD /d 1 /f;
|
||||
reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" /v DisableWindowsUpdateAccess /t REG_DWORD /d 1 /f;
|
||||
};
|
||||
);
|
||||
|
||||
& {
|
||||
[float]$complete = 0;
|
||||
[float]$increment = 100 / $scripts.Count;
|
||||
foreach( $script in $scripts ) {
|
||||
Write-Progress -Id 0 -Activity 'Running scripts to customize your Windows installation. Do not close this window.' -PercentComplete $complete;
|
||||
'*** Will now execute command «{0}».' -f $(
|
||||
$str = $script.ToString().Trim() -replace '\s+', ' ';
|
||||
$max = 100;
|
||||
if( $str.Length -le $max ) {
|
||||
$str;
|
||||
} else {
|
||||
$str.Substring( 0, $max - 1 ) + '…';
|
||||
}
|
||||
);
|
||||
$start = [datetime]::Now;
|
||||
& $script;
|
||||
'*** Finished executing command after {0:0} ms.' -f [datetime]::Now.Subtract( $start ).TotalMilliseconds;
|
||||
"`r`n" * 3;
|
||||
$complete += $increment;
|
||||
}
|
||||
} *>&1 | Out-String -Width 1KB -Stream >> "C:\Windows\Setup\Scripts\Specialize.log";
|
||||
</File>
|
||||
<File path="C:\Windows\Setup\Scripts\UserOnce.ps1">
|
||||
$scripts = @(
|
||||
{
|
||||
[System.Diagnostics.EventLog]::WriteEntry( 'UnattendGenerator', "User '$env:USERNAME' has requested to unlock the Start menu layout.", [System.Diagnostics.EventLogEntryType]::Information, 1 );
|
||||
};
|
||||
{
|
||||
Remove-Item -Path "${env:USERPROFILE}\Desktop\*.lnk" -Force -ErrorAction 'SilentlyContinue';
|
||||
Remove-Item -Path "$env:HOMEDRIVE\Users\Default\Desktop\*.lnk" -Force -ErrorAction 'SilentlyContinue';
|
||||
};
|
||||
{
|
||||
$taskbarPath = "$env:AppData\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar";
|
||||
if( Test-Path $taskbarPath ) {
|
||||
Get-ChildItem -Path $taskbarPath -File | Remove-Item -Force;
|
||||
}
|
||||
Remove-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband' -Name 'FavoritesRemovedChanges' -Force -ErrorAction 'SilentlyContinue';
|
||||
Remove-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband' -Name 'FavoritesChanges' -Force -ErrorAction 'SilentlyContinue';
|
||||
Remove-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband' -Name 'Favorites' -Force -ErrorAction 'SilentlyContinue';
|
||||
};
|
||||
{
|
||||
reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /ve /f;
|
||||
};
|
||||
{
|
||||
Set-ItemProperty -LiteralPath 'Registry::HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced' -Name 'LaunchTo' -Type 'DWord' -Value 1;
|
||||
};
|
||||
{
|
||||
Set-ItemProperty -LiteralPath 'Registry::HKCU\Software\Microsoft\Windows\CurrentVersion\Search' -Name 'SearchboxTaskbarMode' -Type 'DWord' -Value 0;
|
||||
};
|
||||
{
|
||||
& 'C:\Windows\Setup\Scripts\SetColorTheme.ps1';
|
||||
};
|
||||
{
|
||||
reg.exe add "HKCU\Software\Microsoft\Windows\CurrentVersion\Notifications\Settings\Windows.SystemToast.Suggested" /f;
|
||||
reg.exe add "HKCU\Software\Microsoft\Windows\CurrentVersion\Notifications\Settings\Windows.SystemToast.Suggested" /v Enabled /t REG_DWORD /d 0 /f;
|
||||
reg.exe add "HKCU\Software\Microsoft\Windows\CurrentVersion\Notifications\Settings\Windows.SystemToast.StartupApp" /f;
|
||||
reg.exe add "HKCU\Software\Microsoft\Windows\CurrentVersion\Notifications\Settings\Windows.SystemToast.StartupApp" /v Enabled /t REG_DWORD /d 0 /f;
|
||||
reg.exe add "HKCU\Software\Microsoft\Windows\CurrentVersion\Notifications\Settings\Microsoft.SkyDrive.Desktop" /f;
|
||||
reg.exe add "HKCU\Software\Microsoft\Windows\CurrentVersion\Notifications\Settings\Microsoft.SkyDrive.Desktop" /v Enabled /t REG_DWORD /d 0 /f;
|
||||
reg.exe add "HKCU\Software\Microsoft\Windows\CurrentVersion\Notifications\Settings\Windows.SystemToast.AccountHealth" /f;
|
||||
reg.exe add "HKCU\Software\Microsoft\Windows\CurrentVersion\Notifications\Settings\Windows.SystemToast.AccountHealth" /v Enabled /t REG_DWORD /d 0 /f;
|
||||
};
|
||||
{
|
||||
reg.exe add "HKCU\Software\Microsoft\Windows\CurrentVersion\Start" /v AllAppsViewMode /t REG_DWORD /d 2 /f;
|
||||
reg.exe add "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v Start_IrisRecommendations /t REG_DWORD /d 0 /f;
|
||||
reg.exe add "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v Start_AccountNotifications /t REG_DWORD /d 0 /f;
|
||||
reg.exe add "HKCU\Software\Microsoft\Windows\CurrentVersion\Start" /v ShowAllPinsList /t REG_DWORD /d 0 /f;
|
||||
reg.exe add "HKCU\Software\Microsoft\Windows\CurrentVersion\Start" /v ShowFrequentList /t REG_DWORD /d 0 /f;
|
||||
reg.exe add "HKCU\Software\Microsoft\Windows\CurrentVersion\Start" /v ShowRecentList /t REG_DWORD /d 0 /f;
|
||||
reg.exe add "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v Start_TrackDocs /t REG_DWORD /d 0 /f;
|
||||
};
|
||||
{
|
||||
Add-Type -TypeDefinition @"
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
public class Win32Broadcast {
|
||||
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
|
||||
public static extern IntPtr SendMessageTimeout(
|
||||
IntPtr hWnd,
|
||||
uint Msg,
|
||||
IntPtr wParam,
|
||||
string lParam,
|
||||
uint fuFlags,
|
||||
uint uTimeout,
|
||||
out IntPtr lpdwResult);
|
||||
}
|
||||
"@;
|
||||
[Win32Broadcast]::SendMessageTimeout( [IntPtr]0xffff, 0x1A, [IntPtr]::Zero, 'ImmersiveColorSet', 0x2, 100, [ref]([IntPtr]::Zero) );
|
||||
};
|
||||
{
|
||||
Get-Process -Name 'explorer' -ErrorAction 'SilentlyContinue' | Where-Object -FilterScript {
|
||||
$_.SessionId -eq ( Get-Process -Id $PID ).SessionId;
|
||||
} | Stop-Process -Force;
|
||||
};
|
||||
);
|
||||
|
||||
& {
|
||||
[float]$complete = 0;
|
||||
[float]$increment = 100 / $scripts.Count;
|
||||
foreach( $script in $scripts ) {
|
||||
Write-Progress -Id 0 -Activity 'Running scripts to configure this user account. Do not close this window.' -PercentComplete $complete;
|
||||
'*** Will now execute command «{0}».' -f $(
|
||||
$str = $script.ToString().Trim() -replace '\s+', ' ';
|
||||
$max = 100;
|
||||
if( $str.Length -le $max ) {
|
||||
$str;
|
||||
} else {
|
||||
$str.Substring( 0, $max - 1 ) + '…';
|
||||
}
|
||||
);
|
||||
$start = [datetime]::Now;
|
||||
& $script;
|
||||
'*** Finished executing command after {0:0} ms.' -f [datetime]::Now.Subtract( $start ).TotalMilliseconds;
|
||||
"`r`n" * 3;
|
||||
$complete += $increment;
|
||||
}
|
||||
} *>&1 | Out-String -Width 1KB -Stream >> "$env:TEMP\UserOnce.log";
|
||||
</File>
|
||||
<File path="C:\Windows\Setup\Scripts\DefaultUser.ps1">
|
||||
$scripts = @(
|
||||
{
|
||||
reg.exe add "HKU\DefaultUser\Software\Policies\Microsoft\Windows\Explorer" /v "StartLayoutFile" /t REG_SZ /d "C:\Windows\Setup\Scripts\TaskbarLayoutModification.xml" /f;
|
||||
reg.exe add "HKU\DefaultUser\Software\Policies\Microsoft\Windows\Explorer" /v "LockedStartLayout" /t REG_DWORD /d 1 /f;
|
||||
};
|
||||
{
|
||||
reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v ShowTaskViewButton /t REG_DWORD /d 0 /f;
|
||||
};
|
||||
{
|
||||
reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v TaskbarAl /t REG_DWORD /d 0 /f;
|
||||
};
|
||||
{
|
||||
foreach( $root in 'Registry::HKU\.DEFAULT', 'Registry::HKU\DefaultUser' ) {
|
||||
Set-ItemProperty -LiteralPath "$root\Control Panel\Keyboard" -Name 'InitialKeyboardIndicators' -Type 'String' -Value 2 -Force;
|
||||
}
|
||||
};
|
||||
{
|
||||
reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\TaskbarDeveloperSettings" /v TaskbarEndTask /t REG_DWORD /d 1 /f;
|
||||
};
|
||||
{
|
||||
reg.exe add "HKU\DefaultUser\Control Panel\Accessibility\StickyKeys" /v Flags /t REG_SZ /d 10 /f;
|
||||
};
|
||||
{
|
||||
reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\DWM" /v ColorPrevalence /t REG_DWORD /d 0 /f;
|
||||
};
|
||||
{
|
||||
reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\RunOnce" /v "UnattendedSetup" /t REG_SZ /d "powershell.exe -WindowStyle \""Normal\"" -ExecutionPolicy \""Unrestricted\"" -NoProfile -File \""C:\Windows\Setup\Scripts\UserOnce.ps1\""" /f;
|
||||
};
|
||||
);
|
||||
|
||||
& {
|
||||
[float]$complete = 0;
|
||||
[float]$increment = 100 / $scripts.Count;
|
||||
foreach( $script in $scripts ) {
|
||||
Write-Progress -Id 0 -Activity 'Running scripts to modify the default user’’s registry hive. Do not close this window.' -PercentComplete $complete;
|
||||
'*** Will now execute command «{0}».' -f $(
|
||||
$str = $script.ToString().Trim() -replace '\s+', ' ';
|
||||
$max = 100;
|
||||
if( $str.Length -le $max ) {
|
||||
$str;
|
||||
} else {
|
||||
$str.Substring( 0, $max - 1 ) + '…';
|
||||
}
|
||||
);
|
||||
$start = [datetime]::Now;
|
||||
& $script;
|
||||
'*** Finished executing command after {0:0} ms.' -f [datetime]::Now.Subtract( $start ).TotalMilliseconds;
|
||||
"`r`n" * 3;
|
||||
$complete += $increment;
|
||||
}
|
||||
} *>&1 | Out-String -Width 1KB -Stream >> "C:\Windows\Setup\Scripts\DefaultUser.log";
|
||||
</File>
|
||||
<File path="C:\Windows\Setup\Scripts\FirstLogon.ps1">
|
||||
$scripts = @(
|
||||
{
|
||||
cmd.exe /c "rmdir C:\Windows.old";
|
||||
};
|
||||
{
|
||||
Remove-Item -LiteralPath @(
|
||||
'C:\Windows\Panther\unattend.xml';
|
||||
'C:\Windows\Panther\unattend-original.xml';
|
||||
'C:\Windows\Setup\Scripts\Wifi.xml';
|
||||
) -Force -ErrorAction 'SilentlyContinue' -Verbose;
|
||||
};
|
||||
{
|
||||
reg.exe delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v NoAutoUpdate /f;
|
||||
reg.exe delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v AUOptions /f;
|
||||
reg.exe delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v UseWUServer /f;
|
||||
reg.exe delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" /v DisableWindowsUpdateAccess /f;
|
||||
reg.exe delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" /v WUServer /f;
|
||||
reg.exe delete "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate" /v WUStatusServer /f;
|
||||
reg.exe delete "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\DeliveryOptimization\Config" /v DODownloadMode /f;
|
||||
reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\BITS" /v Start /t REG_DWORD /d 3 /f;
|
||||
reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\wuauserv" /v Start /t REG_DWORD /d 3 /f;
|
||||
reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\UsoSvc" /v Start /t REG_DWORD /d 2 /f;
|
||||
reg.exe add "HKLM\SYSTEM\CurrentControlSet\Services\WaaSMedicSvc" /v Start /t REG_DWORD /d 3 /f;
|
||||
};
|
||||
{
|
||||
$recallFeature = Get-WindowsOptionalFeature -Online -ErrorAction SilentlyContinue | Where-Object { $_.State -eq 'Enabled' -and $_.FeatureName -like 'Recall' };
|
||||
if( $recallFeature ) {
|
||||
Disable-WindowsOptionalFeature -Online -FeatureName 'Recall' -Remove -ErrorAction SilentlyContinue;
|
||||
}
|
||||
};
|
||||
{
|
||||
try {
|
||||
$viveDir = Join-Path $env:TEMP 'ViVeTool';
|
||||
$viveZip = Join-Path $env:TEMP 'ViVeTool.zip';
|
||||
Invoke-WebRequest 'https://github.com/thebookisclosed/ViVe/releases/download/v0.3.4/ViVeTool-v0.3.4-IntelAmd.zip' -OutFile $viveZip;
|
||||
Expand-Archive -Path $viveZip -DestinationPath $viveDir -Force;
|
||||
Remove-Item -Path $viveZip -Force;
|
||||
Start-Process -FilePath (Join-Path $viveDir 'ViVeTool.exe') -ArgumentList '/disable /id:47205210' -Wait -NoNewWindow;
|
||||
Remove-Item -Path $viveDir -Recurse -Force;
|
||||
} catch {}
|
||||
};
|
||||
{
|
||||
if( (Get-BitLockerVolume -MountPoint $Env:SystemDrive).ProtectionStatus -eq 'On' ) {
|
||||
Disable-BitLocker -MountPoint $Env:SystemDrive;
|
||||
}
|
||||
};
|
||||
{
|
||||
if( (bcdedit | Select-String 'path').Count -eq 2 ) {
|
||||
bcdedit /set `{bootmgr`} timeout 0;
|
||||
}
|
||||
};
|
||||
);
|
||||
|
||||
& {
|
||||
[float]$complete = 0;
|
||||
[float]$increment = 100 / $scripts.Count;
|
||||
foreach( $script in $scripts ) {
|
||||
Write-Progress -Id 0 -Activity 'Running scripts to finalize your Windows installation. Do not close this window.' -PercentComplete $complete;
|
||||
'*** Will now execute command «{0}».' -f $(
|
||||
$str = $script.ToString().Trim() -replace '\s+', ' ';
|
||||
$max = 100;
|
||||
if( $str.Length -le $max ) {
|
||||
$str;
|
||||
} else {
|
||||
$str.Substring( 0, $max - 1 ) + '…';
|
||||
}
|
||||
);
|
||||
$start = [datetime]::Now;
|
||||
& $script;
|
||||
'*** Finished executing command after {0:0} ms.' -f [datetime]::Now.Subtract( $start ).TotalMilliseconds;
|
||||
"`r`n" * 3;
|
||||
$complete += $increment;
|
||||
}
|
||||
} *>&1 | Out-String -Width 1KB -Stream >> "C:\Windows\Setup\Scripts\FirstLogon.log";
|
||||
</File>
|
||||
</Extensions>
|
||||
</unattend>
|
||||
|
||||
@@ -273,43 +273,22 @@
|
||||
<Style TargetType="ComboBox">
|
||||
<Setter Property="Foreground" Value="{DynamicResource ComboBoxForegroundColor}" />
|
||||
<Setter Property="Background" Value="{DynamicResource ComboBoxBackgroundColor}" />
|
||||
<Setter Property="MinWidth" Value="{DynamicResource ButtonWidth}" />
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="ComboBox">
|
||||
<Grid>
|
||||
<Border x:Name="OuterBorder"
|
||||
BorderBrush="{DynamicResource BorderColor}"
|
||||
BorderThickness="1"
|
||||
CornerRadius="{DynamicResource ButtonCornerRadius}"
|
||||
Background="{TemplateBinding Background}">
|
||||
<ToggleButton x:Name="ToggleButton"
|
||||
Background="Transparent"
|
||||
Background="{TemplateBinding Background}"
|
||||
BorderBrush="{TemplateBinding Background}"
|
||||
BorderThickness="0"
|
||||
IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
|
||||
ClickMode="Press">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Grid.Column="0"
|
||||
Text="{TemplateBinding SelectionBoxItem}"
|
||||
<TextBlock Text="{TemplateBinding SelectionBoxItem}"
|
||||
Foreground="{TemplateBinding Foreground}"
|
||||
Background="Transparent"
|
||||
HorizontalAlignment="Left" VerticalAlignment="Center"
|
||||
Margin="6,3,2,3"/>
|
||||
<Path Grid.Column="1"
|
||||
Data="M 0,0 L 8,0 L 4,5 Z"
|
||||
Fill="{TemplateBinding Foreground}"
|
||||
Width="8" Height="5"
|
||||
VerticalAlignment="Center"
|
||||
HorizontalAlignment="Center"
|
||||
Stretch="Uniform"
|
||||
Margin="4,0,6,0"/>
|
||||
</Grid>
|
||||
HorizontalAlignment="Center" VerticalAlignment="Center" Margin="2"
|
||||
/>
|
||||
</ToggleButton>
|
||||
</Border>
|
||||
<Popup x:Name="Popup"
|
||||
IsOpen="{TemplateBinding IsDropDownOpen}"
|
||||
Placement="Bottom"
|
||||
@@ -318,11 +297,11 @@
|
||||
PopupAnimation="Slide">
|
||||
<Border x:Name="DropDownBorder"
|
||||
Background="{TemplateBinding Background}"
|
||||
BorderBrush="{DynamicResource BorderColor}"
|
||||
BorderBrush="{TemplateBinding Foreground}"
|
||||
BorderThickness="1"
|
||||
CornerRadius="4">
|
||||
<ScrollViewer>
|
||||
<ItemsPresenter HorizontalAlignment="Left" VerticalAlignment="Center" Margin="4,2"/>
|
||||
<ItemsPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Margin="2"/>
|
||||
</ScrollViewer>
|
||||
</Border>
|
||||
</Popup>
|
||||
@@ -991,11 +970,11 @@
|
||||
</TextBlock>
|
||||
</ToggleButton.Content>
|
||||
</ToggleButton>
|
||||
<ToggleButton Margin="0,0,5,0" Height="{DynamicResource TabButtonHeight}" Width="Auto" MinWidth="{DynamicResource TabButtonWidth}"
|
||||
<ToggleButton Margin="0,0,5,0" Height="{DynamicResource TabButtonHeight}" Width="{DynamicResource TabButtonWidth}"
|
||||
Background="{DynamicResource ButtonWin11ISOBackgroundColor}" Foreground="{DynamicResource ButtonWin11ISOForegroundColor}" FontWeight="Bold" Name="WPFTab5BT">
|
||||
<ToggleButton.Content>
|
||||
<TextBlock FontSize="{DynamicResource TabButtonFontSize}" Background="Transparent" Foreground="{DynamicResource ButtonWin11ISOForegroundColor}">
|
||||
<Underline>W</Underline>in11 Creator
|
||||
<Underline>W</Underline>in11ISO
|
||||
</TextBlock>
|
||||
</ToggleButton.Content>
|
||||
</ToggleButton>
|
||||
@@ -1361,17 +1340,21 @@
|
||||
</ScrollViewer>
|
||||
</TabItem>
|
||||
<TabItem Header="Win11ISO" Visibility="Collapsed" Name="WPFTab5">
|
||||
<Grid Name="Win11ISOPanel" Margin="{DynamicResource TabContentMargin}" Background="Transparent">
|
||||
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled" Margin="{DynamicResource TabContentMargin}">
|
||||
<Grid Background="Transparent" Name="Win11ISOPanel">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/> <!-- Steps 1-4 -->
|
||||
<RowDefinition Height="*"/> <!-- Log / Status -->
|
||||
<RowDefinition Height="Auto"/> <!-- Step 1: Select ISO -->
|
||||
<RowDefinition Height="Auto"/> <!-- Step 2: Mount & Verify -->
|
||||
<RowDefinition Height="Auto"/> <!-- Step 3: Modify install.wim -->
|
||||
<RowDefinition Height="Auto"/> <!-- Step 4: Output Options -->
|
||||
<RowDefinition Height="Auto"/> <!-- Log / Status -->
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- Steps 1-4 -->
|
||||
<StackPanel Grid.Row="0">
|
||||
|
||||
<!-- ─── STEP 1 : Select Windows 11 ISO ─────────────── -->
|
||||
<Grid Name="WPFWin11ISOSelectSection" Margin="5" HorizontalAlignment="Left" MinWidth="{DynamicResource ButtonWidth}">
|
||||
<!-- ═══════════════════════════════════════════════════════════ -->
|
||||
<!-- STEP 1 : Select Windows 11 ISO -->
|
||||
<!-- ═══════════════════════════════════════════════════════════ -->
|
||||
<Border Grid.Row="0" Style="{StaticResource BorderStyle}">
|
||||
<Grid Margin="5">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
@@ -1381,17 +1364,13 @@
|
||||
<StackPanel Grid.Column="0" Margin="5,5,15,5">
|
||||
<TextBlock FontSize="{DynamicResource FontSize}" FontWeight="Bold"
|
||||
Foreground="{DynamicResource MainForegroundColor}" Margin="0,0,0,8">
|
||||
Step 1 - Select Windows 11 ISO
|
||||
Step 1 — Select Windows 11 ISO
|
||||
</TextBlock>
|
||||
<TextBlock FontSize="{DynamicResource FontSize}" Foreground="{DynamicResource MainForegroundColor}"
|
||||
TextWrapping="Wrap" Margin="0,0,0,6">
|
||||
TextWrapping="Wrap" Margin="0,0,0,12">
|
||||
Browse to your locally saved Windows 11 ISO file. Only official ISOs
|
||||
downloaded from Microsoft are supported.
|
||||
</TextBlock>
|
||||
<TextBlock FontSize="{DynamicResource FontSize}" Foreground="{DynamicResource MainForegroundColor}"
|
||||
TextWrapping="Wrap" Margin="0,0,0,12" FontStyle="Italic">
|
||||
<Run FontWeight="Bold">NOTE:</Run> This is only meant for Fresh and New Windows installs.
|
||||
</TextBlock>
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
@@ -1408,7 +1387,7 @@
|
||||
Background="{DynamicResource MainBackgroundColor}"/>
|
||||
<Button Grid.Column="1"
|
||||
Name="WPFWin11ISOBrowseButton"
|
||||
Content="Browse"
|
||||
Content="Browse…"
|
||||
Width="Auto" Padding="12,0"
|
||||
Height="{DynamicResource ButtonHeight}"/>
|
||||
</Grid>
|
||||
@@ -1429,7 +1408,7 @@
|
||||
<StackPanel>
|
||||
<TextBlock FontSize="{DynamicResource FontSize}" FontWeight="Bold"
|
||||
Foreground="OrangeRed" Margin="0,0,0,10">
|
||||
!!WARNING!! You must use an official Microsoft ISO
|
||||
⚠ You must use an official Microsoft ISO
|
||||
</TextBlock>
|
||||
<TextBlock FontSize="{DynamicResource FontSize}"
|
||||
Foreground="{DynamicResource MainForegroundColor}"
|
||||
@@ -1446,9 +1425,9 @@
|
||||
<TextBlock FontSize="{DynamicResource FontSize}"
|
||||
Foreground="{DynamicResource MainForegroundColor}"
|
||||
TextWrapping="Wrap" Margin="12,0,0,12">
|
||||
- Edition : Windows 11
|
||||
<LineBreak/>- Language : your preferred language
|
||||
<LineBreak/>- Architecture : 64-bit (x64)
|
||||
• Edition : Windows 11
|
||||
<LineBreak/>• Language : your preferred language
|
||||
<LineBreak/>• Architecture : 64-bit (x64)
|
||||
</TextBlock>
|
||||
<Button Name="WPFWin11ISODownloadLink"
|
||||
Content="Open Microsoft Download Page"
|
||||
@@ -1458,12 +1437,16 @@
|
||||
</StackPanel>
|
||||
</Border>
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
<!-- ─── STEP 2 : Mount & Verify ISO ──────────────────── -->
|
||||
<Grid Name="WPFWin11ISOMountSection"
|
||||
Margin="5"
|
||||
Visibility="Collapsed"
|
||||
HorizontalAlignment="Left" MinWidth="{DynamicResource ButtonWidth}">
|
||||
<!-- ═══════════════════════════════════════════════════════════ -->
|
||||
<!-- STEP 2 : Mount & Verify ISO -->
|
||||
<!-- ═══════════════════════════════════════════════════════════ -->
|
||||
<Border Grid.Row="1"
|
||||
Name="WPFWin11ISOMountSection"
|
||||
Style="{StaticResource BorderStyle}"
|
||||
Visibility="Collapsed">
|
||||
<Grid Margin="5">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
@@ -1472,7 +1455,7 @@
|
||||
<StackPanel Grid.Column="0" Margin="0,0,20,0" VerticalAlignment="Top">
|
||||
<TextBlock FontSize="{DynamicResource FontSize}" FontWeight="Bold"
|
||||
Foreground="{DynamicResource MainForegroundColor}" Margin="0,0,0,8">
|
||||
Step 2 - Mount & Verify ISO
|
||||
Step 2 — Mount & Verify ISO
|
||||
</TextBlock>
|
||||
<TextBlock FontSize="{DynamicResource FontSize}"
|
||||
Foreground="{DynamicResource MainForegroundColor}"
|
||||
@@ -1485,13 +1468,6 @@
|
||||
HorizontalAlignment="Left"
|
||||
Width="Auto" Padding="12,0"
|
||||
Height="{DynamicResource ButtonHeight}"/>
|
||||
<CheckBox Name="WPFWin11ISOInjectDrivers"
|
||||
Content="Inject current system drivers"
|
||||
FontSize="{DynamicResource FontSize}"
|
||||
Foreground="{DynamicResource MainForegroundColor}"
|
||||
IsChecked="False"
|
||||
Margin="0,8,0,0"
|
||||
ToolTip="Exports all drivers from this machine and injects them into install.wim and boot.wim. Recommended for systems with unsupported NVMe or network controllers."/>
|
||||
</StackPanel>
|
||||
|
||||
<!-- Verification results panel -->
|
||||
@@ -1514,26 +1490,28 @@
|
||||
<TextBlock FontSize="{DynamicResource FontSize}" FontWeight="Bold"
|
||||
Foreground="{DynamicResource MainForegroundColor}"
|
||||
Margin="0,6,0,4">
|
||||
Select Edition:
|
||||
Available Editions:
|
||||
</TextBlock>
|
||||
<ComboBox Name="WPFWin11ISOEditionComboBox"
|
||||
<TextBlock Name="WPFWin11ISOEditionList"
|
||||
FontSize="{DynamicResource FontSize}"
|
||||
Foreground="{DynamicResource MainForegroundColor}"
|
||||
Background="{DynamicResource MainBackgroundColor}"
|
||||
HorizontalAlignment="Left"
|
||||
Margin="0,0,0,0"/>
|
||||
TextWrapping="Wrap"/>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
</Grid>
|
||||
</Border>
|
||||
|
||||
<!-- ─── STEP 3 : Modify install.wim ───────────────────── -->
|
||||
<StackPanel Name="WPFWin11ISOModifySection"
|
||||
Margin="5"
|
||||
Visibility="Collapsed"
|
||||
HorizontalAlignment="Left" MinWidth="{DynamicResource ButtonWidth}">
|
||||
<!-- ═══════════════════════════════════════════════════════════ -->
|
||||
<!-- STEP 3 : Modify install.wim -->
|
||||
<!-- ═══════════════════════════════════════════════════════════ -->
|
||||
<Border Grid.Row="2"
|
||||
Name="WPFWin11ISOModifySection"
|
||||
Style="{StaticResource BorderStyle}"
|
||||
Visibility="Collapsed">
|
||||
<StackPanel Margin="5">
|
||||
<TextBlock FontSize="{DynamicResource FontSize}" FontWeight="Bold"
|
||||
Foreground="{DynamicResource MainForegroundColor}" Margin="0,0,0,8">
|
||||
Step 3 - Modify install.wim
|
||||
Step 3 — Modify install.wim
|
||||
</TextBlock>
|
||||
<TextBlock FontSize="{DynamicResource FontSize}"
|
||||
Foreground="{DynamicResource MainForegroundColor}"
|
||||
@@ -1544,73 +1522,53 @@
|
||||
depending on your hardware.
|
||||
</TextBlock>
|
||||
<Button Name="WPFWin11ISOModifyButton"
|
||||
Content="Run Windows ISO Modification and Creator"
|
||||
Content="Run install.wim Modification"
|
||||
HorizontalAlignment="Left"
|
||||
Width="Auto" Padding="12,0"
|
||||
Height="{DynamicResource ButtonHeight}"/>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<!-- ─── STEP 4 : Output Options ───────────────────────── -->
|
||||
<StackPanel Name="WPFWin11ISOOutputSection"
|
||||
Margin="5"
|
||||
Visibility="Collapsed"
|
||||
HorizontalAlignment="Left" MinWidth="{DynamicResource ButtonWidth}">
|
||||
<!-- Header row: title + Clean & Reset button -->
|
||||
<Grid Margin="0,0,0,12">
|
||||
<!-- ═══════════════════════════════════════════════════════════ -->
|
||||
<!-- STEP 4 : Output Options -->
|
||||
<!-- ═══════════════════════════════════════════════════════════ -->
|
||||
<Border Grid.Row="3"
|
||||
Name="WPFWin11ISOOutputSection"
|
||||
Style="{StaticResource BorderStyle}"
|
||||
Visibility="Collapsed">
|
||||
<StackPanel Margin="5">
|
||||
<TextBlock FontSize="{DynamicResource FontSize}" FontWeight="Bold"
|
||||
Foreground="{DynamicResource MainForegroundColor}" Margin="0,0,0,12">
|
||||
Step 4 — Output: What would you like to do with the modified ISO?
|
||||
</TextBlock>
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Grid.Column="0" FontSize="{DynamicResource FontSize}" FontWeight="Bold"
|
||||
Foreground="{DynamicResource MainForegroundColor}"
|
||||
VerticalAlignment="Center">
|
||||
Step 4 - Output: What would you like to do with the modified image?
|
||||
</TextBlock>
|
||||
<Button Grid.Column="1"
|
||||
Name="WPFWin11ISOCleanResetButton"
|
||||
Content="Clean & Reset"
|
||||
Foreground="OrangeRed"
|
||||
|
||||
<!-- Option 1: Export to ISO -->
|
||||
<Border Grid.Column="0" Style="{StaticResource BorderStyle}">
|
||||
<StackPanel>
|
||||
<Button Name="WPFWin11ISOExportButton"
|
||||
Content="1 — Export to ISO"
|
||||
HorizontalAlignment="Stretch"
|
||||
Width="Auto" Padding="12,0"
|
||||
Height="{DynamicResource ButtonHeight}"
|
||||
ToolTip="Delete the temporary working directory and reset the interface back to Step 1"
|
||||
Margin="12,0,0,0"/>
|
||||
</Grid>
|
||||
|
||||
<!-- ── Choice prompt buttons ── -->
|
||||
<Grid Margin="0,0,0,12">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="16"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Button Grid.Column="0"
|
||||
Name="WPFWin11ISOChooseISOButton"
|
||||
Content="Save as an ISO File"
|
||||
HorizontalAlignment="Stretch"
|
||||
Width="Auto" Padding="12,0"
|
||||
Height="{DynamicResource ButtonHeight}"/>
|
||||
<Button Grid.Column="2"
|
||||
Name="WPFWin11ISOChooseUSBButton"
|
||||
Content="Write Directly to a USB Drive (ERASES DRIVE)"
|
||||
Foreground="OrangeRed"
|
||||
HorizontalAlignment="Stretch"
|
||||
Width="Auto" Padding="12,0"
|
||||
Height="{DynamicResource ButtonHeight}"/>
|
||||
</Grid>
|
||||
|
||||
<!-- ── USB write sub-panel (revealed on USB choice) ── -->
|
||||
<Border Name="WPFWin11ISOOptionUSB"
|
||||
Style="{StaticResource BorderStyle}"
|
||||
Visibility="Collapsed"
|
||||
Margin="0,8,0,0">
|
||||
<StackPanel>
|
||||
Margin="0,0,0,10"/>
|
||||
<TextBlock FontSize="{DynamicResource FontSize}"
|
||||
Foreground="{DynamicResource MainForegroundColor}"
|
||||
TextWrapping="Wrap" Margin="0,0,0,8">
|
||||
<Run FontWeight="Bold" Foreground="OrangeRed">!! All data on the selected USB drive will be permanently erased !!</Run>
|
||||
<LineBreak/>
|
||||
Select a removable USB drive below, then click Erase & Write.
|
||||
TextWrapping="Wrap">
|
||||
Save the modified content as a new bootable ISO file.
|
||||
You can store it, use it in a virtual machine, or later
|
||||
burn it to USB with any tool of your choice.
|
||||
</TextBlock>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<!-- Option 2: Erase & Write to USB -->
|
||||
<Border Grid.Column="1" Style="{StaticResource BorderStyle}">
|
||||
<StackPanel>
|
||||
<!-- USB drive selector row -->
|
||||
<Grid Margin="0,0,0,8">
|
||||
<Grid.ColumnDefinitions>
|
||||
@@ -1625,50 +1583,55 @@
|
||||
Margin="0,0,6,0"/>
|
||||
<Button Grid.Column="1"
|
||||
Name="WPFWin11ISORefreshUSBButton"
|
||||
Content="Refresh"
|
||||
Content="↻ Refresh"
|
||||
Width="Auto" Padding="8,0"
|
||||
Height="{DynamicResource ButtonHeight}"/>
|
||||
</Grid>
|
||||
<Button Name="WPFWin11ISOWriteUSBButton"
|
||||
Content="Erase & Write to USB"
|
||||
Content="2 — Erase & Write to USB"
|
||||
Foreground="OrangeRed"
|
||||
HorizontalAlignment="Stretch"
|
||||
Width="Auto" Padding="12,0"
|
||||
Height="{DynamicResource ButtonHeight}"
|
||||
Margin="0,0,0,10"/>
|
||||
<TextBlock FontSize="{DynamicResource FontSize}"
|
||||
Foreground="{DynamicResource MainForegroundColor}"
|
||||
TextWrapping="Wrap">
|
||||
<Run FontWeight="Bold" Foreground="OrangeRed">!! All data on the selected USB drive will be erased !!</Run>
|
||||
<LineBreak/>
|
||||
Select a removable USB drive above, then click the button
|
||||
to write the modified Windows 11 installation directly to it.
|
||||
</TextBlock>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
</Grid>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
</StackPanel>
|
||||
|
||||
<!-- Status Log (fills remaining height) -->
|
||||
<Grid Grid.Row="1" Margin="5">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="*"/>
|
||||
</Grid.RowDefinitions>
|
||||
<TextBlock Grid.Row="0"
|
||||
FontSize="{DynamicResource FontSize}" FontWeight="Bold"
|
||||
Foreground="{DynamicResource MainForegroundColor}"
|
||||
Margin="0,0,0,4">
|
||||
<!-- ═══════════════════════════════════════════════════════════ -->
|
||||
<!-- Status / Log Output -->
|
||||
<!-- ═══════════════════════════════════════════════════════════ -->
|
||||
<Border Grid.Row="4" Style="{StaticResource BorderStyle}">
|
||||
<StackPanel>
|
||||
<TextBlock FontSize="{DynamicResource FontSize}" FontWeight="Bold"
|
||||
Foreground="{DynamicResource MainForegroundColor}" Margin="0,0,0,6">
|
||||
Status Log
|
||||
</TextBlock>
|
||||
<TextBox Grid.Row="1"
|
||||
Name="WPFWin11ISOStatusLog"
|
||||
<TextBox Name="WPFWin11ISOStatusLog"
|
||||
IsReadOnly="True"
|
||||
TextWrapping="Wrap"
|
||||
VerticalScrollBarVisibility="Visible"
|
||||
VerticalAlignment="Stretch"
|
||||
Padding="6"
|
||||
VerticalScrollBarVisibility="Auto"
|
||||
Height="140" Padding="6"
|
||||
Background="{DynamicResource MainBackgroundColor}"
|
||||
Foreground="{DynamicResource MainForegroundColor}"
|
||||
BorderBrush="{DynamicResource BorderColor}"
|
||||
BorderThickness="1"
|
||||
Text="Ready. Please select a Windows 11 ISO to begin."/>
|
||||
</Grid>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
</Grid>
|
||||
</ScrollViewer>
|
||||
</TabItem>
|
||||
</TabControl>
|
||||
</Grid>
|
||||
|
||||
Reference in New Issue
Block a user