winutil/functions/public/Invoke-WPFMicrowin.ps1
Chris Titus a8af90a112
Test 2024 04 20 2 (#2030)
* Several Additions to 'applications.json' File (#1865)

* Add 'ditto' App to 'applications.json' File

* Add 'rdcman' App to 'applications.json' File

* Add 'mp3tag' App to 'applications.json' File

* Add 'fan control' App to 'applications.json' File

* Compile Winutil

* Add 'betterbird' App to 'applications.json' File (#1876)

* Compile Winutil

* Added fnm to the install menu (#1879)

* Compile Winutil

* Update applications.json (#1883)

* Compile Winutil

* Simple improvement: make WinUtil's Shortcut Function Do Less (Lazier) (#1903)

* Add Extra Comments to 'Invoke-WPFShortcut' to make the Logic a Bit Clearer

* Make The 'Invoke-WPFShortcut' Function Lazier for Added Efficiency and to not Display False Info whenever the User Cancels the 'Save As' Operation

* Compile Winutil

* Update applications.jsonremove Whatsapp because it is not being maintained and is named "outdated" when installed

* Update applications.json

remove Whatsapp because it is not being maintained and is named "outdated" when installed

* Compile Winutil

* Add option to remove Microsoft Copilot AI

* Add option to remove MS Copilot

* Update tweaks.json

* fix bugs

- remove appx caused a lockup
- also it looks like copilot will be the dependency for some built-in windows searches
Due to this I am changing it from a removal to a disable.

* Compile Winutil

* remove authy authy reached EOLhttps://help.twilio.com/articles/22771146070299-User-guide-End-of-Life-EOL-for-Twilio-Authy-Desktop-app

* remove authy 

authy reached EOL
https://help.twilio.com/articles/22771146070299-User-guide-End-of-Life-EOL-for-Twilio-Authy-Desktop-app

* Compile Winutil

* Update applications.jsonWindhawkThe customization marketplace for Windows programshttps://www.youtube.com/watch?v=ijG0nXnO2gQ

* Update applications.json

Windhawk
The customization marketplace for Windows programs

https://www.youtube.com/watch?v=ijG0nXnO2gQ

* add MSEdgeRedirect to applications.jsonperhaps a good "tweak" that could be added to Tweaks section down the road.  project is foss... could be   a good resource for someone with enough skills.in the meantime, does what it says it will, and does it well.

* add MSEdgeRedirect to applications.json

perhaps a good "tweak" that could be added to Tweaks section down the road.  project is foss... could be   a good resource for someone with enough skills.

in the meantime, does what it says it will, and does it well.

* Fix Winget Detection by doing Proper Error Handling using a Try-Catch

* Fix Winget Detection by doing Proper Error Handling using a Try-Catch

* Remove unnecessary Variable Initialization of 'wingetFullVersion'

Co-authored-by: Martin Wiethan <47688561+Marterich@users.noreply.github.com>

* Add Comments to be make The Logic a Lot More Clear to Follow and Understand

* Add Another Catch Statement with some 'Write-Warning' for Extra Information

* Remove StartAllBack + Adobe Debloater Tweak + Add Netbird

* remove StartAllBack

* Added Adobe Service Debloater

Sets Adobe Services to manual for people that sadly need to work with their apps.

* Add Netbird

https://netbird.io

* Compile Winutil

* Update applications.json

* Compile Winutil

* Added ability to import drivers

* Added ability to import drivers

Added the ability to import drivers from the active installation to the MicroWin image.

* Merge branch 'test-2024-04-20-2' into CW-MicroWin-240420

* Update inputXML.xaml

Removed warning because of a fluke

* Update Invoke-WPFMicrowin.ps1

Use the driver injection directory if it is specified and if the directory exists

* Merge branch 'test-2024-04-20-2' into CW-MicroWin-240420

* Merge branch 'test-2024-04-20-2' into CW-MicroWin-240420

* Compile Winutil

* Test 2024 04 20 2 | 7 additions to applications.json

* 7 additions to applications.json

Adds:

NetLimiter - https://www.netlimiter.com
OneCommander - https://www.onecommander.com
Borderless Gaming - https://github.com/Codeusa/Borderless-Gaming
Equalizer APO - https://sourceforge.net/projects/equalizerapo
FreeFileSync - https://freefilesync.org
Elgato Stream Deck - https://www.elgato.com/uk/en/s/downloads
Stardock Curtains - https://www.stardock.com/products/curtains

* Added Compact GUI support

Link: https://github.com/IridiumIO/CompactGUI

Since I wasn't sure what category to put it in, I chose Utilities.

* Added ExifCleaner support

Link: https://github.com/szTheory/exifcleaner

* Removed trial ware additions

Removed:

Net Limiter
One Commander
Elgato: Stream Deck
Stardock Curtains

* Compile Winutil

* add GlazeWM to applications.js (#1891)

Co-authored-by: Chris Titus <contact@christitus.com>

* Compile Winutil

* Remove old Win7 game tweak

* Compile Winutil

* Test 1715290913 fix ugly ifs (#1957)

* fix nested ifs

* Compile Winutil

* fix syntax

* Compile Winutil

* Add Spotify and Choco Fallback

* Compile Winutil

---------

Co-authored-by: ty802 <ty802@users.noreply.github.com>
Co-authored-by: Chris Titus <contact@christitus.com>
Co-authored-by: ChrisTitusTech <ChrisTitusTech@users.noreply.github.com>

* Compile Winutil

* Fix incorrect url for jellyfin-media-player (#1912)

* Compile Winutil

* Update name and description for Element (#1930)

- Fixed the name and description for Element to reflect the name of the client, rather than the underlying technology-Matrix.

* Compile Winutil

* Optimize winget download speed (#1931)

* Optimize Winget Download Speed

* Add Downloading Message

* Compile Winutil

* Include OOSU Config in winutil.ps1 (#1932)

* Compile Winutil

* Only install choco if needed (#1943)

* Compile Winutil

* Install Choco if needed

* Compile Winutil

* Added ForceAutoHDR application to applications.json (#1951)

* Added ForceAutoHDR application to applications.json

Entry added on line 2642

* Update config/applications.json

Yep my bad I though games related tools should be under "Games"

Co-authored-by: Mr.k <mineshtine28546271@gmail.com>

---------

Co-authored-by: Mr.k <mineshtine28546271@gmail.com>

* Compile Winutil

* add Godot Engine to applications.json (#1933)

Added Godot Engine (https://godotengine.org/).

Godot Engine is a free, open-source 2D and 3D game engine with a focus on usability and flexibility.

* Compile Winutil

* Add GitKraken Client (#1927)

Adds development utility client for git repository management

* Compile Winutil

* Simplified Admin Check and Added Code Comments (#1938)

- Simplified the admin check by filtering the "WindowsIdentity" class for owner value and comparing against admin value
- Removed the need for an if admin check by moving its commands under the if not admin check.
- Added code comments

* Compile Winutil

* Main window handle (#1941)

Condition is comparing $proc.Id with [System.IntPtr]::Zero. The Id property is an integer, representing the process ID, and it's not directly related to window handles.
Instead, you should compare the MainWindowHandle property against [System.IntPtr]::Zero

* Compile Winutil

* Add SMPlayer to `applications.json` (#1948)

* Add SMPlayer to `applications.json`

* Fix formatting

---------

Co-authored-by: Chris Titus <contact@christitus.com>

* Compile Winutil

* Adobe Network Blocking / Adobe Debloater / Tweak Fixes & more (#1954)

* Added Applications

AFFiNE: Open source Notion alternative with selfhostable option for syncing.

Wazuh Agent: Adgent for open-source security monitoring platform

* Change layout of toggles

Change the layout of the toggles to first show toggles and then the content (text).
- testet, works

* added snap related toggles

- disable snapping entirely (requires relogin of windows user)
- disable suggestion to snap other windows next to the snapped window

-tested

* Layouted Checkboxes, redesigned Toggles & renamed RDCMan

- Removed text inside toggle as it can be confusing because it sais "enable" while enabled and "disable" if disabled. The coloring should be enough to know in what state that setting is.
- without the text i could make it a little bit smaller while still letting it look good.
- Renamed "Remote Desktop Connection Manager (RDCMan)" to "RDCMan" because that name is shorter and also mostly used by the linked site.
- layouted checkboxes so they are not more left than the title and look tidy.

- tested

* Disable Acrobat auto-updates

- added script & undoscript to disable automatic downloads & installation of acrobat reader. The user gets a notified if there is an update available. I put some info to that inside the code

* edited AFFiNE description

* Tweak Adobe Debloater

-disable Adobe Desktop Service by getting ownership and renaming it.
- added AGMService service
- disable AGMService and AGSService entirely

* Block Adobe Network, Debloat Adobe & Compile

- fixes order of tweaks to always run "WPFTweaksRestorePoint" first. Before it was only the case because if was one of the first letter0s of the alphabet
- Fixed some stuff at Debloat Adobe & added Adobe Reader update stopper & "deactivated" Adobe Desktop Service.
- Added Blocking of Adobe Servers (as of your suggestion) to it's own Tweak.
- ran compile for testing & showing

* undo compilation

* added Note to AcrobatUpdates Management in Tweak "Debloat Adobe"

* Fix Right Click Method to use accurate names

* fixed my mistake in README

---------

Co-authored-by: Chris Titus <contact@christitus.com>

* Compile Winutil

* Install flow rework (#1961)

* Install flow rework
Sperated Winget and Chocolatey setps when installing software add skip them when not needed

* fix uninstall

---------

Co-authored-by: Chris Titus <contact@christitus.com>

* Compile Winutil

* Made disabling Fullscreen optimizations its own tweak (#1934)

* Removed "GameDVR_DXGIHonorFSEWindowsCompatible" modification from "Disable GameDVR" tweak
* Created advanced tweak "Disable fullscreen optimizations"
Disables fullscreen optimizations in all applications. (Which can cause problems with Color Management in Exclusive Fullscreen)

* Compile Winutil

* fix glaze

* Compile Winutil

* Fix Typo in the App Entry 'GlazeWM' in 'applications.json' File (#1958)

* Reorder Tweaks

* Fix ordering of Advanced Tweaks

* Compile Winutil

* Preset Update

* Organize Tweaks

* Compile Winutil

* Add the pixi package manager

* Add the pixi package manager

* Compile Winutil

* Add Arc Browser to the application list.

* Add Arc Browser to the application list.

* Compile Winutil

* Update applications.json - Added NDI toolsNDI, or Network Device Interface, is developed by Newtek. It enables the encoding, transmission, and reception of high-quality, low latency, video and audio over IP.https://ndi.video/Apologies if I'm not doing this right. I have zero experience using Github.

* Update applications.json - Added NDI tools

NDI, or Network Device Interface, is developed by Newtek. It enables the encoding, transmission, and reception of high-quality, low latency, video and audio over IP.

https://ndi.video/

Apologies if I'm not doing this right. I have zero experience using Github.

* Compile Winutil

* docs: minor spellchecking

* docs: minor spellchecking

* Fix scratch textbox bug

* Fix scratch textbox bug

* Fixing Microwin, no more errors and it creats image now without issues

* Compile Winutil

* Tweaks page overhaul:

* Toggle page overhaul:
* Modern toggles
+ Tweak: Disable Copilot
+ Tweak: Set hibernation to default (fix issue
  https://github.com/ChrisTitusTech/winutil/issues/1399)

* Merge branch 'test-2024-04-20-2' into TweaksToggles

* Compile Winutil

* Able to set the Default Terminal to Powershell 7 in Windows Terminal

* Run winget in open powershell window if possible and handle update

* add return code reference

* Seperated Logic for PS7 Profile change

* Add tweak

* Revert changes to last commit in Christitus Repo

* Merge pull request #1 from Marterich/PS7profile

Split Logic in different Script, Re-Add files with to reflect Chris's Repo

* Compile Winutil

* Update tweaks.json

* Compile Winutil

* Update tweaks.json

* Compile Winutil

* disables to disable

* Compile Winutil

* Update applications.json - Files, ditto, spotube, sagethumbs added & file converter choco variable fixed (#1996)

Added Files, ditto, spotube and sagethumbs.

Fixed File Converted by Adrien Allard with proper Choco variable.
"files">"file-conveter"
	"WPFInstallfileconverter": {
		"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.",
		"link": "https://file-converter.io/",
		"winget": "AdrienAllard.FileConverter"

* Compile Winutil

* Winget install return code handling & Window management (#1992)

* Run winget in open powershell window if possible and handle update

* add return code reference

* Compile Winutil

* Fix typo (#1965)

Co-authored-by: Chris Titus <contact@christitus.com>

* Change voicemeeter URL to their newer site (#1967)

* Compile Winutil

* Change voicemeeter URL to newest site

* Compile Winutil

---------

Co-authored-by: Yuuh15 <Yuuh15@users.noreply.github.com>
Co-authored-by: Chris Titus <contact@christitus.com>

* Removed broken winget from applications.json (#1968)

The winget does not work for vencord. The installer downloads and then fails. (#1515)

* Compile Winutil

* Optimize Display Behaviour of Category Labels  (#1979)

* Hide Category title if empty

* Changed labels to a hashtable for faster access

* Extract WPFNamecreation to function, fix hide all if none match

* Compile Winutil

* ps1 ext add

* Update oosu10 config files and ad missing fileextension (#1980)

Co-authored-by: Chris Titus <contact@christitus.com>

* Compile Winutil

* Fix fallback bug and merge choco uninstall rework (#1962)

* Implement Uninstall Command for Chocolatey, and Made a Starting Point on the Automatic Upgrade when a Package is Already Installed, similar to WinGet Install Command

* Add Extra Guards/Checks in 'Install-WinUtilProgramChoco' Private Function

* Fix fallback bug and merge choco uninstall rework

 - fixed return from wrong return from winget install
   Install-WinUtilProgramWinget
 - syntax/wording cleenup in Install-WinUtilProgramWinget

 - fix bugs in ty802/winutil#1 after merge

---------

Co-authored-by: Mr.k <mineshtine28546271@gmail.com>
Co-authored-by: Chris Titus <contact@christitus.com>

* Compile Winutil

* Update applications.json (#1976)

added qgis in right format

Co-authored-by: Chris Titus <contact@christitus.com>

* Compile Winutil

* fix sagethumbs error

* Compile Winutil

---------

Co-authored-by: Mr.k <mineshtine28546271@gmail.com>
Co-authored-by: ChrisTitusTech <ChrisTitusTech@users.noreply.github.com>
Co-authored-by: Melloni <66322451+MelloniDev@users.noreply.github.com>
Co-authored-by: Justawildwolf <62820836+blusewill@users.noreply.github.com>
Co-authored-by: MyDrift <personal@mdiana.ch>
Co-authored-by: ModernTTY <165050080+ModernTTY@users.noreply.github.com>
Co-authored-by: Kasim <kasim@rafique.co.uk>
Co-authored-by: trenton4k <trenton4k@gmail.com>
Co-authored-by: Evan Galvin <evan.galvin@blissroms.org>
Co-authored-by: CodingWonders <101426328+CodingWonders@users.noreply.github.com>
Co-authored-by: misspent <78914154+misspent@users.noreply.github.com>
Co-authored-by: Federico Pulcino <78621373+FedeP14@users.noreply.github.com>
Co-authored-by: kian yamamoto <kiany@thatnameisnotavailable.com>
Co-authored-by: ty802 <ty802@users.noreply.github.com>
Co-authored-by: Callum Carmicheal <callumcarmicheal@gmail.com>
Co-authored-by: Rux <jonathan.e.rux@ruxunderscore.com>
Co-authored-by: Martin Wiethan <47688561+Marterich@users.noreply.github.com>
Co-authored-by: Andrew <121936658+7gxycn08@users.noreply.github.com>
Co-authored-by: Jelle <89023848+mrjbongo@users.noreply.github.com>
Co-authored-by: Marc Brooks <IDisposable@gmail.com>
Co-authored-by: Hayden Plumley <mrhaydendp@gmail.com>
Co-authored-by: Berrick Werkman <105836264+BKlaasWerkman@users.noreply.github.com>
Co-authored-by: o-iu <168581616+o-iu@users.noreply.github.com>
Co-authored-by: Luadih <50816896+Luadih@users.noreply.github.com>
Co-authored-by: Morten Enemark Lund <melund@gmail.com>
Co-authored-by: Pleș Alexandru <34649178+plesalex100@users.noreply.github.com>
Co-authored-by: tvrepairguy <170785918+tvrepairguy@users.noreply.github.com>
Co-authored-by: LazyStability <Klysmus@online.de>
Co-authored-by: KonTy <9524513+KonTy@users.noreply.github.com>
Co-authored-by: drabspirit <39843622+drabspirit@users.noreply.github.com>
Co-authored-by: Yuri Gabriel <97139700+Yuuh15@users.noreply.github.com>
Co-authored-by: Yuuh15 <Yuuh15@users.noreply.github.com>
Co-authored-by: Owen <78411938+Owen-3456@users.noreply.github.com>
Co-authored-by: Snoep <128747388+SnoepNFTs@users.noreply.github.com>
2024-06-04 22:27:27 -05:00

481 lines
23 KiB
PowerShell

function Invoke-WPFMicrowin {
<#
.DESCRIPTION
Invoke MicroWin routines...
#>
if($sync.ProcessRunning) {
$msg = "GetIso process is currently running."
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
return
}
# Define the constants for Windows API
Add-Type @"
using System;
using System.Runtime.InteropServices;
public class PowerManagement {
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags);
[FlagsAttribute]
public enum EXECUTION_STATE : uint {
ES_SYSTEM_REQUIRED = 0x00000001,
ES_DISPLAY_REQUIRED = 0x00000002,
ES_CONTINUOUS = 0x80000000,
}
}
"@
# Prevent the machine from sleeping
[PowerManagement]::SetThreadExecutionState([PowerManagement]::EXECUTION_STATE::ES_CONTINUOUS -bor [PowerManagement]::EXECUTION_STATE::ES_SYSTEM_REQUIRED -bor [PowerManagement]::EXECUTION_STATE::ES_DISPLAY_REQUIRED)
# Ask the user where to save the file
$SaveDialog = New-Object System.Windows.Forms.SaveFileDialog
$SaveDialog.InitialDirectory = [Environment]::GetFolderPath('Desktop')
$SaveDialog.Filter = "ISO images (*.iso)|*.iso"
$SaveDialog.ShowDialog() | Out-Null
if ($SaveDialog.FileName -eq "") {
Write-Host "No file name for the target image was specified"
return
}
Write-Host "Target ISO location: $($SaveDialog.FileName)"
$index = $sync.MicrowinWindowsFlavors.SelectedValue.Split(":")[0].Trim()
Write-Host "Index chosen: '$index' from $($sync.MicrowinWindowsFlavors.SelectedValue)"
$keepPackages = $sync.WPFMicrowinKeepProvisionedPackages.IsChecked
$keepProvisionedPackages = $sync.WPFMicrowinKeepAppxPackages.IsChecked
$keepDefender = $sync.WPFMicrowinKeepDefender.IsChecked
$keepEdge = $sync.WPFMicrowinKeepEdge.IsChecked
$copyToUSB = $sync.WPFMicrowinCopyToUsb.IsChecked
$injectDrivers = $sync.MicrowinInjectDrivers.IsChecked
$importDrivers = $sync.MicrowinImportDrivers.IsChecked
$mountDir = $sync.MicrowinMountDir.Text
$scratchDir = $sync.MicrowinScratchDir.Text
# Detect if the Windows image is an ESD file and convert it to WIM
if (-not (Test-Path -Path $mountDir\sources\install.wim -PathType Leaf) -and (Test-Path -Path $mountDir\sources\install.esd -PathType Leaf))
{
Write-Host "Exporting Windows image to a WIM file, keeping the index we want to work on. This can take several minutes, depending on the performance of your computer..."
Export-WindowsImage -SourceImagePath $mountDir\sources\install.esd -SourceIndex $index -DestinationImagePath $mountDir\sources\install.wim -CompressionType "Max"
if ($?)
{
Remove-Item -Path $mountDir\sources\install.esd -Force
# Since we've already exported the image index we wanted, switch to the first one
$index = 1
}
else
{
$msg = "The export process has failed and MicroWin processing cannot continue"
Write-Host "Failed to export the image"
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Error)
return
}
}
$imgVersion = (Get-WindowsImage -ImagePath $mountDir\sources\install.wim -Index $index).Version
# Detect image version to avoid performing MicroWin processing on Windows 8 and earlier
if ((Test-CompatibleImage $imgVersion $([System.Version]::new(10,0,10240,0))) -eq $false)
{
$msg = "This image is not compatible with MicroWin processing. Make sure it isn't a Windows 8 or earlier image."
$dlg_msg = $msg + "`n`nIf you want more information, the version of the image selected is $($imgVersion)`n`nIf an image has been incorrectly marked as incompatible, report an issue to the developers."
Write-Host $msg
[System.Windows.MessageBox]::Show($dlg_msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Exclamation)
return
}
$mountDirExists = Test-Path $mountDir
$scratchDirExists = Test-Path $scratchDir
if (-not $mountDirExists -or -not $scratchDirExists)
{
Write-Error "Required directories '$mountDirExists' '$scratchDirExists' and do not exist."
return
}
try {
Write-Host "Mounting Windows image. This may take a while."
Mount-WindowsImage -ImagePath "$mountDir\sources\install.wim" -Index $index -Path "$scratchDir"
if ($?)
{
Write-Host "Mounting complete! Performing removal of applications..."
}
else
{
Write-Host "Could not mount image. Exiting..."
return
}
if ($importDrivers)
{
Write-Host "Exporting drivers from active installation..."
if (Test-Path "$env:TEMP\DRV_EXPORT")
{
Remove-Item "$env:TEMP\DRV_EXPORT" -Recurse -Force
}
if (($injectDrivers -and (Test-Path $sync.MicrowinDriverLocation.Text)))
{
Write-Host "Using specified driver source..."
dism /english /online /export-driver /destination="$($sync.MicrowinDriverLocation.Text)" | Out-Host
if ($?)
{
# Don't add exported drivers yet, that is run later
Write-Host "Drivers have been exported successfully."
}
else
{
Write-Host "Failed to export drivers."
}
}
else
{
New-Item -Path "$env:TEMP\DRV_EXPORT" -ItemType Directory -Force
dism /english /online /export-driver /destination="$env:TEMP\DRV_EXPORT" | Out-Host
if ($?)
{
Write-Host "Adding exported drivers..."
dism /english /image="$scratchDir" /add-driver /driver="$env:TEMP\DRV_EXPORT" /recurse | Out-Host
}
else
{
Write-Host "Failed to export drivers. Continuing without importing them..."
}
if (Test-Path "$env:TEMP\DRV_EXPORT")
{
Remove-Item "$env:TEMP\DRV_EXPORT" -Recurse -Force
}
}
}
if ($injectDrivers)
{
$driverPath = $sync.MicrowinDriverLocation.Text
if (Test-Path $driverPath)
{
Write-Host "Adding Windows Drivers image($scratchDir) drivers($driverPath) "
dism /English /image:$scratchDir /add-driver /driver:$driverPath /recurse | Out-Host
}
else
{
Write-Host "Path to drivers is invalid continuing without driver injection"
}
}
Write-Host "Remove Features from the image"
Remove-Features -keepDefender:$keepDefender
Write-Host "Removing features complete!"
Write-Host "Removing Appx Bloat"
if (!$keepPackages)
{
Remove-Packages
}
if (!$keepProvisionedPackages)
{
Remove-ProvisionedPackages -keepSecurity:$keepDefender
}
# special code, for some reason when you try to delete some inbox apps
# we have to get and delete log files directory.
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\LogFiles\WMI\RtBackup" -Directory
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\WebThreatDefSvc" -Directory
# Defender is hidden in 2 places we removed a feature above now need to remove it from the disk
if (!$keepDefender)
{
Write-Host "Removing Defender"
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Windows Defender" -Directory
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Windows Defender"
}
if (!$keepEdge)
{
Write-Host "Removing Edge"
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Microsoft" -mask "*edge*" -Directory
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Microsoft" -mask "*edge*" -Directory
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\SystemApps" -mask "*edge*" -Directory
}
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\DiagTrack" -Directory
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\InboxApps" -Directory
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\SecurityHealthSystray.exe"
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\LocationNotificationWindows.exe"
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Windows Photo Viewer" -Directory
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Windows Photo Viewer" -Directory
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Windows Media Player" -Directory
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Windows Media Player" -Directory
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Windows Mail" -Directory
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Windows Mail" -Directory
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Internet Explorer" -Directory
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Internet Explorer" -Directory
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\GameBarPresenceWriter"
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\OneDriveSetup.exe"
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\OneDrive.ico"
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\SystemApps" -mask "*Windows.Search*" -Directory
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\SystemApps" -mask "*narratorquickstart*" -Directory
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\SystemApps" -mask "*Xbox*" -Directory
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\SystemApps" -mask "*ParentalControls*" -Directory
Write-Host "Removal complete!"
Write-Host "Create unattend.xml"
New-Unattend
Write-Host "Done Create unattend.xml"
Write-Host "Copy unattend.xml file into the ISO"
New-Item -ItemType Directory -Force -Path "$($scratchDir)\Windows\Panther"
Copy-Item "$env:temp\unattend.xml" "$($scratchDir)\Windows\Panther\unattend.xml" -force
New-Item -ItemType Directory -Force -Path "$($scratchDir)\Windows\System32\Sysprep"
Copy-Item "$env:temp\unattend.xml" "$($scratchDir)\Windows\System32\Sysprep\unattend.xml" -force
Copy-Item "$env:temp\unattend.xml" "$($scratchDir)\unattend.xml" -force
Write-Host "Done Copy unattend.xml"
Write-Host "Create FirstRun"
New-FirstRun
Write-Host "Done create FirstRun"
Write-Host "Copy FirstRun.ps1 into the ISO"
Copy-Item "$env:temp\FirstStartup.ps1" "$($scratchDir)\Windows\FirstStartup.ps1" -force
Write-Host "Done copy FirstRun.ps1"
Write-Host "Copy link to winutil.ps1 into the ISO"
$desktopDir = "$($scratchDir)\Windows\Users\Default\Desktop"
New-Item -ItemType Directory -Force -Path "$desktopDir"
dism /English /image:$($scratchDir) /set-profilepath:"$($scratchDir)\Windows\Users\Default"
# $command = "powershell.exe -NoProfile -ExecutionPolicy Bypass -Command 'irm https://christitus.com/win | iex'"
# $shortcutPath = "$desktopDir\WinUtil.lnk"
# $shell = New-Object -ComObject WScript.Shell
# $shortcut = $shell.CreateShortcut($shortcutPath)
# if (Test-Path -Path "$env:TEMP\cttlogo.png")
# {
# $pngPath = "$env:TEMP\cttlogo.png"
# $icoPath = "$env:TEMP\cttlogo.ico"
# ConvertTo-Icon -bitmapPath $pngPath -iconPath $icoPath
# Write-Host "ICO file created at: $icoPath"
# Copy-Item "$env:TEMP\cttlogo.png" "$($scratchDir)\Windows\cttlogo.png" -force
# Copy-Item "$env:TEMP\cttlogo.ico" "$($scratchDir)\Windows\cttlogo.ico" -force
# $shortcut.IconLocation = "c:\Windows\cttlogo.ico"
# }
# $shortcut.TargetPath = "powershell.exe"
# $shortcut.Arguments = "-NoProfile -ExecutionPolicy Bypass -Command `"$command`""
# $shortcut.Save()
# Write-Host "Shortcut to winutil created at: $shortcutPath"
# *************************** Automation black ***************************
Write-Host "Copy checkinstall.cmd into the ISO"
New-CheckInstall
Copy-Item "$env:temp\checkinstall.cmd" "$($scratchDir)\Windows\checkinstall.cmd" -force
Write-Host "Done copy checkinstall.cmd"
Write-Host "Creating a directory that allows to bypass Wifi setup"
New-Item -ItemType Directory -Force -Path "$($scratchDir)\Windows\System32\OOBE\BYPASSNRO"
Write-Host "Loading registry"
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"
Write-Host "Disabling Teams"
reg add "HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\Communications" /v "ConfigureChatAutoInstall" /t REG_DWORD /d 0 /f >$null 2>&1
reg add "HKLM\zSOFTWARE\Policies\Microsoft\Windows\Windows Chat" /v ChatIcon /t REG_DWORD /d 2 /f >$null 2>&1
reg add "HKLM\zNTUSER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "TaskbarMn" /t REG_DWORD /d 0 /f >$null 2>&1
reg query "HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\Communications" /v "ConfigureChatAutoInstall" >$null 2>&1
# Write-Host Error code $LASTEXITCODE
Write-Host "Done disabling Teams"
Write-Host "Bypassing system requirements (system image)"
reg add "HKLM\zDEFAULT\Control Panel\UnsupportedHardwareNotificationCache" /v "SV1" /t REG_DWORD /d 0 /f
reg add "HKLM\zDEFAULT\Control Panel\UnsupportedHardwareNotificationCache" /v "SV2" /t REG_DWORD /d 0 /f
reg add "HKLM\zNTUSER\Control Panel\UnsupportedHardwareNotificationCache" /v "SV1" /t REG_DWORD /d 0 /f
reg add "HKLM\zNTUSER\Control Panel\UnsupportedHardwareNotificationCache" /v "SV2" /t REG_DWORD /d 0 /f
reg add "HKLM\zSYSTEM\Setup\LabConfig" /v "BypassCPUCheck" /t REG_DWORD /d 1 /f
reg add "HKLM\zSYSTEM\Setup\LabConfig" /v "BypassRAMCheck" /t REG_DWORD /d 1 /f
reg add "HKLM\zSYSTEM\Setup\LabConfig" /v "BypassSecureBootCheck" /t REG_DWORD /d 1 /f
reg add "HKLM\zSYSTEM\Setup\LabConfig" /v "BypassStorageCheck" /t REG_DWORD /d 1 /f
reg add "HKLM\zSYSTEM\Setup\LabConfig" /v "BypassTPMCheck" /t REG_DWORD /d 1 /f
reg add "HKLM\zSYSTEM\Setup\MoSetup" /v "AllowUpgradesWithUnsupportedTPMOrCPU" /t REG_DWORD /d 1 /f
if (!$keepEdge)
{
Write-Host "Removing Edge icon from taskbar"
reg delete "HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Taskband" /v "Favorites" /f >$null 2>&1
reg delete "HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Taskband" /v "FavoritesChanges" /f >$null 2>&1
reg delete "HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Taskband" /v "Pinned" /f >$null 2>&1
reg delete "HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Taskband" /v "LayoutCycle" /f >$null 2>&1
Write-Host "Edge icon removed from taskbar"
}
reg add "HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\Search" /v "SearchboxTaskbarMode" /t REG_DWORD /d 0 /f
Write-Host "Setting all services to start manually"
reg add "HKLM\zSOFTWARE\CurrentControlSet\Services" /v Start /t REG_DWORD /d 3 /f
# Write-Host $LASTEXITCODE
Write-Host "Enabling Local Accounts on OOBE"
reg add "HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\OOBE" /v "BypassNRO" /t REG_DWORD /d "1" /f
Write-Host "Disabling Sponsored Apps"
reg add "HKLM\zNTUSER\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "OemPreInstalledAppsEnabled" /t REG_DWORD /d 0 /f
reg add "HKLM\zNTUSER\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "PreInstalledAppsEnabled" /t REG_DWORD /d 0 /f
reg add "HKLM\zNTUSER\SOFTWARE\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SilentInstalledAppsEnabled" /t REG_DWORD /d 0 /f
reg add "HKLM\zSOFTWARE\Policies\Microsoft\Windows\CloudContent" /v "DisableWindowsConsumerFeatures" /t REG_DWORD /d 1 /f
reg add "HKLM\zSOFTWARE\Microsoft\PolicyManager\current\device\Start" /v "ConfigureStartPins" /t REG_SZ /d '{\"pinnedList\": [{}]}' /f
Write-Host "Done removing Sponsored Apps"
Write-Host "Disabling Reserved Storage"
reg add "HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\ReserveManager" /v "ShippedWithReserves" /t REG_DWORD /d 0 /f
Write-Host "Changing theme to dark. This only works on Activated Windows"
reg add "HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize" /v "AppsUseLightTheme" /t REG_DWORD /d 0 /f
reg add "HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize" /v "SystemUsesLightTheme" /t REG_DWORD /d 0 /f
} catch {
Write-Error "An unexpected error occurred: $_"
} finally {
Write-Host "Unmounting Registry..."
reg unload HKLM\zCOMPONENTS
reg unload HKLM\zDEFAULT
reg unload HKLM\zNTUSER
reg unload HKLM\zSOFTWARE
reg unload HKLM\zSYSTEM
Write-Host "Cleaning up image..."
dism /English /image:$scratchDir /Cleanup-Image /StartComponentCleanup /ResetBase
Write-Host "Cleanup complete."
Write-Host "Unmounting image..."
Dismount-WindowsImage -Path $scratchDir -Save
}
try {
Write-Host "Exporting image into $mountDir\sources\install2.wim"
Export-WindowsImage -SourceImagePath "$mountDir\sources\install.wim" -SourceIndex $index -DestinationImagePath "$mountDir\sources\install2.wim" -CompressionType "Max"
Write-Host "Remove old '$mountDir\sources\install.wim' and rename $mountDir\sources\install2.wim"
Remove-Item "$mountDir\sources\install.wim"
Rename-Item "$mountDir\sources\install2.wim" "$mountDir\sources\install.wim"
if (-not (Test-Path -Path "$mountDir\sources\install.wim"))
{
Write-Error "Something went wrong and '$mountDir\sources\install.wim' doesn't exist. Please report this bug to the devs"
return
}
Write-Host "Windows image completed. Continuing with boot.wim."
# Next step boot image
Write-Host "Mounting boot image $mountDir\sources\boot.wim into $scratchDir"
Mount-WindowsImage -ImagePath "$mountDir\sources\boot.wim" -Index 2 -Path "$scratchDir"
if ($injectDrivers)
{
$driverPath = $sync.MicrowinDriverLocation.Text
if (Test-Path $driverPath)
{
Write-Host "Adding Windows Drivers image($scratchDir) drivers($driverPath) "
dism /English /image:$scratchDir /add-driver /driver:$driverPath /recurse | Out-Host
}
else
{
Write-Host "Path to drivers is invalid continuing without driver injection"
}
}
Write-Host "Loading registry..."
reg load HKLM\zCOMPONENTS "$($scratchDir)\Windows\System32\config\COMPONENTS" >$null
reg load HKLM\zDEFAULT "$($scratchDir)\Windows\System32\config\default" >$null
reg load HKLM\zNTUSER "$($scratchDir)\Users\Default\ntuser.dat" >$null
reg load HKLM\zSOFTWARE "$($scratchDir)\Windows\System32\config\SOFTWARE" >$null
reg load HKLM\zSYSTEM "$($scratchDir)\Windows\System32\config\SYSTEM" >$null
Write-Host "Bypassing system requirements on the setup image"
reg add "HKLM\zDEFAULT\Control Panel\UnsupportedHardwareNotificationCache" /v "SV1" /t REG_DWORD /d 0 /f
reg add "HKLM\zDEFAULT\Control Panel\UnsupportedHardwareNotificationCache" /v "SV2" /t REG_DWORD /d 0 /f
reg add "HKLM\zNTUSER\Control Panel\UnsupportedHardwareNotificationCache" /v "SV1" /t REG_DWORD /d 0 /f
reg add "HKLM\zNTUSER\Control Panel\UnsupportedHardwareNotificationCache" /v "SV2" /t REG_DWORD /d 0 /f
reg add "HKLM\zSYSTEM\Setup\LabConfig" /v "BypassCPUCheck" /t REG_DWORD /d 1 /f
reg add "HKLM\zSYSTEM\Setup\LabConfig" /v "BypassRAMCheck" /t REG_DWORD /d 1 /f
reg add "HKLM\zSYSTEM\Setup\LabConfig" /v "BypassSecureBootCheck" /t REG_DWORD /d 1 /f
reg add "HKLM\zSYSTEM\Setup\LabConfig" /v "BypassStorageCheck" /t REG_DWORD /d 1 /f
reg add "HKLM\zSYSTEM\Setup\LabConfig" /v "BypassTPMCheck" /t REG_DWORD /d 1 /f
reg add "HKLM\zSYSTEM\Setup\MoSetup" /v "AllowUpgradesWithUnsupportedTPMOrCPU" /t REG_DWORD /d 1 /f
# Fix Computer Restarted Unexpectedly Error on New Bare Metal Install
reg add "HKLM\zSYSTEM\Setup\Status\ChildCompletion" /v "setup.exe" /t REG_DWORD /d 3 /f
} catch {
Write-Error "An unexpected error occurred: $_"
} finally {
Write-Host "Unmounting Registry..."
reg unload HKLM\zCOMPONENTS
reg unload HKLM\zDEFAULT
reg unload HKLM\zNTUSER
reg unload HKLM\zSOFTWARE
reg unload HKLM\zSYSTEM
Write-Host "Unmounting image..."
Dismount-WindowsImage -Path $scratchDir -Save
Write-Host "Creating ISO image"
# if we downloaded oscdimg from github it will be in the temp directory so use it
# if it is not in temp it is part of ADK and is in global PATH so just set it to oscdimg.exe
$oscdimgPath = Join-Path $env:TEMP 'oscdimg.exe'
$oscdImgFound = Test-Path $oscdimgPath -PathType Leaf
if (!$oscdImgFound)
{
$oscdimgPath = "oscdimg.exe"
}
Write-Host "[INFO] Using oscdimg.exe from: $oscdimgPath"
#& oscdimg.exe -m -o -u2 -udfver102 -bootdata:2#p0,e,b$mountDir\boot\etfsboot.com#pEF,e,b$mountDir\efi\microsoft\boot\efisys.bin $mountDir $env:temp\microwin.iso
#Start-Process -FilePath $oscdimgPath -ArgumentList "-m -o -u2 -udfver102 -bootdata:2#p0,e,b$mountDir\boot\etfsboot.com#pEF,e,b$mountDir\efi\microsoft\boot\efisys.bin $mountDir $env:temp\microwin.iso" -NoNewWindow -Wait
#Start-Process -FilePath $oscdimgPath -ArgumentList '-m -o -u2 -udfver102 -bootdata:2#p0,e,b$mountDir\boot\etfsboot.com#pEF,e,b$mountDir\efi\microsoft\boot\efisys.bin $mountDir `"$($SaveDialog.FileName)`"' -NoNewWindow -Wait
$oscdimgProc = New-Object System.Diagnostics.Process
$oscdimgProc.StartInfo.FileName = $oscdimgPath
$oscdimgProc.StartInfo.Arguments = "-m -o -u2 -udfver102 -bootdata:2#p0,e,b$mountDir\boot\etfsboot.com#pEF,e,b$mountDir\efi\microsoft\boot\efisys.bin $mountDir `"$($SaveDialog.FileName)`""
$oscdimgProc.StartInfo.CreateNoWindow = $True
$oscdimgProc.StartInfo.WindowStyle = "Hidden"
$oscdimgProc.StartInfo.UseShellExecute = $False
$oscdimgProc.Start()
$oscdimgProc.WaitForExit()
if ($copyToUSB)
{
Write-Host "Copying target ISO to the USB drive"
#Copy-ToUSB("$env:temp\microwin.iso")
Copy-ToUSB("$($SaveDialog.FileName)")
if ($?) { Write-Host "Done Copying target ISO to USB drive!" } else { Write-Host "ISO copy failed." }
}
Write-Host " _____ "
Write-Host "(____ \ "
Write-Host " _ \ \ ___ ____ ____ "
Write-Host "| | | / _ \| _ \ / _ ) "
Write-Host "| |__/ / |_| | | | ( (/ / "
Write-Host "|_____/ \___/|_| |_|\____) "
# Check if the ISO was successfully created - CTT edit
if ($LASTEXITCODE -eq 0) {
Write-Host "`n`nPerforming Cleanup..."
Remove-Item -Recurse -Force "$($scratchDir)"
Remove-Item -Recurse -Force "$($mountDir)"
#$msg = "Done. ISO image is located here: $env:temp\microwin.iso"
$msg = "Done. ISO image is located here: $($SaveDialog.FileName)"
Write-Host $msg
[System.Windows.MessageBox]::Show($msg, "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Information)
} else {
Write-Host "ISO creation failed. The "$($mountDir)" directory has not been removed."
}
$sync.MicrowinOptionsPanel.Visibility = 'Collapsed'
#$sync.MicrowinFinalIsoLocation.Text = "$env:temp\microwin.iso"
$sync.MicrowinFinalIsoLocation.Text = "$($SaveDialog.FileName)"
# Allow the machine to sleep again (optional)
[PowerManagement]::SetThreadExecutionState(0)
$sync.ProcessRunning = $false
}
}