MicroWin Cleanup

This commit is contained in:
Chris Titus Tech 2024-08-13 12:04:09 -05:00
parent 0e85f20680
commit 35dfd847ab
3 changed files with 25 additions and 142 deletions

View File

@ -25,25 +25,22 @@ function Test-CompatibleImage() {
} }
} }
function Remove-Features([switch]$dumpFeatures = $false, [switch]$keepDefender = $false) { function Remove-Features() {
<# <#
.SYNOPSIS .SYNOPSIS
Removes certain features from ISO image Removes certain features from ISO image
.PARAMETER Name .PARAMETER Name
dumpFeatures - Dumps all features found in the ISO into a file called allfeaturesdump.txt. This file can be examined and used to decide what to remove. No Params
keepDefender - Should Defender be removed from the ISO?
.EXAMPLE .EXAMPLE
Remove-Features -keepDefender:$false Remove-Features
#> #>
try { try {
$featlist = (Get-WindowsOptionalFeature -Path $scratchDir).FeatureName $featlist = (Get-WindowsOptionalFeature -Path $scratchDir).FeatureName
if ($dumpFeatures) {
$featlist > allfeaturesdump.txt
}
$featlist = $featlist | Where-Object { $featlist = $featlist | Where-Object {
$_ -NotLike "*Defender*" -AND
$_ -NotLike "*Printing*" -AND $_ -NotLike "*Printing*" -AND
$_ -NotLike "*TelnetClient*" -AND $_ -NotLike "*TelnetClient*" -AND
$_ -NotLike "*PowerShell*" -AND $_ -NotLike "*PowerShell*" -AND
@ -52,8 +49,6 @@ function Remove-Features([switch]$dumpFeatures = $false, [switch]$keepDefender =
$_ -NotLike "*NFS*" $_ -NotLike "*NFS*"
} }
if ($keepDefender) { $featlist = $featlist | Where-Object { $_ -NotLike "*Defender*" }}
foreach($feature in $featlist) { foreach($feature in $featlist) {
$status = "Removing feature $feature" $status = "Removing feature $feature"
Write-Progress -Activity "Removing features" -Status $status -PercentComplete ($counter++/$featlist.Count*100) Write-Progress -Activity "Removing features" -Status $status -PercentComplete ($counter++/$featlist.Count*100)
@ -126,16 +121,16 @@ function Remove-Packages {
} }
} }
function Remove-ProvisionedPackages([switch]$keepSecurity = $false) { function Remove-ProvisionedPackages() {
<# <#
.SYNOPSIS .SYNOPSIS
Removes AppX packages from a Windows image during MicroWin processing Removes AppX packages from a Windows image during MicroWin processing
.PARAMETER Name .PARAMETER Name
keepSecurity - Boolean that determines whether to keep "Microsoft.SecHealthUI" (Windows Security) in the Windows image No Params
.EXAMPLE .EXAMPLE
Remove-ProvisionedPackages -keepSecurity:$false Remove-ProvisionedPackages
#> #>
$appxProvisionedPackages = Get-AppxProvisionedPackage -Path "$($scratchDir)" | Where-Object { $appxProvisionedPackages = Get-AppxProvisionedPackage -Path "$($scratchDir)" | Where-Object {
$_.PackageName -NotLike "*AppInstaller*" -AND $_.PackageName -NotLike "*AppInstaller*" -AND
@ -151,7 +146,7 @@ function Remove-ProvisionedPackages([switch]$keepSecurity = $false) {
} }
if ($?) { if ($?) {
if ($keepSecurity) { $appxProvisionedPackages = $appxProvisionedPackages | Where-Object { $_.PackageName -NotLike "*SecHealthUI*" }} $appxProvisionedPackages = $appxProvisionedPackages | Where-Object { $_.PackageName -NotLike "*SecHealthUI*" }
$counter = 0 $counter = 0
foreach ($appx in $appxProvisionedPackages) { foreach ($appx in $appxProvisionedPackages) {
$status = "Removing Provisioned $($appx.PackageName)" $status = "Removing Provisioned $($appx.PackageName)"
@ -164,9 +159,6 @@ function Remove-ProvisionedPackages([switch]$keepSecurity = $false) {
} }
} }
Write-Progress -Activity "Removing Provisioned Apps" -Status "Ready" -Completed Write-Progress -Activity "Removing Provisioned Apps" -Status "Ready" -Completed
} else {
Write-Host "Could not get Provisioned App information. Skipping process..."
}
} }
function Copy-ToUSB([string]$fileToCopy) { function Copy-ToUSB([string]$fileToCopy) {
@ -200,22 +192,6 @@ function Remove-FileOrDirectory([string]$pathToDelete, [string]$mask = "", [swit
$yesNo = Get-LocalizedYesNo $yesNo = Get-LocalizedYesNo
Write-Host "[INFO] In Your local takeown expects '$($yesNo[0])' as a Yes answer." Write-Host "[INFO] In Your local takeown expects '$($yesNo[0])' as a Yes answer."
# Specify the path to the directory
# $directoryPath = "$($scratchDir)\Windows\System32\LogFiles\WMI\RtBackup"
# takeown /a /r /d $yesNo[0] /f "$($directoryPath)" > $null
# icacls "$($directoryPath)" /q /c /t /reset > $null
# icacls $directoryPath /setowner "*S-1-5-32-544"
# icacls $directoryPath /grant "*S-1-5-32-544:(OI)(CI)F" /t /c /q
# Remove-Item -Path $directoryPath -Recurse -Force
# # Grant full control to BUILTIN\Administrators using icacls
# $directoryPath = "$($scratchDir)\Windows\System32\WebThreatDefSvc"
# takeown /a /r /d $yesNo[0] /f "$($directoryPath)" > $null
# icacls "$($directoryPath)" /q /c /t /reset > $null
# icacls $directoryPath /setowner "*S-1-5-32-544"
# icacls $directoryPath /grant "*S-1-5-32-544:(OI)(CI)F" /t /c /q
# Remove-Item -Path $directoryPath -Recurse -Force
$itemsToDelete = [System.Collections.ArrayList]::new() $itemsToDelete = [System.Collections.ArrayList]::new()
if ($mask -eq "") { if ($mask -eq "") {
@ -254,46 +230,6 @@ function Remove-FileOrDirectory([string]$pathToDelete, [string]$mask = "", [swit
function New-Unattend { function New-Unattend {
# later if we wont to remove even more bloat EU requires MS to remove everything from English(world)
# Below is an example how to do it we probably should create a drop down with common locals
# <settings pass="specialize">
# <!-- Specify English (World) locale -->
# <component name="Microsoft-Windows-International-Core" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
# <SetupUILanguage>
# <UILanguage>en-US</UILanguage>
# </SetupUILanguage>
# <InputLocale>en-US</InputLocale>
# <SystemLocale>en-US</SystemLocale>
# <UILanguage>en-US</UILanguage>
# <UserLocale>en-US</UserLocale>
# </component>
# </settings>
# <settings pass="oobeSystem">
# <!-- Specify English (World) locale -->
# <component name="Microsoft-Windows-International-Core" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
# <InputLocale>en-US</InputLocale>
# <SystemLocale>en-US</SystemLocale>
# <UILanguage>en-US</UILanguage>
# <UserLocale>en-US</UserLocale>
# </component>
# </settings>
# using here string to embedd unattend
# <RunSynchronousCommand wcm:action="add">
# <Order>1</Order>
# <Path>net user administrator /active:yes</Path>
# </RunSynchronousCommand>
# this section doesn't work in win10/????
# <settings pass="specialize">
# <component name="Microsoft-Windows-SQMApi" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
# <CEIPEnabled>0</CEIPEnabled>
# </component>
# <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
# <ConfigureChatAutoInstall>false</ConfigureChatAutoInstall>
# </component>
# </settings>
$unattend = @' $unattend = @'
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend" <unattend xmlns="urn:schemas-microsoft-com:unattend"

View File

@ -151,37 +151,15 @@ public class PowerManagement {
} }
Write-Host "Remove Features from the image" Write-Host "Remove Features from the image"
Remove-Features -keepDefender:$keepDefender Remove-Features
Write-Host "Removing features complete!" Write-Host "Removing features complete!"
if (!$keepPackages) {
Write-Host "Removing OS packages" Write-Host "Removing OS packages"
Remove-Packages Remove-Packages
}
if (!$keepProvisionedPackages) {
Write-Host "Removing Appx Bloat" Write-Host "Removing Appx Bloat"
Remove-ProvisionedPackages -keepSecurity:$keepDefender Remove-ProvisionedPackages
}
# 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\LogFiles\WMI\RtBackup" -Directory
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\WebThreatDefSvc" -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) {
# # this is destructive and might result in touching SystemApps is not recommended unless you going complete rogue on trimming edge and telemetry
# 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\DiagTrack" -Directory
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\InboxApps" -Directory Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\InboxApps" -Directory
Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\SecurityHealthSystray.exe" Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\SecurityHealthSystray.exe"
@ -226,28 +204,6 @@ public class PowerManagement {
New-Item -ItemType Directory -Force -Path "$desktopDir" New-Item -ItemType Directory -Force -Path "$desktopDir"
dism /English /image:$($scratchDir) /set-profilepath:"$($scratchDir)\Windows\Users\Default" 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" Write-Host "Copy checkinstall.cmd into the ISO"
New-CheckInstall New-CheckInstall
Copy-Item "$env:temp\checkinstall.cmd" "$($scratchDir)\Windows\checkinstall.cmd" -force Copy-Item "$env:temp\checkinstall.cmd" "$($scratchDir)\Windows\checkinstall.cmd" -force

View File

@ -904,11 +904,6 @@
<StackPanel Name="MicrowinOptionsPanel" HorizontalAlignment="Left" SnapsToDevicePixels="True" Margin="1" Visibility="Hidden"> <StackPanel Name="MicrowinOptionsPanel" HorizontalAlignment="Left" SnapsToDevicePixels="True" Margin="1" Visibility="Hidden">
<TextBlock Margin="6" Padding="1" TextWrapping="Wrap">Choose Windows SKU</TextBlock> <TextBlock Margin="6" Padding="1" TextWrapping="Wrap">Choose Windows SKU</TextBlock>
<ComboBox x:Name = "MicrowinWindowsFlavors" Margin="1" /> <ComboBox x:Name = "MicrowinWindowsFlavors" Margin="1" />
<TextBlock Margin="6" Padding="1" TextWrapping="Wrap">Choose Windows features you want to remove from the ISO</TextBlock>
<CheckBox Name="WPFMicrowinKeepProvisionedPackages" Content="Keep Provisioned Packages" Margin="-10,5,0,0" ToolTip="Do not remove Microsoft Provisioned packages from the ISO."/>
<CheckBox Name="WPFMicrowinKeepAppxPackages" Content="Keep Appx Packages" Margin="-10,5,0,0" ToolTip="Do not remove Microsoft Appx packages from the ISO."/>
<CheckBox Name="WPFMicrowinKeepDefender" Content="Keep Defender" Margin="-10,5,0,0" IsChecked="True" ToolTip="Do not remove Microsoft Antivirus from the ISO."/>
<CheckBox Name="WPFMicrowinKeepEdge" Content="Keep Edge" Margin="-10,5,0,0" IsChecked="True" ToolTip="Do not remove Microsoft Edge from the ISO."/>
<Rectangle Fill="{MainForegroundColor}" Height="2" HorizontalAlignment="Stretch" Margin="0,10,0,10"/> <Rectangle Fill="{MainForegroundColor}" Height="2" HorizontalAlignment="Stretch" Margin="0,10,0,10"/>
<CheckBox Name="MicrowinInjectDrivers" Content="Inject drivers (I KNOW WHAT I'M DOING)" Margin="-10,5,0,0" IsChecked="False" ToolTip="Path to unpacked drivers all sys and inf files for devices that need drivers"/> <CheckBox Name="MicrowinInjectDrivers" Content="Inject drivers (I KNOW WHAT I'M DOING)" Margin="-10,5,0,0" IsChecked="False" ToolTip="Path to unpacked drivers all sys and inf files for devices that need drivers"/>
<TextBox Name="MicrowinDriverLocation" Background="Transparent" BorderThickness="1" BorderBrush="{MainForegroundColor}" <TextBox Name="MicrowinDriverLocation" Background="Transparent" BorderThickness="1" BorderBrush="{MainForegroundColor}"
@ -970,11 +965,8 @@
Foreground="{ComboBoxForegroundColor}"> Foreground="{ComboBoxForegroundColor}">
<Bold>MicroWin features:</Bold><LineBreak/> <Bold>MicroWin features:</Bold><LineBreak/>
- Remove Telemetry and Tracking <LineBreak/> - Remove Telemetry and Tracking <LineBreak/>
- Add ability to use local accounts <LineBreak/> - Fast Install using "User" local account <LineBreak/>
- Remove Wifi requirement to finish install <LineBreak/> - No internet requirement for install <LineBreak/>
- Ability to remove Edge <LineBreak/>
- Ability to remove Defender <LineBreak/>
- Remove Teams <LineBreak/>
- Apps debloat <LineBreak/> - Apps debloat <LineBreak/>
<LineBreak/> <LineBreak/>
<LineBreak/> <LineBreak/>
@ -988,7 +980,6 @@
- Click on the "Select Windows ISO" button and wait for WinUtil to process the image <LineBreak/> - Click on the "Select Windows ISO" button and wait for WinUtil to process the image <LineBreak/>
It will be processed and unpacked which may take some time <LineBreak/> It will be processed and unpacked which may take some time <LineBreak/>
- Once complete, choose which Windows flavor you want to base your image on <LineBreak/> - Once complete, choose which Windows flavor you want to base your image on <LineBreak/>
- Choose which features you want to keep <LineBreak/>
- Click the "Start Process" button <LineBreak/> - Click the "Start Process" button <LineBreak/>
The process of creating the Windows image may take some time, please check the console and wait for it to say "Done" <LineBreak/> The process of creating the Windows image may take some time, please check the console and wait for it to say "Done" <LineBreak/>
- Once complete, the target ISO file will be in the directory you have specified <LineBreak/> - Once complete, the target ISO file will be in the directory you have specified <LineBreak/>