diff --git a/functions/microwin/Invoke-Microwin.ps1 b/functions/microwin/Invoke-Microwin.ps1
index f5549283..4ec6e04b 100644
--- a/functions/microwin/Invoke-Microwin.ps1
+++ b/functions/microwin/Invoke-Microwin.ps1
@@ -58,6 +58,9 @@ public class PowerManagement {
$injectDrivers = $sync.MicrowinInjectDrivers.IsChecked
$importDrivers = $sync.MicrowinImportDrivers.IsChecked
+ $WPBT = $sync.MicroWinWPBT.IsChecked
+ $unsupported = $sync.MicroWinUnsupported.IsChecked
+
$importVirtIO = $sync.MicrowinCopyVirtIO.IsChecked
$mountDir = $sync.MicrowinMountDir.Text
@@ -66,7 +69,12 @@ public class PowerManagement {
# 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"
+ try {
+ Export-WindowsImage -SourceImagePath "$mountDir\sources\install.esd" -SourceIndex $index -DestinationImagePath "$mountDir\sources\install.wim" -CompressionType "Max"
+ } catch {
+ # Usually the case if it can't find unattend.dll on the host system. Guys, fix your corrupt messes that are your installations!
+ dism /english /export-image /sourceimagefile="$mountDir\sources\install.esd" /sourceindex=$index /destinationimagefile="$mountDir\sources\install.wim" /compress: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
@@ -166,6 +174,25 @@ public class PowerManagement {
}
}
+ if ($WPBT) {
+ Write-Host "Disabling WPBT Execution"
+ reg load HKLM\zSYSTEM "$($scratchDir)\Windows\System32\config\SYSTEM"
+ reg add "HKLM\zSYSTEM\ControlSet001\Control\Session Manager" /v DisableWpbtExecution /t REG_DWORD /d 1 /f
+ reg unload HKLM\zSYSTEM
+ }
+
+ if ($unsupported) {
+ Write-Host "Bypassing system requirements (locally)"
+ reg add "HKCU\Control Panel\UnsupportedHardwareNotificationCache" /v "SV1" /t REG_DWORD /d 0 /f
+ reg add "HKCU\Control Panel\UnsupportedHardwareNotificationCache" /v "SV2" /t REG_DWORD /d 0 /f
+ reg add "HKLM\SYSTEM\Setup\LabConfig" /v "BypassCPUCheck" /t REG_DWORD /d 1 /f
+ reg add "HKLM\SYSTEM\Setup\LabConfig" /v "BypassRAMCheck" /t REG_DWORD /d 1 /f
+ reg add "HKLM\SYSTEM\Setup\LabConfig" /v "BypassSecureBootCheck" /t REG_DWORD /d 1 /f
+ reg add "HKLM\SYSTEM\Setup\LabConfig" /v "BypassStorageCheck" /t REG_DWORD /d 1 /f
+ reg add "HKLM\SYSTEM\Setup\LabConfig" /v "BypassTPMCheck" /t REG_DWORD /d 1 /f
+ reg add "HKLM\SYSTEM\Setup\MoSetup" /v "AllowUpgradesWithUnsupportedTPMOrCPU" /t REG_DWORD /d 1 /f
+ }
+
if ($importVirtIO) {
Write-Host "Copying VirtIO drivers..."
Microwin-CopyVirtIO
@@ -221,6 +248,20 @@ public class PowerManagement {
Write-Host "Create unattend.xml"
+ if (($sync.MicrowinAutoConfigBox.Text -ne "") -and (Test-Path "$($sync.MicrowinAutoConfigBox.Text)"))
+ {
+ try
+ {
+ Write-Host "A configuration file has been specified. Copying to WIM file..."
+ Copy-Item "$($sync.MicrowinAutoConfigBox.Text)" "$($scratchDir)\winutil-config.json"
+ }
+ catch
+ {
+ Write-Host "The config file could not be copied. Continuing without it..."
+ }
+ }
+
+ # Create unattended answer file with user information - Check condition to learn more about this functionality
if ($sync.MicrowinUserName.Text -eq "")
{
Microwin-NewUnattend -userName "User"
@@ -242,7 +283,6 @@ public class PowerManagement {
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"
@@ -277,7 +317,6 @@ public class PowerManagement {
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 "Fix Windows Volume Mixer Issue"
@@ -304,11 +343,6 @@ public class PowerManagement {
'CrossDeviceUpdate'
) | ForEach-Object {
Write-Host "Removing Windows Expedited App: $_"
-
- # Copied here After Installation (Online)
- # reg delete "HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Orchestrator\UScheduler\$_" /f | Out-Null
-
- # When in Offline Image
reg delete "HKLM\zSOFTWARE\Microsoft\WindowsUpdate\Orchestrator\UScheduler_Oobe\$_" /f | Out-Null
}
}
@@ -316,7 +350,6 @@ public class PowerManagement {
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
@@ -371,7 +404,12 @@ public class PowerManagement {
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"
+ try {
+ Export-WindowsImage -SourceImagePath "$mountDir\sources\install.wim" -SourceIndex $index -DestinationImagePath "$mountDir\sources\install2.wim" -CompressionType "Max"
+ } catch {
+ # Usually the case if it can't find unattend.dll on the host system. Guys, fix your corrupt messes that are your installations!
+ dism /english /export-image /sourceimagefile="$mountDir\sources\install.wim" /sourceindex=$index /destinationimagefile="$mountDir\sources\install2.wim" /compress: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"
@@ -385,6 +423,20 @@ public class PowerManagement {
}
Write-Host "Windows image completed. Continuing with boot.wim."
+ $esd = $sync.MicroWinESD.IsChecked
+ if ($esd) {
+ Write-Host "Converting install image to ESD."
+ try {
+ Export-WindowsImage -SourceImagePath "$mountDir\sources\install.wim" -SourceIndex $index -DestinationImagePath "$mountDir\sources\install.esd" -CompressionType "Recovery"
+ Remove-Item "$mountDir\sources\install.wim"
+ Write-Host "Converted install image to ESD."
+ } catch {
+ Start-Process -FilePath "$env:SystemRoot\System32\dism.exe" -ArgumentList "/export-image /sourceimagefile:`"$mountDir\sources\install.wim`" /sourceindex:1 /destinationimagefile:`"$mountDir\sources\install.esd`" /compress:recovery" -Wait -NoNewWindow
+ Remove-Item "$mountDir\sources\install.wim"
+ Write-Host "Converted install image to ESD."
+ }
+ }
+
# 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"
@@ -481,6 +533,7 @@ public class PowerManagement {
Write-Host "Reason: $($exitCode.Message)"
Invoke-MicrowinBusyInfo -action "warning" -message $exitCode.Message
Set-WinUtilTaskbaritem -state "Error" -value 1 -overlay "warning"
+ [System.Windows.MessageBox]::Show("MicroWin failed to make the ISO.", "Winutil", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Error)
} catch {
# Could not get error description from Windows APIs
}
@@ -488,7 +541,6 @@ public class PowerManagement {
Toggle-MicrowinPanel 1
- #$sync.MicrowinFinalIsoLocation.Text = "$env:temp\microwin.iso"
$sync.MicrowinFinalIsoLocation.Text = "$($SaveDialog.FileName)"
# Allow the machine to sleep again (optional)
[PowerManagement]::SetThreadExecutionState(0)
diff --git a/functions/microwin/Microwin-NewFirstRun.ps1 b/functions/microwin/Microwin-NewFirstRun.ps1
index 1a329179..e836858f 100644
--- a/functions/microwin/Microwin-NewFirstRun.ps1
+++ b/functions/microwin/Microwin-NewFirstRun.ps1
@@ -85,6 +85,14 @@ function Microwin-NewFirstRun {
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Notifications\Settings\Windows.SystemToast.StartupApp" /v Enabled /t REG_DWORD /d 0 /f
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Notifications\Settings\Microsoft.SkyDrive.Desktop" /f
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Notifications\Settings\Microsoft.SkyDrive.Desktop" /v Enabled /t REG_DWORD /d 0 /f
+ reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Notifications\Settings\Windows.SystemToast.AccountHealth" /f
+ reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Notifications\Settings\Windows.SystemToast.AccountHealth" /v Enabled /t REG_DWORD /d 0 /f
+
+ if (Test-Path -Path "$env:HOMEDRIVE\winutil-config.json")
+ {
+ Write-Host "Configuration file detected. Applying..."
+ iex "& { $(irm christitus.com/win) } -Config `"$env:HOMEDRIVE\winutil-config.json`" -Run"
+ }
'@
$firstRun | Out-File -FilePath "$env:temp\FirstStartup.ps1" -Force
diff --git a/functions/public/Invoke-AutoConfigDialog.ps1 b/functions/public/Invoke-AutoConfigDialog.ps1
new file mode 100644
index 00000000..cc6cc2fa
--- /dev/null
+++ b/functions/public/Invoke-AutoConfigDialog.ps1
@@ -0,0 +1,24 @@
+function Invoke-AutoConfigDialog {
+
+ <#
+
+ .SYNOPSIS
+ Sets the automatic configuration file based on a specified JSON file
+
+ #>
+
+ [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null
+ $OFD = New-Object System.Windows.Forms.OpenFileDialog
+ $OFD.Filter = "JSON Files (*.json)|*.json"
+ $OFD.ShowDialog()
+
+ if (($OFD.FileName -eq "") -and ($sync.MicrowinAutoConfigBox.Text -eq ""))
+ {
+ Write-Host "No automatic config file has been selected. Continuing without one..."
+ return
+ }
+ elseif ($OFD.FileName -ne "")
+ {
+ $sync.MicrowinAutoConfigBox.Text = "$($OFD.FileName)"
+ }
+}
diff --git a/functions/public/Invoke-WPFButton.ps1 b/functions/public/Invoke-WPFButton.ps1
index a558ad72..e80775af 100644
--- a/functions/public/Invoke-WPFButton.ps1
+++ b/functions/public/Invoke-WPFButton.ps1
@@ -64,5 +64,6 @@ function Invoke-WPFButton {
"WPFWinUtilSSHServer" {Invoke-WPFSSHServer}
"WPFselectedAppsButton" {$sync.selectedAppsPopup.IsOpen = -not $sync.selectedAppsPopup.IsOpen}
"WPFMicrowinPanelBack" {Toggle-MicrowinPanel 1}
+ "MicrowinAutoConfigBtn" {Invoke-AutoConfigDialog}
}
}
diff --git a/scripts/main.ps1 b/scripts/main.ps1
index 731c40cb..ffaca97f 100644
--- a/scripts/main.ps1
+++ b/scripts/main.ps1
@@ -488,7 +488,7 @@ $sync["AboutMenuItem"].Add_Click({
Author : @christitustech
UI : @MyDrift-user, @Marterich
Runspace : @DeveloperDurp, @Marterich
-MicroWin : @KonTy, @CodingWonders
+MicroWin : @KonTy, @CodingWonders, @Real-MullaC
GitHub : ChrisTitusTech/winutil
Version : $($sync.version)
"@
diff --git a/xaml/inputXML.xaml b/xaml/inputXML.xaml
index 8719dc91..cf85b9e7 100644
--- a/xaml/inputXML.xaml
+++ b/xaml/inputXML.xaml
@@ -1459,6 +1459,37 @@
Foreground="{DynamicResource LabelboxForegroundColor}"
/>
+ Tweaks (leave empty for default settings)
+
+
+
+ WinUtil configuration file (JSON)
+
+
+
+
+
+
+
+
+
+
@@ -1527,7 +1558,7 @@
May take several minutes to process the ISO depending on your machine and connection
- Put it somewhere on the C:\ drive so it is easily accessible
- Launch WinUtil and MicroWin
- - Click on the "Select Windows ISO" button and wait for WinUtil to process the image
+ - Click on the "Get Windows ISO" button and wait for WinUtil to process the image
It will be processed and unpacked which may take some time
- Once complete, choose which Windows flavor you want to base your image on
- Click the "Start Process" button