diff --git a/config/autounattend.xml b/config/autounattend.xml
index 6a432641..a1daf403 100644
--- a/config/autounattend.xml
+++ b/config/autounattend.xml
@@ -113,7 +113,7 @@
19
- powershell.exe -NoProfile -Command "Get-Content -LiteralPath 'C:\Windows\Temp\remove-packages.ps1' -Raw | Invoke-Expression;"
+ powershell.exe -NoProfile -Command "Get-Content -LiteralPath 'C:\Windows\Temp\Microwin-RemovePackages.ps1' -Raw | Invoke-Expression;"
20
@@ -312,7 +312,7 @@ foreach( $file in $Document.unattend.Extensions.File ) {
[System.IO.File]::WriteAllBytes( $path, ( $encoding.GetPreamble() + $encoding.GetBytes( $file.InnerText.Trim() ) ) );
}
-
+
$selectors = @(
'Microsoft.Microsoft3DViewer';
'Microsoft.BingSearch';
@@ -359,7 +359,7 @@ $removeCommand = {
}
};
$type = 'Package';
-$logfile = 'C:\Windows\Temp\remove-packages.log';
+$logfile = 'C:\Windows\Temp\Microwin-RemovePackages.log';
& {
$installed = & $getCommand;
foreach( $selector in $selectors ) {
diff --git a/functions/public/Invoke-WPFMicrowin.ps1 b/functions/microwin/Invoke-Microwin.ps1
similarity index 89%
rename from functions/public/Invoke-WPFMicrowin.ps1
rename to functions/microwin/Invoke-Microwin.ps1
index 966d6a07..4151a3d1 100644
--- a/functions/public/Invoke-WPFMicrowin.ps1
+++ b/functions/microwin/Invoke-Microwin.ps1
@@ -1,4 +1,4 @@
-function Invoke-WPFMicrowin {
+function Invoke-Microwin {
<#
.DESCRIPTION
Invoke MicroWin routines...
@@ -78,7 +78,7 @@ public class PowerManagement {
$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) {
+ if ((Microwin-TestCompatibleImage $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
@@ -88,7 +88,7 @@ public class PowerManagement {
}
# Detect whether the image to process contains Windows 10 and show warning
- if ((Test-CompatibleImage $imgVersion $([System.Version]::new(10,0,21996,1))) -eq $false) {
+ if ((Microwin-TestCompatibleImage $imgVersion $([System.Version]::new(10,0,21996,1))) -eq $false) {
$msg = "Windows 10 has been detected in the image you want to process. While you can continue, Windows 10 is not a recommended target for MicroWin, and you may not get the full experience."
$dlg_msg = $msg
Write-Host $msg
@@ -155,28 +155,22 @@ public class PowerManagement {
}
Write-Host "Remove Features from the image"
- Remove-Features
+ Microwin-RemoveFeatures
Write-Host "Removing features complete!"
Write-Host "Removing OS packages"
- Remove-Packages
+ Microwin-RemovePackages
Write-Host "Removing Appx Bloat"
- Remove-ProvisionedPackages
+ Microwin-RemoveProvisionedPackages
# Detect Windows 11 24H2 and add dependency to FileExp to prevent Explorer look from going back - thanks @WitherOrNot and @thecatontheceiling
- if ((Test-CompatibleImage $imgVersion $([System.Version]::new(10,0,26100,1))) -eq $true)
- {
- try
- {
- if (Test-Path "$scratchDir\Windows\SystemApps\MicrosoftWindows.Client.FileExp_cw5n1h2txyewy\appxmanifest.xml" -PathType Leaf)
- {
+ if ((Test-CompatibleImage $imgVersion $([System.Version]::new(10,0,26100,1))) -eq $true) {
+ try {
+ if (Test-Path "$scratchDir\Windows\SystemApps\MicrosoftWindows.Client.FileExp_cw5n1h2txyewy\appxmanifest.xml" -PathType Leaf) {
# Found the culprit. Do the following:
-
# 1. Take ownership of the file, from TrustedInstaller to Administrators
takeown /F "$scratchDir\Windows\SystemApps\MicrosoftWindows.Client.FileExp_cw5n1h2txyewy\appxmanifest.xml" /A
-
# 2. Set ACLs so that we can write to it
- icacls "$scratchDir\Windows\SystemApps\MicrosoftWindows.Client.FileExp_cw5n1h2txyewy\appxmanifest.xml" /grant "$(Get-LocalizedUsers -admins $true):(M)" | Out-Host
-
+ icacls "$scratchDir\Windows\SystemApps\MicrosoftWindows.Client.FileExp_cw5n1h2txyewy\appxmanifest.xml" /grant "$(Microwin-GetLocalizedUsers -admins $true):(M)" | Out-Host
# 3. Open the file and do the modification
$appxManifest = Get-Content -Path "$scratchDir\Windows\SystemApps\MicrosoftWindows.Client.FileExp_cw5n1h2txyewy\appxmanifest.xml"
$originalLine = $appxManifest[13]
@@ -185,46 +179,45 @@ public class PowerManagement {
Set-Content -Path "$scratchDir\Windows\SystemApps\MicrosoftWindows.Client.FileExp_cw5n1h2txyewy\appxmanifest.xml" -Value $appxManifest -Force -Encoding utf8
}
}
- catch
- {
-
+ catch {
+ # Do nothing
}
}
- Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\LogFiles\WMI\RtBackup" -Directory
- Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\DiagTrack" -Directory
- Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\InboxApps" -Directory
- 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 "*narratorquickstart*" -Directory
- Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\SystemApps" -mask "*ParentalControls*" -Directory
+ Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\LogFiles\WMI\RtBackup" -Directory
+ Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\DiagTrack" -Directory
+ Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\InboxApps" -Directory
+ Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\LocationNotificationWindows.exe"
+ Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Windows Photo Viewer" -Directory
+ Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Windows Photo Viewer" -Directory
+ Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Windows Media Player" -Directory
+ Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Windows Media Player" -Directory
+ Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Windows Mail" -Directory
+ Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Windows Mail" -Directory
+ Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Internet Explorer" -Directory
+ Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Internet Explorer" -Directory
+ Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\GameBarPresenceWriter"
+ Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\OneDriveSetup.exe"
+ Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\OneDrive.ico"
+ Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\SystemApps" -mask "*narratorquickstart*" -Directory
+ Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\SystemApps" -mask "*ParentalControls*" -Directory
Write-Host "Removal complete!"
Write-Host "Create unattend.xml"
- #New-Unattend
+
if ($sync.MicrowinUserName.Text -eq "")
{
- New-Unattend -userName "User"
+ Microwin-NewUnattend -userName "User"
}
else
{
if ($sync.MicrowinUserPassword.Password -eq "")
{
- New-Unattend -userName "$($sync.MicrowinUserName.Text)"
+ Microwin-NewUnattend -userName "$($sync.MicrowinUserName.Text)"
}
else
{
- New-Unattend -userName "$($sync.MicrowinUserName.Text)" -userPassword "$($sync.MicrowinUserPassword.Password)"
+ Microwin-NewUnattend -userName "$($sync.MicrowinUserName.Text)" -userPassword "$($sync.MicrowinUserPassword.Password)"
}
}
Write-Host "Done Create unattend.xml"
@@ -237,7 +230,7 @@ public class PowerManagement {
Write-Host "Done Copy unattend.xml"
Write-Host "Create FirstRun"
- New-FirstRun
+ Microwin-NewFirstRun
Write-Host "Done create FirstRun"
Write-Host "Copy FirstRun.ps1 into the ISO"
Copy-Item "$env:temp\FirstStartup.ps1" "$($scratchDir)\Windows\FirstStartup.ps1" -force
@@ -249,7 +242,7 @@ public class PowerManagement {
dism /English /image:$($scratchDir) /set-profilepath:"$($scratchDir)\Windows\Users\Default"
Write-Host "Copy checkinstall.cmd into the ISO"
- New-CheckInstall
+ Microwin-NewCheckInstall
Copy-Item "$env:temp\checkinstall.cmd" "$($scratchDir)\Windows\checkinstall.cmd" -force
Write-Host "Done copy checkinstall.cmd"
@@ -325,7 +318,7 @@ public class PowerManagement {
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
- if ((Test-CompatibleImage $imgVersion $([System.Version]::new(10,0,21996,1))) -eq $false) {
+ if ((Microwin-TestCompatibleImage $imgVersion $([System.Version]::new(10,0,21996,1))) -eq $false) {
# We're dealing with Windows 10. Configure sane desktop settings. NOTE: even though stuff to disable News and Interests is there,
# it doesn't seem to work, and I don't want to waste more time dealing with an operating system that will lose support in a year (2025)
@@ -437,7 +430,7 @@ public class PowerManagement {
if ($copyToUSB) {
Write-Host "Copying target ISO to the USB drive"
- Copy-ToUSB("$($SaveDialog.FileName)")
+ Microwin-CopyToUSB("$($SaveDialog.FileName)")
if ($?) { Write-Host "Done Copying target ISO to USB drive!" } else { Write-Host "ISO copy failed." }
}
diff --git a/functions/public/Invoke-WPFGetIso.ps1 b/functions/microwin/Invoke-MicrowinGetIso.ps1
similarity index 98%
rename from functions/public/Invoke-WPFGetIso.ps1
rename to functions/microwin/Invoke-MicrowinGetIso.ps1
index 954ee432..43f4caed 100644
--- a/functions/public/Invoke-WPFGetIso.ps1
+++ b/functions/microwin/Invoke-MicrowinGetIso.ps1
@@ -1,4 +1,4 @@
-function Invoke-WPFGetIso {
+function Invoke-MicrowinGetIso {
<#
.DESCRIPTION
Function to get the path to Iso file for MicroWin, unpack that isom=, read basic information and populate the UI Options
@@ -50,7 +50,7 @@ function Invoke-WPFGetIso {
return
} else {
[System.Windows.MessageBox]::Show("oscdimge.exe is not found on the system, winutil will now attempt do download and install it from github. This might take a long time.")
- Get-Oscdimg -oscdimgPath $oscdimgPath
+ Microwin-GetOscdimg -oscdimgPath $oscdimgPath
$oscdImgFound = Test-Path $oscdimgPath -PathType Leaf
if (!$oscdImgFound) {
$msg = "oscdimg was not downloaded can not proceed"
@@ -100,7 +100,7 @@ function Invoke-WPFGetIso {
Set-Location -Path $env:temp
# Detect if the first option ("System language") has been selected and get a Fido-approved language from the current culture
$lang = if ($sync["ISOLanguage"].SelectedIndex -eq 0) {
- Get-FidoLangFromCulture -langName (Get-Culture).Name
+ Microwin-GetLangFromCulture -langName (Get-Culture).Name
} else {
$sync["ISOLanguage"].SelectedItem
}
diff --git a/functions/microwin/Microwin-Classes.ps1 b/functions/microwin/Microwin-Classes.ps1
new file mode 100644
index 00000000..4c5ad676
--- /dev/null
+++ b/functions/microwin/Microwin-Classes.ps1
@@ -0,0 +1,10 @@
+class ErroredPackage {
+ [string]$PackageName
+ [string]$ErrorMessage
+ ErroredPackage() { $this.Init(@{} )}
+ # Constructor for packages that have errored out
+ ErroredPackage([string]$pkgName, [string]$reason) {
+ $this.PackageName = $pkgName
+ $this.ErrorMessage = $reason
+ }
+}
diff --git a/functions/microwin/Microwin-CopyToUSB.ps1 b/functions/microwin/Microwin-CopyToUSB.ps1
new file mode 100644
index 00000000..06f4219d
--- /dev/null
+++ b/functions/microwin/Microwin-CopyToUSB.ps1
@@ -0,0 +1,23 @@
+function Microwin-CopyToUSB([string]$fileToCopy) {
+ foreach ($volume in Get-Volume) {
+ if ($volume -and $volume.FileSystemLabel -ieq "ventoy") {
+ $destinationPath = "$($volume.DriveLetter):\"
+ #Copy-Item -Path $fileToCopy -Destination $destinationPath -Force
+ # Get the total size of the file
+ $totalSize = (Get-Item "$fileToCopy").length
+
+ Copy-Item -Path "$fileToCopy" -Destination "$destinationPath" -Verbose -Force -Recurse -Container -PassThru |
+ ForEach-Object {
+ # Calculate the percentage completed
+ $completed = ($_.BytesTransferred / $totalSize) * 100
+
+ # Display the progress bar
+ Write-Progress -Activity "Copying File" -Status "Progress" -PercentComplete $completed -CurrentOperation ("{0:N2} MB / {1:N2} MB" -f ($_.BytesTransferred / 1MB), ($totalSize / 1MB))
+ }
+
+ Write-Host "File copied to Ventoy drive $($volume.DriveLetter)"
+ return
+ }
+ }
+ Write-Host "Ventoy USB Key is not inserted"
+}
diff --git a/functions/microwin/Microwin-GetLangFromCulture.ps1 b/functions/microwin/Microwin-GetLangFromCulture.ps1
new file mode 100644
index 00000000..5c6d8fd0
--- /dev/null
+++ b/functions/microwin/Microwin-GetLangFromCulture.ps1
@@ -0,0 +1,49 @@
+function Microwin-GetLangFromCulture {
+
+ param (
+ [Parameter(Mandatory, Position = 0)] [string]$langName
+ )
+
+ switch -Wildcard ($langName)
+ {
+ "ar*" { return "Arabic" }
+ "pt-BR" { return "Brazilian Portuguese" }
+ "bg*" { return "Bulgarian" }
+ {($_ -eq "zh-CH") -or ($_ -like "zh-Hans*") -or ($_ -eq "zh-SG") -or ($_ -eq "zh-CHS")} { return "Chinese (Simplified)" }
+ {($_ -eq "zh") -or ($_ -eq "zh-Hant") -or ($_ -eq "zh-HK") -or ($_ -eq "zh-MO") -or ($_ -eq "zh-TW") -or ($_ -eq "zh-CHT")} { return "Chinese (Traditional)" }
+ "hr*" { return "Croatian" }
+ "cs*" { return "Czech" }
+ "da*" { return "Danish" }
+ "nl*" { return "Dutch" }
+ "en-US" { return "English" }
+ {($_ -like "en*") -and ($_ -ne "en-US")} { return "English International" }
+ "et*" { return "Estonian" }
+ "fi*" { return "Finnish" }
+ {($_ -like "fr*") -and ($_ -ne "fr-CA")} { return "French" }
+ "fr-CA" { return "French Canadian" }
+ "de*" { return "German" }
+ "el*" { return "Greek" }
+ "he*" { return "Hebrew" }
+ "hu*" { return "Hungarian" }
+ "it*" { return "Italian" }
+ "ja*" { return "Japanese" }
+ "ko*" { return "Korean" }
+ "lv*" { return "Latvian" }
+ "lt*" { return "Lituanian" }
+ "nb*" { return "Norwegian" }
+ "pl*" { return "Polish" }
+ {($_ -like "pt*") -and ($_ -ne "pt-BR")} { return "Portuguese" }
+ "ro*" { return "Romanian" }
+ "ru*" { return "Russian" }
+ "sr-Latn*" { return "Serbian Latin" }
+ "sk*" { return "Slovak" }
+ "sl*" { return "Slovenian" }
+ {($_ -like "es*") -and ($_ -ne "es-MX")} { return "Spanish" }
+ "es-MX" { return "Spanish (Mexico)" }
+ "sv*" { return "Swedish" }
+ "th*" { return "Thai" }
+ "tr*" { return "Turkish" }
+ "uk*" { return "Ukrainian" }
+ default { return "English" }
+ }
+}
diff --git a/functions/microwin/Microwin-GetLocalizedUsers.ps1 b/functions/microwin/Microwin-GetLocalizedUsers.ps1
new file mode 100644
index 00000000..0f7bf7bd
--- /dev/null
+++ b/functions/microwin/Microwin-GetLocalizedUsers.ps1
@@ -0,0 +1,21 @@
+function Microwin-GetLocalizedUsers
+{
+ <#
+ .SYNOPSIS
+ Gets a localized user group representation for ICACLS commands (Port from DISMTools PE Helper)
+ .PARAMETER admins
+ Determines whether to get a localized user group representation for the Administrators user group
+ .OUTPUTS
+ A string containing the localized user group
+ .EXAMPLE
+ Microwin-GetLocalizedUsers -admins $true
+ #>
+ param (
+ [Parameter(Mandatory = $true, Position = 0)] [bool]$admins
+ )
+ if ($admins) {
+ return (Get-LocalGroup | Where-Object { $_.SID.Value -like "S-1-5-32-544" }).Name
+ } else {
+ return (Get-LocalGroup | Where-Object { $_.SID.Value -like "S-1-5-32-545" }).Name
+ }
+}
\ No newline at end of file
diff --git a/functions/private/Get-Oscdimg.ps1 b/functions/microwin/Microwin-GetOscdimg.ps1
similarity index 94%
rename from functions/private/Get-Oscdimg.ps1
rename to functions/microwin/Microwin-GetOscdimg.ps1
index 4680a39b..f395f71f 100644
--- a/functions/private/Get-Oscdimg.ps1
+++ b/functions/microwin/Microwin-GetOscdimg.ps1
@@ -1,10 +1,10 @@
-function Get-Oscdimg {
+function Microwin-GetOscdimg {
<#
.DESCRIPTION
This function will download oscdimg file from github Release folders and put it into env:temp folder
.EXAMPLE
- Get-Oscdimg
+ Microwin-GetOscdimg
#>
param(
diff --git a/functions/microwin/Microwin-NewCheckInstall.ps1 b/functions/microwin/Microwin-NewCheckInstall.ps1
new file mode 100644
index 00000000..6520ac6a
--- /dev/null
+++ b/functions/microwin/Microwin-NewCheckInstall.ps1
@@ -0,0 +1,73 @@
+function Microwin-NewCheckInstall {
+
+ # using here string to embedd firstrun
+ $checkInstall = @'
+ @echo off
+ if exist "%HOMEDRIVE%\windows\cpu.txt" (
+ echo %HOMEDRIVE%\windows\cpu.txt exists
+ ) else (
+ echo %HOMEDRIVE%\windows\cpu.txt does not exist
+ )
+ if exist "%HOMEDRIVE%\windows\SerialNumber.txt" (
+ echo %HOMEDRIVE%\windows\SerialNumber.txt exists
+ ) else (
+ echo %HOMEDRIVE%\windows\SerialNumber.txt does not exist
+ )
+ if exist "%HOMEDRIVE%\unattend.xml" (
+ echo %HOMEDRIVE%\unattend.xml exists
+ ) else (
+ echo %HOMEDRIVE%\unattend.xml does not exist
+ )
+ if exist "%HOMEDRIVE%\Windows\Setup\Scripts\SetupComplete.cmd" (
+ echo %HOMEDRIVE%\Windows\Setup\Scripts\SetupComplete.cmd exists
+ ) else (
+ echo %HOMEDRIVE%\Windows\Setup\Scripts\SetupComplete.cmd does not exist
+ )
+ if exist "%HOMEDRIVE%\Windows\Panther\unattend.xml" (
+ echo %HOMEDRIVE%\Windows\Panther\unattend.xml exists
+ ) else (
+ echo %HOMEDRIVE%\Windows\Panther\unattend.xml does not exist
+ )
+ if exist "%HOMEDRIVE%\Windows\System32\Sysprep\unattend.xml" (
+ echo %HOMEDRIVE%\Windows\System32\Sysprep\unattend.xml exists
+ ) else (
+ echo %HOMEDRIVE%\Windows\System32\Sysprep\unattend.xml does not exist
+ )
+ if exist "%HOMEDRIVE%\Windows\FirstStartup.ps1" (
+ echo %HOMEDRIVE%\Windows\FirstStartup.ps1 exists
+ ) else (
+ echo %HOMEDRIVE%\Windows\FirstStartup.ps1 does not exist
+ )
+ if exist "%HOMEDRIVE%\Windows\winutil.ps1" (
+ echo %HOMEDRIVE%\Windows\winutil.ps1 exists
+ ) else (
+ echo %HOMEDRIVE%\Windows\winutil.ps1 does not exist
+ )
+ if exist "%HOMEDRIVE%\Windows\LogSpecialize.txt" (
+ echo %HOMEDRIVE%\Windows\LogSpecialize.txt exists
+ ) else (
+ echo %HOMEDRIVE%\Windows\LogSpecialize.txt does not exist
+ )
+ if exist "%HOMEDRIVE%\Windows\LogAuditUser.txt" (
+ echo %HOMEDRIVE%\Windows\LogAuditUser.txt exists
+ ) else (
+ echo %HOMEDRIVE%\Windows\LogAuditUser.txt does not exist
+ )
+ if exist "%HOMEDRIVE%\Windows\LogOobeSystem.txt" (
+ echo %HOMEDRIVE%\Windows\LogOobeSystem.txt exists
+ ) else (
+ echo %HOMEDRIVE%\Windows\LogOobeSystem.txt does not exist
+ )
+ if exist "%HOMEDRIVE%\windows\csup.txt" (
+ echo %HOMEDRIVE%\windows\csup.txt exists
+ ) else (
+ echo %HOMEDRIVE%\windows\csup.txt does not exist
+ )
+ if exist "%HOMEDRIVE%\windows\LogFirstRun.txt" (
+ echo %HOMEDRIVE%\windows\LogFirstRun.txt exists
+ ) else (
+ echo %HOMEDRIVE%\windows\LogFirstRun.txt does not exist
+ )
+'@
+ $checkInstall | Out-File -FilePath "$env:temp\checkinstall.cmd" -Force -Encoding Ascii
+}
diff --git a/functions/microwin/Microwin-NewFirstRun.ps1 b/functions/microwin/Microwin-NewFirstRun.ps1
new file mode 100644
index 00000000..614df6bc
--- /dev/null
+++ b/functions/microwin/Microwin-NewFirstRun.ps1
@@ -0,0 +1,68 @@
+function Microwin-NewFirstRun {
+
+ # using here string to embedd firstrun
+ $firstRun = @'
+ # Set the global error action preference to continue
+ $ErrorActionPreference = "Continue"
+ function Remove-RegistryValue {
+ param (
+ [Parameter(Mandatory = $true)]
+ [string]$RegistryPath,
+
+ [Parameter(Mandatory = $true)]
+ [string]$ValueName
+ )
+
+ # Check if the registry path exists
+ if (Test-Path -Path $RegistryPath) {
+ $registryValue = Get-ItemProperty -Path $RegistryPath -Name $ValueName -ErrorAction SilentlyContinue
+
+ # Check if the registry value exists
+ if ($registryValue) {
+ # Remove the registry value
+ Remove-ItemProperty -Path $RegistryPath -Name $ValueName -Force
+ Write-Host "Registry value '$ValueName' removed from '$RegistryPath'."
+ } else {
+ Write-Host "Registry value '$ValueName' not found in '$RegistryPath'."
+ }
+ } else {
+ Write-Host "Registry path '$RegistryPath' not found."
+ }
+ }
+
+ "FirstStartup has worked" | Out-File -FilePath "$env:HOMEDRIVE\windows\LogFirstRun.txt" -Append -NoClobber
+
+ $taskbarPath = "$env:AppData\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar"
+ # Delete all files on the Taskbar
+ Get-ChildItem -Path $taskbarPath -File | Remove-Item -Force
+ Remove-RegistryValue -RegistryPath "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband" -ValueName "FavoritesRemovedChanges"
+ Remove-RegistryValue -RegistryPath "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband" -ValueName "FavoritesChanges"
+ Remove-RegistryValue -RegistryPath "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband" -ValueName "Favorites"
+
+ # Delete Edge Icon from the desktop
+ $edgeShortcutFiles = Get-ChildItem -Path $desktopPath -Filter "*Edge*.lnk"
+ # Check if Edge shortcuts exist on the desktop
+ if ($edgeShortcutFiles) {
+ foreach ($shortcutFile in $edgeShortcutFiles) {
+ # Remove each Edge shortcut
+ Remove-Item -Path $shortcutFile.FullName -Force
+ Write-Host "Edge shortcut '$($shortcutFile.Name)' removed from the desktop."
+ }
+ }
+ Remove-Item -Path "$env:USERPROFILE\Desktop\*.lnk"
+ Remove-Item -Path "$env:HOMEDRIVE\Users\Default\Desktop\*.lnk"
+
+ try
+ {
+ if ((Get-WindowsOptionalFeature -Online | Where-Object { $_.FeatureName -like "Recall" }).Count -gt 0)
+ {
+ Disable-WindowsOptionalFeature -Online -FeatureName "Recall" -Remove
+ }
+ }
+ catch
+ {
+
+ }
+'@
+ $firstRun | Out-File -FilePath "$env:temp\FirstStartup.ps1" -Force
+}
diff --git a/functions/microwin/Microwin-NewUnattend.ps1 b/functions/microwin/Microwin-NewUnattend.ps1
new file mode 100644
index 00000000..87188aca
--- /dev/null
+++ b/functions/microwin/Microwin-NewUnattend.ps1
@@ -0,0 +1,310 @@
+function Microwin-NewUnattend {
+
+ param (
+ [Parameter(Mandatory, Position = 0)] [string]$userName,
+ [Parameter(Position = 1)] [string]$userPassword
+ )
+
+ $unattend = @'
+
+
+ <#REPLACEME#>
+
+
+
+
+ 1
+ CMD /C echo LAU GG>C:\Windows\LogAuditUser.txt
+ StartMenu
+
+
+
+
+
+
+
+
+
+ USER-REPLACEME
+ Administrators
+
+ PW-REPLACEME
+ true
+
+
+
+
+
+ USER-REPLACEME
+ true
+ 1
+
+ PW-REPLACEME
+ true
+
+
+
+ true
+ true
+ true
+ true
+ true
+ true
+ 3
+
+
+
+ 1
+ reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoLogonCount /t REG_DWORD /d 0 /f
+
+
+ 2
+ cmd.exe /c echo 23>c:\windows\csup.txt
+
+
+ 3
+ CMD /C echo GG>C:\Windows\LogOobeSystem.txt
+
+
+ 4
+ powershell -ExecutionPolicy Bypass -File c:\windows\FirstStartup.ps1
+
+
+
+
+
+'@
+ $specPass = @'
+
+
+ 0
+
+
+ false
+
+
+
+
+ 1
+ reg.exe add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OOBE" /v BypassNRO /t REG_DWORD /d 1 /f
+
+
+ 2
+ reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"
+
+
+ 3
+ reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\Runonce" /v "UninstallCopilot" /t REG_SZ /d "powershell.exe -NoProfile -Command \"Get-AppxPackage -Name 'Microsoft.Windows.Ai.Copilot.Provider' | Remove-AppxPackage;\"" /f
+
+
+ 4
+ reg.exe add "HKU\DefaultUser\Software\Policies\Microsoft\Windows\WindowsCopilot" /v TurnOffWindowsCopilot /t REG_DWORD /d 1 /f
+
+
+ 5
+ reg.exe unload "HKU\DefaultUser"
+
+
+ 6
+ reg.exe delete "HKLM\SOFTWARE\Microsoft\WindowsUpdate\Orchestrator\UScheduler_Oobe\DevHomeUpdate" /f
+
+
+ 7
+ reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"
+
+
+ 8
+ reg.exe add "HKU\DefaultUser\Software\Microsoft\Notepad" /v ShowStoreBanner /t REG_DWORD /d 0 /f
+
+
+ 9
+ reg.exe unload "HKU\DefaultUser"
+
+
+ 10
+ cmd.exe /c "del "C:\Users\Default\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\OneDrive.lnk""
+
+
+ 11
+ cmd.exe /c "del "C:\Windows\System32\OneDriveSetup.exe""
+
+
+ 12
+ cmd.exe /c "del "C:\Windows\SysWOW64\OneDriveSetup.exe""
+
+
+ 13
+ reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"
+
+
+ 14
+ reg.exe delete "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\Run" /v OneDriveSetup /f
+
+
+ 15
+ reg.exe unload "HKU\DefaultUser"
+
+
+ 16
+ reg.exe delete "HKLM\SOFTWARE\Microsoft\WindowsUpdate\Orchestrator\UScheduler_Oobe\OutlookUpdate" /f
+
+
+ 17
+ reg.exe add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Communications" /v ConfigureChatAutoInstall /t REG_DWORD /d 0 /f
+
+
+ 18
+ powershell.exe -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;"
+
+
+ 19
+ powershell.exe -NoProfile -Command "Get-Content -LiteralPath 'C:\Windows\Temp\Microwin-RemovePackages.ps1' -Raw | Invoke-Expression;"
+
+
+ 20
+ powershell.exe -NoProfile -Command "Get-Content -LiteralPath 'C:\Windows\Temp\remove-caps.ps1' -Raw | Invoke-Expression;"
+
+
+ 21
+ reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\current\device\Start" /v ConfigureStartPins /t REG_SZ /d "{ \"pinnedList\": [] }" /f
+
+
+ 22
+ reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\current\device\Start" /v ConfigureStartPins_ProviderSet /t REG_DWORD /d 1 /f
+
+
+ 23
+ reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\current\device\Start" /v ConfigureStartPins_WinningProvider /t REG_SZ /d B5292708-1619-419B-9923-E5D9F3925E71 /f
+
+
+ 24
+ reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\providers\B5292708-1619-419B-9923-E5D9F3925E71\default\Device\Start" /v ConfigureStartPins /t REG_SZ /d "{ \"pinnedList\": [] }" /f
+
+
+ 25
+ reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\providers\B5292708-1619-419B-9923-E5D9F3925E71\default\Device\Start" /v ConfigureStartPins_LastWrite /t REG_DWORD /d 1 /f
+
+
+ 26
+ net.exe accounts /maxpwage:UNLIMITED
+
+
+ 27
+ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\FileSystem" /v LongPathsEnabled /t REG_DWORD /d 1 /f
+
+
+ 28
+ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Power" /v HiberbootEnabled /t REG_DWORD /d 0 /f
+
+
+ 29
+ reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Dsh" /v AllowNewsAndInterests /t REG_DWORD /d 0 /f
+
+
+ 30
+ reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"
+
+
+ 31
+ reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "ContentDeliveryAllowed" /t REG_DWORD /d 0 /f
+
+
+ 32
+ reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "FeatureManagementEnabled" /t REG_DWORD /d 0 /f
+
+
+ 33
+ reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "OEMPreInstalledAppsEnabled" /t REG_DWORD /d 0 /f
+
+
+ 34
+ reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "PreInstalledAppsEnabled" /t REG_DWORD /d 0 /f
+
+
+ 35
+ reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "PreInstalledAppsEverEnabled" /t REG_DWORD /d 0 /f
+
+
+ 36
+ reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SilentInstalledAppsEnabled" /t REG_DWORD /d 0 /f
+
+
+ 37
+ reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SoftLandingEnabled" /t REG_DWORD /d 0 /f
+
+
+ 38
+ reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContentEnabled" /t REG_DWORD /d 0 /f
+
+
+ 39
+ reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-310093Enabled" /t REG_DWORD /d 0 /f
+
+
+ 40
+ reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338387Enabled" /t REG_DWORD /d 0 /f
+
+
+ 41
+ reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338388Enabled" /t REG_DWORD /d 0 /f
+
+
+ 42
+ reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338389Enabled" /t REG_DWORD /d 0 /f
+
+
+ 43
+ reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338393Enabled" /t REG_DWORD /d 0 /f
+
+
+ 44
+ reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-353698Enabled" /t REG_DWORD /d 0 /f
+
+
+ 45
+ reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SystemPaneSuggestionsEnabled" /t REG_DWORD /d 0 /f
+
+
+ 46
+ reg.exe unload "HKU\DefaultUser"
+
+
+ 47
+ reg.exe add "HKLM\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableWindowsConsumerFeatures" /t REG_DWORD /d 0 /f
+
+
+ 48
+ reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\BitLocker" /v "PreventDeviceEncryption" /t REG_DWORD /d 1 /f
+
+
+ 49
+ reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"
+
+
+ 50
+ reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\Runonce" /v "ClassicContextMenu" /t REG_SZ /d "reg.exe add \"HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32\" /ve /f" /f
+
+
+ 51
+ reg.exe unload "HKU\DefaultUser"
+
+
+
+
+'@
+ if ((Microwin-TestCompatibleImage $imgVersion $([System.Version]::new(10,0,22000,1))) -eq $false) {
+ # Replace the placeholder text with an empty string to make it valid for Windows 10 Setup
+ $unattend = $unattend.Replace("<#REPLACEME#>", "").Trim()
+ } else {
+ # Replace the placeholder text with the Specialize pass
+ $unattend = $unattend.Replace("<#REPLACEME#>", $specPass).Trim()
+ }
+ # Replace default User and Password values with the provided parameters
+ $unattend = $unattend.Replace("USER-REPLACEME", $userName).Trim()
+ $unattend = $unattend.Replace("PW-REPLACEME", $userPassword).Trim()
+
+ # Save unattended answer file with UTF-8 encoding
+ $unattend | Out-File -FilePath "$env:temp\unattend.xml" -Force -Encoding utf8
+}
diff --git a/functions/microwin/Microwin-RemoveFeatures.ps1 b/functions/microwin/Microwin-RemoveFeatures.ps1
new file mode 100644
index 00000000..5b37adb2
--- /dev/null
+++ b/functions/microwin/Microwin-RemoveFeatures.ps1
@@ -0,0 +1,40 @@
+function Microwin-RemoveFeatures() {
+ <#
+ .SYNOPSIS
+ Removes certain features from ISO image
+
+ .PARAMETER Name
+ No Params
+
+ .EXAMPLE
+ Microwin-RemoveFeatures
+ #>
+ try {
+ $featlist = (Get-WindowsOptionalFeature -Path $scratchDir)
+
+ $featlist = $featlist | Where-Object {
+ $_.FeatureName -NotLike "*Defender*" -AND
+ $_.FeatureName -NotLike "*Printing*" -AND
+ $_.FeatureName -NotLike "*TelnetClient*" -AND
+ $_.FeatureName -NotLike "*PowerShell*" -AND
+ $_.FeatureName -NotLike "*NetFx*" -AND
+ $_.FeatureName -NotLike "*Media*" -AND
+ $_.FeatureName -NotLike "*NFS*" -AND
+ $_.FeatureName -NotLike "*SearchEngine*" -AND
+ $_.FeatureName -NotLike "*RemoteDesktop*" -AND
+ $_.State -ne "Disabled"
+ }
+
+ foreach($feature in $featlist) {
+ $status = "Removing feature $($feature.FeatureName)"
+ Write-Progress -Activity "Removing features" -Status $status -PercentComplete ($counter++/$featlist.Count*100)
+ Write-Debug "Removing feature $($feature.FeatureName)"
+ Disable-WindowsOptionalFeature -Path "$scratchDir" -FeatureName $($feature.FeatureName) -Remove -ErrorAction SilentlyContinue -NoRestart
+ }
+ Write-Progress -Activity "Removing features" -Status "Ready" -Completed
+ Write-Host "You can re-enable the disabled features at any time, using either Windows Update or the SxS folder in \Sources."
+ } catch {
+ Write-Host "Unable to get information about the features. MicroWin processing will continue, but features will not be processed"
+ Write-Host "Error information: $($_.Exception.Message)" -ForegroundColor Yellow
+ }
+}
diff --git a/functions/microwin/Microwin-RemoveFileOrDirectory.ps1 b/functions/microwin/Microwin-RemoveFileOrDirectory.ps1
new file mode 100644
index 00000000..002e7a65
--- /dev/null
+++ b/functions/microwin/Microwin-RemoveFileOrDirectory.ps1
@@ -0,0 +1,42 @@
+function Microwin-RemoveFileOrDirectory([string]$pathToDelete, [string]$mask = "", [switch]$Directory = $false) {
+ if(([string]::IsNullOrEmpty($pathToDelete))) { return }
+ if (-not (Test-Path -Path "$($pathToDelete)")) { return }
+
+ $yesNo = Get-LocalizedYesNo
+ Write-Host "[INFO] In Your local takeown expects '$($yesNo[0])' as a Yes answer."
+
+ $itemsToDelete = [System.Collections.ArrayList]::new()
+
+ if ($mask -eq "") {
+ Write-Debug "Adding $($pathToDelete) to array."
+ [void]$itemsToDelete.Add($pathToDelete)
+ } else {
+ Write-Debug "Adding $($pathToDelete) to array and mask is $($mask)"
+ if ($Directory) { $itemsToDelete = Get-ChildItem $pathToDelete -Include $mask -Recurse -Directory } else { $itemsToDelete = Get-ChildItem $pathToDelete -Include $mask -Recurse }
+ }
+
+ foreach($itemToDelete in $itemsToDelete) {
+ $status = "Deleting $($itemToDelete)"
+ Write-Progress -Activity "Removing Items" -Status $status -PercentComplete ($counter++/$itemsToDelete.Count*100)
+
+ if (Test-Path -Path "$($itemToDelete)" -PathType Container) {
+ $status = "Deleting directory: $($itemToDelete)"
+
+ takeown /r /d $yesNo[0] /a /f "$($itemToDelete)"
+ icacls "$($itemToDelete)" /q /c /t /reset
+ icacls $itemToDelete /setowner "*S-1-5-32-544"
+ icacls $itemToDelete /grant "*S-1-5-32-544:(OI)(CI)F" /t /c /q
+ Remove-Item -Force -Recurse "$($itemToDelete)"
+ }
+ elseif (Test-Path -Path "$($itemToDelete)" -PathType Leaf) {
+ $status = "Deleting file: $($itemToDelete)"
+
+ takeown /a /f "$($itemToDelete)"
+ icacls "$($itemToDelete)" /q /c /t /reset
+ icacls "$($itemToDelete)" /setowner "*S-1-5-32-544"
+ icacls "$($itemToDelete)" /grant "*S-1-5-32-544:(OI)(CI)F" /t /c /q
+ Remove-Item -Force "$($itemToDelete)"
+ }
+ }
+ Write-Progress -Activity "Removing Items" -Status "Ready" -Completed
+}
diff --git a/functions/microwin/Microwin-RemovePackages.ps1 b/functions/microwin/Microwin-RemovePackages.ps1
new file mode 100644
index 00000000..ed53056c
--- /dev/null
+++ b/functions/microwin/Microwin-RemovePackages.ps1
@@ -0,0 +1,96 @@
+function Microwin-RemovePackages {
+ try {
+ $pkglist = (Get-WindowsPackage -Path "$scratchDir").PackageName
+
+ $pkglist = $pkglist | Where-Object {
+ $_ -NotLike "*ApplicationModel*" -AND
+ $_ -NotLike "*indows-Client-LanguagePack*" -AND
+ $_ -NotLike "*LanguageFeatures-Basic*" -AND
+ $_ -NotLike "*Package_for_ServicingStack*" -AND
+ $_ -NotLike "*.NET*" -AND
+ $_ -NotLike "*Store*" -AND
+ $_ -NotLike "*VCLibs*" -AND
+ $_ -NotLike "*AAD.BrokerPlugin",
+ $_ -NotLike "*LockApp*" -AND
+ $_ -NotLike "*Notepad*" -AND
+ $_ -NotLike "*immersivecontrolpanel*" -AND
+ $_ -NotLike "*ContentDeliveryManager*" -AND
+ $_ -NotLike "*PinningConfirMationDialog*" -AND
+ $_ -NotLike "*SecHealthUI*" -AND
+ $_ -NotLike "*SecureAssessmentBrowser*" -AND
+ $_ -NotLike "*PrintDialog*" -AND
+ $_ -NotLike "*AssignedAccessLockApp*" -AND
+ $_ -NotLike "*OOBENetworkConnectionFlow*" -AND
+ $_ -NotLike "*Apprep.ChxApp*" -AND
+ $_ -NotLike "*CBS*" -AND
+ $_ -NotLike "*OOBENetworkCaptivePortal*" -AND
+ $_ -NotLike "*PeopleExperienceHost*" -AND
+ $_ -NotLike "*ParentalControls*" -AND
+ $_ -NotLike "*Win32WebViewHost*" -AND
+ $_ -NotLike "*InputApp*" -AND
+ $_ -NotLike "*DirectPlay*" -AND
+ $_ -NotLike "*AccountsControl*" -AND
+ $_ -NotLike "*AsyncTextService*" -AND
+ $_ -NotLike "*CapturePicker*" -AND
+ $_ -NotLike "*CredDialogHost*" -AND
+ $_ -NotLike "*BioEnrollMent*" -AND
+ $_ -NotLike "*ShellExperienceHost*" -AND
+ $_ -NotLike "*DesktopAppInstaller*" -AND
+ $_ -NotLike "*WebMediaExtensions*" -AND
+ $_ -NotLike "*WMIC*" -AND
+ $_ -NotLike "*UI.XaML*" -AND
+ $_ -NotLike "*Ethernet*" -AND
+ $_ -NotLike "*Wifi*" -AND
+ $_ -NotLike "*FodMetadata*" -AND
+ $_ -NotLike "*Foundation*" -AND
+ $_ -NotLike "*LanguageFeatures*" -AND
+ $_ -NotLike "*VBSCRIPT*" -AND
+ $_ -NotLike "*License*"
+ }
+
+ $failedCount = 0
+
+ $erroredPackages = [System.Collections.Generic.List[ErroredPackage]]::new()
+
+ foreach ($pkg in $pkglist) {
+ try {
+ $status = "Removing $pkg"
+ Write-Progress -Activity "Removing Packages" -Status $status -PercentComplete ($counter++/$pkglist.Count*100)
+ Remove-WindowsPackage -Path "$scratchDir" -PackageName $pkg -NoRestart -ErrorAction SilentlyContinue
+ } catch {
+ # This can happen if the package that is being removed is a permanent one
+ $erroredPackages.Add([ErroredPackage]::new($pkg, $_.Exception.Message))
+ $failedCount += 1
+ continue
+ }
+ }
+ Write-Progress -Activity "Removing Packages" -Status "Ready" -Completed
+ if ($failedCount -gt 0)
+ {
+ Write-Host "$failedCount package(s) could not be removed. Your image will still work fine, however. Below is information on what packages failed to be removed and why."
+ if ($erroredPackages.Count -gt 0)
+ {
+ $erroredPackages = $erroredPackages | Sort-Object -Property ErrorMessage
+
+ $previousErroredPackage = $erroredPackages[0]
+ $counter = 0
+ Write-Host ""
+ Write-Host "- $($previousErroredPackage.ErrorMessage)"
+ foreach ($erroredPackage in $erroredPackages) {
+ if ($erroredPackage.ErrorMessage -ne $previousErroredPackage.ErrorMessage) {
+ Write-Host ""
+ $counter = 0
+ Write-Host "- $($erroredPackage.ErrorMessage)"
+ }
+ $counter += 1
+ Write-Host " $counter) $($erroredPackage.PackageName)"
+ $previousErroredPackage = $erroredPackage
+ }
+ Write-Host ""
+ }
+ }
+ } catch {
+ Write-Host "Unable to get information about the packages. MicroWin processing will continue, but packages will not be processed"
+ Write-Host "Error information: $($_.Exception.Message)" -ForegroundColor Yellow
+ }
+}
diff --git a/functions/microwin/Microwin-RemoveProvisionedPackages.ps1 b/functions/microwin/Microwin-RemoveProvisionedPackages.ps1
new file mode 100644
index 00000000..30bc0d74
--- /dev/null
+++ b/functions/microwin/Microwin-RemoveProvisionedPackages.ps1
@@ -0,0 +1,51 @@
+function Microwin-RemoveProvisionedPackages() {
+ <#
+ .SYNOPSIS
+ Removes AppX packages from a Windows image during MicroWin processing
+
+ .PARAMETER Name
+ No Params
+
+ .EXAMPLE
+ Microwin-RemoveProvisionedPackages
+ #>
+ try
+ {
+ $appxProvisionedPackages = Get-AppxProvisionedPackage -Path "$($scratchDir)" | Where-Object {
+ $_.PackageName -NotLike "*AppInstaller*" -AND
+ $_.PackageName -NotLike "*Store*" -and
+ $_.PackageName -NotLike "*Notepad*" -and
+ $_.PackageName -NotLike "*Printing*" -and
+ $_.PackageName -NotLike "*YourPhone*" -and
+ $_.PackageName -NotLike "*Xbox*" -and
+ $_.PackageName -NotLike "*WindowsTerminal*" -and
+ $_.PackageName -NotLike "*Calculator*" -and
+ $_.PackageName -NotLike "*Photos*" -and
+ $_.PackageName -NotLike "*VCLibs*" -and
+ $_.PackageName -NotLike "*Paint*" -and
+ $_.PackageName -NotLike "*Gaming*" -and
+ $_.PackageName -NotLike "*Extension*" -and
+ $_.PackageName -NotLike "*SecHealthUI*" -and
+ $_.PackageName -NotLike "*ScreenSketch*"
+ }
+
+ $counter = 0
+ foreach ($appx in $appxProvisionedPackages) {
+ $status = "Removing Provisioned $($appx.PackageName)"
+ Write-Progress -Activity "Removing Provisioned Apps" -Status $status -PercentComplete ($counter++/$appxProvisionedPackages.Count*100)
+ try {
+ Remove-AppxProvisionedPackage -Path "$scratchDir" -PackageName $appx.PackageName -ErrorAction SilentlyContinue
+ } catch {
+ Write-Host "Application $($appx.PackageName) could not be removed"
+ continue
+ }
+ }
+ Write-Progress -Activity "Removing Provisioned Apps" -Status "Ready" -Completed
+ }
+ catch
+ {
+ # This can happen if getting AppX packages fails
+ Write-Host "Unable to get information about the AppX packages. MicroWin processing will continue, but AppX packages will not be processed"
+ Write-Host "Error information: $($_.Exception.Message)" -ForegroundColor Yellow
+ }
+}
diff --git a/functions/microwin/Microwin-TestCompatibleImage.ps1 b/functions/microwin/Microwin-TestCompatibleImage.ps1
new file mode 100644
index 00000000..f1305e92
--- /dev/null
+++ b/functions/microwin/Microwin-TestCompatibleImage.ps1
@@ -0,0 +1,26 @@
+function Microwin-TestCompatibleImage() {
+ <#
+ .SYNOPSIS
+ Checks the version of a Windows image and determines whether or not it is compatible with a specific feature depending on a desired version
+
+ .PARAMETER Name
+ imgVersion - The version of the Windows image
+ desiredVersion - The version to compare the image version with
+ #>
+
+ param
+ (
+ [Parameter(Mandatory, position=0)]
+ [string]$imgVersion,
+
+ [Parameter(Mandatory, position=1)]
+ [Version]$desiredVersion
+ )
+
+ try {
+ $version = [Version]$imgVersion
+ return $version -ge $desiredVersion
+ } catch {
+ return $False
+ }
+}
diff --git a/functions/private/Invoke-WinUtilMicroWin-Helper.ps1 b/functions/private/Invoke-WinUtilMicroWin-Helper.ps1
deleted file mode 100644
index 361f21b2..00000000
--- a/functions/private/Invoke-WinUtilMicroWin-Helper.ps1
+++ /dev/null
@@ -1,823 +0,0 @@
-function Test-CompatibleImage() {
- <#
- .SYNOPSIS
- Checks the version of a Windows image and determines whether or not it is compatible with a specific feature depending on a desired version
-
- .PARAMETER Name
- imgVersion - The version of the Windows image
- desiredVersion - The version to compare the image version with
- #>
-
- param
- (
- [Parameter(Mandatory, position=0)]
- [string]$imgVersion,
-
- [Parameter(Mandatory, position=1)]
- [Version]$desiredVersion
- )
-
- try {
- $version = [Version]$imgVersion
- return $version -ge $desiredVersion
- } catch {
- return $False
- }
-}
-
-class ErroredPackage {
- [string]$PackageName
- [string]$ErrorMessage
- ErroredPackage() { $this.Init(@{} )}
- # Constructor for packages that have errored out
- ErroredPackage([string]$pkgName, [string]$reason) {
- $this.PackageName = $pkgName
- $this.ErrorMessage = $reason
- }
-}
-
-function Get-FidoLangFromCulture {
-
- param (
- [Parameter(Mandatory, Position = 0)] [string]$langName
- )
-
- switch -Wildcard ($langName)
- {
- "ar*" { return "Arabic" }
- "pt-BR" { return "Brazilian Portuguese" }
- "bg*" { return "Bulgarian" }
- {($_ -eq "zh-CH") -or ($_ -like "zh-Hans*") -or ($_ -eq "zh-SG") -or ($_ -eq "zh-CHS")} { return "Chinese (Simplified)" }
- {($_ -eq "zh") -or ($_ -eq "zh-Hant") -or ($_ -eq "zh-HK") -or ($_ -eq "zh-MO") -or ($_ -eq "zh-TW") -or ($_ -eq "zh-CHT")} { return "Chinese (Traditional)" }
- "hr*" { return "Croatian" }
- "cs*" { return "Czech" }
- "da*" { return "Danish" }
- "nl*" { return "Dutch" }
- "en-US" { return "English" }
- {($_ -like "en*") -and ($_ -ne "en-US")} { return "English International" }
- "et*" { return "Estonian" }
- "fi*" { return "Finnish" }
- {($_ -like "fr*") -and ($_ -ne "fr-CA")} { return "French" }
- "fr-CA" { return "French Canadian" }
- "de*" { return "German" }
- "el*" { return "Greek" }
- "he*" { return "Hebrew" }
- "hu*" { return "Hungarian" }
- "it*" { return "Italian" }
- "ja*" { return "Japanese" }
- "ko*" { return "Korean" }
- "lv*" { return "Latvian" }
- "lt*" { return "Lituanian" }
- "nb*" { return "Norwegian" }
- "pl*" { return "Polish" }
- {($_ -like "pt*") -and ($_ -ne "pt-BR")} { return "Portuguese" }
- "ro*" { return "Romanian" }
- "ru*" { return "Russian" }
- "sr-Latn*" { return "Serbian Latin" }
- "sk*" { return "Slovak" }
- "sl*" { return "Slovenian" }
- {($_ -like "es*") -and ($_ -ne "es-MX")} { return "Spanish" }
- "es-MX" { return "Spanish (Mexico)" }
- "sv*" { return "Swedish" }
- "th*" { return "Thai" }
- "tr*" { return "Turkish" }
- "uk*" { return "Ukrainian" }
- default { return "English" }
- }
-}
-
-function Remove-Features() {
- <#
- .SYNOPSIS
- Removes certain features from ISO image
-
- .PARAMETER Name
- No Params
-
- .EXAMPLE
- Remove-Features
- #>
- try {
- $featlist = (Get-WindowsOptionalFeature -Path $scratchDir)
-
- $featlist = $featlist | Where-Object {
- $_.FeatureName -NotLike "*Defender*" -AND
- $_.FeatureName -NotLike "*Printing*" -AND
- $_.FeatureName -NotLike "*TelnetClient*" -AND
- $_.FeatureName -NotLike "*PowerShell*" -AND
- $_.FeatureName -NotLike "*NetFx*" -AND
- $_.FeatureName -NotLike "*Media*" -AND
- $_.FeatureName -NotLike "*NFS*" -AND
- $_.FeatureName -NotLike "*SearchEngine*" -AND
- $_.FeatureName -NotLike "*RemoteDesktop*" -AND
- $_.State -ne "Disabled"
- }
-
- foreach($feature in $featlist) {
- $status = "Removing feature $($feature.FeatureName)"
- Write-Progress -Activity "Removing features" -Status $status -PercentComplete ($counter++/$featlist.Count*100)
- Write-Debug "Removing feature $($feature.FeatureName)"
- Disable-WindowsOptionalFeature -Path "$scratchDir" -FeatureName $($feature.FeatureName) -Remove -ErrorAction SilentlyContinue -NoRestart
- }
- Write-Progress -Activity "Removing features" -Status "Ready" -Completed
- Write-Host "You can re-enable the disabled features at any time, using either Windows Update or the SxS folder in \Sources."
- } catch {
- Write-Host "Unable to get information about the features. MicroWin processing will continue, but features will not be processed"
- Write-Host "Error information: $($_.Exception.Message)" -ForegroundColor Yellow
- }
-}
-
-function Remove-Packages {
- try {
- $pkglist = (Get-WindowsPackage -Path "$scratchDir").PackageName
-
- $pkglist = $pkglist | Where-Object {
- $_ -NotLike "*ApplicationModel*" -AND
- $_ -NotLike "*indows-Client-LanguagePack*" -AND
- $_ -NotLike "*LanguageFeatures-Basic*" -AND
- $_ -NotLike "*Package_for_ServicingStack*" -AND
- $_ -NotLike "*.NET*" -AND
- $_ -NotLike "*Store*" -AND
- $_ -NotLike "*VCLibs*" -AND
- $_ -NotLike "*AAD.BrokerPlugin",
- $_ -NotLike "*LockApp*" -AND
- $_ -NotLike "*Notepad*" -AND
- $_ -NotLike "*immersivecontrolpanel*" -AND
- $_ -NotLike "*ContentDeliveryManager*" -AND
- $_ -NotLike "*PinningConfirMationDialog*" -AND
- $_ -NotLike "*SecHealthUI*" -AND
- $_ -NotLike "*SecureAssessmentBrowser*" -AND
- $_ -NotLike "*PrintDialog*" -AND
- $_ -NotLike "*AssignedAccessLockApp*" -AND
- $_ -NotLike "*OOBENetworkConnectionFlow*" -AND
- $_ -NotLike "*Apprep.ChxApp*" -AND
- $_ -NotLike "*CBS*" -AND
- $_ -NotLike "*OOBENetworkCaptivePortal*" -AND
- $_ -NotLike "*PeopleExperienceHost*" -AND
- $_ -NotLike "*ParentalControls*" -AND
- $_ -NotLike "*Win32WebViewHost*" -AND
- $_ -NotLike "*InputApp*" -AND
- $_ -NotLike "*DirectPlay*" -AND
- $_ -NotLike "*AccountsControl*" -AND
- $_ -NotLike "*AsyncTextService*" -AND
- $_ -NotLike "*CapturePicker*" -AND
- $_ -NotLike "*CredDialogHost*" -AND
- $_ -NotLike "*BioEnrollMent*" -AND
- $_ -NotLike "*ShellExperienceHost*" -AND
- $_ -NotLike "*DesktopAppInstaller*" -AND
- $_ -NotLike "*WebMediaExtensions*" -AND
- $_ -NotLike "*WMIC*" -AND
- $_ -NotLike "*UI.XaML*" -AND
- $_ -NotLike "*Ethernet*" -AND
- $_ -NotLike "*Wifi*" -AND
- $_ -NotLike "*FodMetadata*" -AND
- $_ -NotLike "*Foundation*" -AND
- $_ -NotLike "*LanguageFeatures*" -AND
- $_ -NotLike "*VBSCRIPT*" -AND
- $_ -NotLike "*License*"
- }
-
- $failedCount = 0
-
- $erroredPackages = [System.Collections.Generic.List[ErroredPackage]]::new()
-
- foreach ($pkg in $pkglist) {
- try {
- $status = "Removing $pkg"
- Write-Progress -Activity "Removing Packages" -Status $status -PercentComplete ($counter++/$pkglist.Count*100)
- Remove-WindowsPackage -Path "$scratchDir" -PackageName $pkg -NoRestart -ErrorAction SilentlyContinue
- } catch {
- # This can happen if the package that is being removed is a permanent one
- $erroredPackages.Add([ErroredPackage]::new($pkg, $_.Exception.Message))
- $failedCount += 1
- continue
- }
- }
- Write-Progress -Activity "Removing Packages" -Status "Ready" -Completed
- if ($failedCount -gt 0)
- {
- Write-Host "$failedCount package(s) could not be removed. Your image will still work fine, however. Below is information on what packages failed to be removed and why."
- if ($erroredPackages.Count -gt 0)
- {
- $erroredPackages = $erroredPackages | Sort-Object -Property ErrorMessage
-
- $previousErroredPackage = $erroredPackages[0]
- $counter = 0
- Write-Host ""
- Write-Host "- $($previousErroredPackage.ErrorMessage)"
- foreach ($erroredPackage in $erroredPackages) {
- if ($erroredPackage.ErrorMessage -ne $previousErroredPackage.ErrorMessage) {
- Write-Host ""
- $counter = 0
- Write-Host "- $($erroredPackage.ErrorMessage)"
- }
- $counter += 1
- Write-Host " $counter) $($erroredPackage.PackageName)"
- $previousErroredPackage = $erroredPackage
- }
- Write-Host ""
- }
- }
- } catch {
- Write-Host "Unable to get information about the packages. MicroWin processing will continue, but packages will not be processed"
- Write-Host "Error information: $($_.Exception.Message)" -ForegroundColor Yellow
- }
-}
-
-function Remove-ProvisionedPackages() {
- <#
- .SYNOPSIS
- Removes AppX packages from a Windows image during MicroWin processing
-
- .PARAMETER Name
- No Params
-
- .EXAMPLE
- Remove-ProvisionedPackages
- #>
- try
- {
- $appxProvisionedPackages = Get-AppxProvisionedPackage -Path "$($scratchDir)" | Where-Object {
- $_.PackageName -NotLike "*AppInstaller*" -AND
- $_.PackageName -NotLike "*Store*" -and
- $_.PackageName -NotLike "*Notepad*" -and
- $_.PackageName -NotLike "*Printing*" -and
- $_.PackageName -NotLike "*YourPhone*" -and
- $_.PackageName -NotLike "*Xbox*" -and
- $_.PackageName -NotLike "*WindowsTerminal*" -and
- $_.PackageName -NotLike "*Calculator*" -and
- $_.PackageName -NotLike "*Photos*" -and
- $_.PackageName -NotLike "*VCLibs*" -and
- $_.PackageName -NotLike "*Paint*" -and
- $_.PackageName -NotLike "*Gaming*" -and
- $_.PackageName -NotLike "*Extension*" -and
- $_.PackageName -NotLike "*SecHealthUI*" -and
- $_.PackageName -NotLike "*ScreenSketch*"
- }
-
- $counter = 0
- foreach ($appx in $appxProvisionedPackages) {
- $status = "Removing Provisioned $($appx.PackageName)"
- Write-Progress -Activity "Removing Provisioned Apps" -Status $status -PercentComplete ($counter++/$appxProvisionedPackages.Count*100)
- try {
- Remove-AppxProvisionedPackage -Path "$scratchDir" -PackageName $appx.PackageName -ErrorAction SilentlyContinue
- } catch {
- Write-Host "Application $($appx.PackageName) could not be removed"
- continue
- }
- }
- Write-Progress -Activity "Removing Provisioned Apps" -Status "Ready" -Completed
- }
- catch
- {
- # This can happen if getting AppX packages fails
- Write-Host "Unable to get information about the AppX packages. MicroWin processing will continue, but AppX packages will not be processed"
- Write-Host "Error information: $($_.Exception.Message)" -ForegroundColor Yellow
- }
-}
-
-function Get-LocalizedUsers
-{
- <#
- .SYNOPSIS
- Gets a localized user group representation for ICACLS commands (Port from DISMTools PE Helper)
- .PARAMETER admins
- Determines whether to get a localized user group representation for the Administrators user group
- .OUTPUTS
- A string containing the localized user group
- .EXAMPLE
- Get-LocalizedUsers -admins $true
- #>
- param (
- [Parameter(Mandatory = $true, Position = 0)] [bool]$admins
- )
- if ($admins)
- {
- return (Get-LocalGroup | Where-Object { $_.SID.Value -like "S-1-5-32-544" }).Name
- }
- else
- {
- return (Get-LocalGroup | Where-Object { $_.SID.Value -like "S-1-5-32-545" }).Name
- }
-}
-
-function Copy-ToUSB([string]$fileToCopy) {
- foreach ($volume in Get-Volume) {
- if ($volume -and $volume.FileSystemLabel -ieq "ventoy") {
- $destinationPath = "$($volume.DriveLetter):\"
- #Copy-Item -Path $fileToCopy -Destination $destinationPath -Force
- # Get the total size of the file
- $totalSize = (Get-Item "$fileToCopy").length
-
- Copy-Item -Path "$fileToCopy" -Destination "$destinationPath" -Verbose -Force -Recurse -Container -PassThru |
- ForEach-Object {
- # Calculate the percentage completed
- $completed = ($_.BytesTransferred / $totalSize) * 100
-
- # Display the progress bar
- Write-Progress -Activity "Copying File" -Status "Progress" -PercentComplete $completed -CurrentOperation ("{0:N2} MB / {1:N2} MB" -f ($_.BytesTransferred / 1MB), ($totalSize / 1MB))
- }
-
- Write-Host "File copied to Ventoy drive $($volume.DriveLetter)"
- return
- }
- }
- Write-Host "Ventoy USB Key is not inserted"
-}
-
-function Remove-FileOrDirectory([string]$pathToDelete, [string]$mask = "", [switch]$Directory = $false) {
- if(([string]::IsNullOrEmpty($pathToDelete))) { return }
- if (-not (Test-Path -Path "$($pathToDelete)")) { return }
-
- $yesNo = Get-LocalizedYesNo
- Write-Host "[INFO] In Your local takeown expects '$($yesNo[0])' as a Yes answer."
-
- $itemsToDelete = [System.Collections.ArrayList]::new()
-
- if ($mask -eq "") {
- Write-Debug "Adding $($pathToDelete) to array."
- [void]$itemsToDelete.Add($pathToDelete)
- } else {
- Write-Debug "Adding $($pathToDelete) to array and mask is $($mask)"
- if ($Directory) { $itemsToDelete = Get-ChildItem $pathToDelete -Include $mask -Recurse -Directory } else { $itemsToDelete = Get-ChildItem $pathToDelete -Include $mask -Recurse }
- }
-
- foreach($itemToDelete in $itemsToDelete) {
- $status = "Deleting $($itemToDelete)"
- Write-Progress -Activity "Removing Items" -Status $status -PercentComplete ($counter++/$itemsToDelete.Count*100)
-
- if (Test-Path -Path "$($itemToDelete)" -PathType Container) {
- $status = "Deleting directory: $($itemToDelete)"
-
- takeown /r /d $yesNo[0] /a /f "$($itemToDelete)"
- icacls "$($itemToDelete)" /q /c /t /reset
- icacls $itemToDelete /setowner "*S-1-5-32-544"
- icacls $itemToDelete /grant "*S-1-5-32-544:(OI)(CI)F" /t /c /q
- Remove-Item -Force -Recurse "$($itemToDelete)"
- }
- elseif (Test-Path -Path "$($itemToDelete)" -PathType Leaf) {
- $status = "Deleting file: $($itemToDelete)"
-
- takeown /a /f "$($itemToDelete)"
- icacls "$($itemToDelete)" /q /c /t /reset
- icacls "$($itemToDelete)" /setowner "*S-1-5-32-544"
- icacls "$($itemToDelete)" /grant "*S-1-5-32-544:(OI)(CI)F" /t /c /q
- Remove-Item -Force "$($itemToDelete)"
- }
- }
- Write-Progress -Activity "Removing Items" -Status "Ready" -Completed
-}
-
-function New-Unattend {
-
- param (
- [Parameter(Mandatory, Position = 0)] [string]$userName,
- [Parameter(Position = 1)] [string]$userPassword
- )
-
- $unattend = @'
-
-
- <#REPLACEME#>
-
-
-
-
- 1
- CMD /C echo LAU GG>C:\Windows\LogAuditUser.txt
- StartMenu
-
-
-
-
-
-
-
-
-
- USER-REPLACEME
- Administrators
-
- PW-REPLACEME
- true
-
-
-
-
-
- USER-REPLACEME
- true
- 1
-
- PW-REPLACEME
- true
-
-
-
- true
- true
- true
- true
- true
- true
- 3
-
-
-
- 1
- reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoLogonCount /t REG_DWORD /d 0 /f
-
-
- 2
- cmd.exe /c echo 23>c:\windows\csup.txt
-
-
- 3
- CMD /C echo GG>C:\Windows\LogOobeSystem.txt
-
-
- 4
- powershell -ExecutionPolicy Bypass -File c:\windows\FirstStartup.ps1
-
-
-
-
-
-'@
- $specPass = @'
-
-
- 0
-
-
- false
-
-
-
-
- 1
- reg.exe add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OOBE" /v BypassNRO /t REG_DWORD /d 1 /f
-
-
- 2
- reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"
-
-
- 3
- reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\Runonce" /v "UninstallCopilot" /t REG_SZ /d "powershell.exe -NoProfile -Command \"Get-AppxPackage -Name 'Microsoft.Windows.Ai.Copilot.Provider' | Remove-AppxPackage;\"" /f
-
-
- 4
- reg.exe add "HKU\DefaultUser\Software\Policies\Microsoft\Windows\WindowsCopilot" /v TurnOffWindowsCopilot /t REG_DWORD /d 1 /f
-
-
- 5
- reg.exe unload "HKU\DefaultUser"
-
-
- 6
- reg.exe delete "HKLM\SOFTWARE\Microsoft\WindowsUpdate\Orchestrator\UScheduler_Oobe\DevHomeUpdate" /f
-
-
- 7
- reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"
-
-
- 8
- reg.exe add "HKU\DefaultUser\Software\Microsoft\Notepad" /v ShowStoreBanner /t REG_DWORD /d 0 /f
-
-
- 9
- reg.exe unload "HKU\DefaultUser"
-
-
- 10
- cmd.exe /c "del "C:\Users\Default\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\OneDrive.lnk""
-
-
- 11
- cmd.exe /c "del "C:\Windows\System32\OneDriveSetup.exe""
-
-
- 12
- cmd.exe /c "del "C:\Windows\SysWOW64\OneDriveSetup.exe""
-
-
- 13
- reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"
-
-
- 14
- reg.exe delete "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\Run" /v OneDriveSetup /f
-
-
- 15
- reg.exe unload "HKU\DefaultUser"
-
-
- 16
- reg.exe delete "HKLM\SOFTWARE\Microsoft\WindowsUpdate\Orchestrator\UScheduler_Oobe\OutlookUpdate" /f
-
-
- 17
- reg.exe add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Communications" /v ConfigureChatAutoInstall /t REG_DWORD /d 0 /f
-
-
- 18
- powershell.exe -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;"
-
-
- 19
- powershell.exe -NoProfile -Command "Get-Content -LiteralPath 'C:\Windows\Temp\remove-packages.ps1' -Raw | Invoke-Expression;"
-
-
- 20
- powershell.exe -NoProfile -Command "Get-Content -LiteralPath 'C:\Windows\Temp\remove-caps.ps1' -Raw | Invoke-Expression;"
-
-
- 21
- reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\current\device\Start" /v ConfigureStartPins /t REG_SZ /d "{ \"pinnedList\": [] }" /f
-
-
- 22
- reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\current\device\Start" /v ConfigureStartPins_ProviderSet /t REG_DWORD /d 1 /f
-
-
- 23
- reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\current\device\Start" /v ConfigureStartPins_WinningProvider /t REG_SZ /d B5292708-1619-419B-9923-E5D9F3925E71 /f
-
-
- 24
- reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\providers\B5292708-1619-419B-9923-E5D9F3925E71\default\Device\Start" /v ConfigureStartPins /t REG_SZ /d "{ \"pinnedList\": [] }" /f
-
-
- 25
- reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\providers\B5292708-1619-419B-9923-E5D9F3925E71\default\Device\Start" /v ConfigureStartPins_LastWrite /t REG_DWORD /d 1 /f
-
-
- 26
- net.exe accounts /maxpwage:UNLIMITED
-
-
- 27
- reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\FileSystem" /v LongPathsEnabled /t REG_DWORD /d 1 /f
-
-
- 28
- reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Power" /v HiberbootEnabled /t REG_DWORD /d 0 /f
-
-
- 29
- reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Dsh" /v AllowNewsAndInterests /t REG_DWORD /d 0 /f
-
-
- 30
- reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"
-
-
- 31
- reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "ContentDeliveryAllowed" /t REG_DWORD /d 0 /f
-
-
- 32
- reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "FeatureManagementEnabled" /t REG_DWORD /d 0 /f
-
-
- 33
- reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "OEMPreInstalledAppsEnabled" /t REG_DWORD /d 0 /f
-
-
- 34
- reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "PreInstalledAppsEnabled" /t REG_DWORD /d 0 /f
-
-
- 35
- reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "PreInstalledAppsEverEnabled" /t REG_DWORD /d 0 /f
-
-
- 36
- reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SilentInstalledAppsEnabled" /t REG_DWORD /d 0 /f
-
-
- 37
- reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SoftLandingEnabled" /t REG_DWORD /d 0 /f
-
-
- 38
- reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContentEnabled" /t REG_DWORD /d 0 /f
-
-
- 39
- reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-310093Enabled" /t REG_DWORD /d 0 /f
-
-
- 40
- reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338387Enabled" /t REG_DWORD /d 0 /f
-
-
- 41
- reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338388Enabled" /t REG_DWORD /d 0 /f
-
-
- 42
- reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338389Enabled" /t REG_DWORD /d 0 /f
-
-
- 43
- reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338393Enabled" /t REG_DWORD /d 0 /f
-
-
- 44
- reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-353698Enabled" /t REG_DWORD /d 0 /f
-
-
- 45
- reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SystemPaneSuggestionsEnabled" /t REG_DWORD /d 0 /f
-
-
- 46
- reg.exe unload "HKU\DefaultUser"
-
-
- 47
- reg.exe add "HKLM\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableWindowsConsumerFeatures" /t REG_DWORD /d 0 /f
-
-
- 48
- reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\BitLocker" /v "PreventDeviceEncryption" /t REG_DWORD /d 1 /f
-
-
- 49
- reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"
-
-
- 50
- reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\Runonce" /v "ClassicContextMenu" /t REG_SZ /d "reg.exe add \"HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32\" /ve /f" /f
-
-
- 51
- reg.exe unload "HKU\DefaultUser"
-
-
-
-
-'@
- if ((Test-CompatibleImage $imgVersion $([System.Version]::new(10,0,22000,1))) -eq $false) {
- # Replace the placeholder text with an empty string to make it valid for Windows 10 Setup
- $unattend = $unattend.Replace("<#REPLACEME#>", "").Trim()
- } else {
- # Replace the placeholder text with the Specialize pass
- $unattend = $unattend.Replace("<#REPLACEME#>", $specPass).Trim()
- }
- # Replace default User and Password values with the provided parameters
- $unattend = $unattend.Replace("USER-REPLACEME", $userName).Trim()
- $unattend = $unattend.Replace("PW-REPLACEME", $userPassword).Trim()
-
- # Save unattended answer file with UTF-8 encoding
- $unattend | Out-File -FilePath "$env:temp\unattend.xml" -Force -Encoding utf8
-}
-
-function New-CheckInstall {
-
- # using here string to embedd firstrun
- $checkInstall = @'
- @echo off
- if exist "%HOMEDRIVE%\windows\cpu.txt" (
- echo %HOMEDRIVE%\windows\cpu.txt exists
- ) else (
- echo %HOMEDRIVE%\windows\cpu.txt does not exist
- )
- if exist "%HOMEDRIVE%\windows\SerialNumber.txt" (
- echo %HOMEDRIVE%\windows\SerialNumber.txt exists
- ) else (
- echo %HOMEDRIVE%\windows\SerialNumber.txt does not exist
- )
- if exist "%HOMEDRIVE%\unattend.xml" (
- echo %HOMEDRIVE%\unattend.xml exists
- ) else (
- echo %HOMEDRIVE%\unattend.xml does not exist
- )
- if exist "%HOMEDRIVE%\Windows\Setup\Scripts\SetupComplete.cmd" (
- echo %HOMEDRIVE%\Windows\Setup\Scripts\SetupComplete.cmd exists
- ) else (
- echo %HOMEDRIVE%\Windows\Setup\Scripts\SetupComplete.cmd does not exist
- )
- if exist "%HOMEDRIVE%\Windows\Panther\unattend.xml" (
- echo %HOMEDRIVE%\Windows\Panther\unattend.xml exists
- ) else (
- echo %HOMEDRIVE%\Windows\Panther\unattend.xml does not exist
- )
- if exist "%HOMEDRIVE%\Windows\System32\Sysprep\unattend.xml" (
- echo %HOMEDRIVE%\Windows\System32\Sysprep\unattend.xml exists
- ) else (
- echo %HOMEDRIVE%\Windows\System32\Sysprep\unattend.xml does not exist
- )
- if exist "%HOMEDRIVE%\Windows\FirstStartup.ps1" (
- echo %HOMEDRIVE%\Windows\FirstStartup.ps1 exists
- ) else (
- echo %HOMEDRIVE%\Windows\FirstStartup.ps1 does not exist
- )
- if exist "%HOMEDRIVE%\Windows\winutil.ps1" (
- echo %HOMEDRIVE%\Windows\winutil.ps1 exists
- ) else (
- echo %HOMEDRIVE%\Windows\winutil.ps1 does not exist
- )
- if exist "%HOMEDRIVE%\Windows\LogSpecialize.txt" (
- echo %HOMEDRIVE%\Windows\LogSpecialize.txt exists
- ) else (
- echo %HOMEDRIVE%\Windows\LogSpecialize.txt does not exist
- )
- if exist "%HOMEDRIVE%\Windows\LogAuditUser.txt" (
- echo %HOMEDRIVE%\Windows\LogAuditUser.txt exists
- ) else (
- echo %HOMEDRIVE%\Windows\LogAuditUser.txt does not exist
- )
- if exist "%HOMEDRIVE%\Windows\LogOobeSystem.txt" (
- echo %HOMEDRIVE%\Windows\LogOobeSystem.txt exists
- ) else (
- echo %HOMEDRIVE%\Windows\LogOobeSystem.txt does not exist
- )
- if exist "%HOMEDRIVE%\windows\csup.txt" (
- echo %HOMEDRIVE%\windows\csup.txt exists
- ) else (
- echo %HOMEDRIVE%\windows\csup.txt does not exist
- )
- if exist "%HOMEDRIVE%\windows\LogFirstRun.txt" (
- echo %HOMEDRIVE%\windows\LogFirstRun.txt exists
- ) else (
- echo %HOMEDRIVE%\windows\LogFirstRun.txt does not exist
- )
-'@
- $checkInstall | Out-File -FilePath "$env:temp\checkinstall.cmd" -Force -Encoding Ascii
-}
-
-function New-FirstRun {
-
- # using here string to embedd firstrun
- $firstRun = @'
- # Set the global error action preference to continue
- $ErrorActionPreference = "Continue"
- function Remove-RegistryValue {
- param (
- [Parameter(Mandatory = $true)]
- [string]$RegistryPath,
-
- [Parameter(Mandatory = $true)]
- [string]$ValueName
- )
-
- # Check if the registry path exists
- if (Test-Path -Path $RegistryPath) {
- $registryValue = Get-ItemProperty -Path $RegistryPath -Name $ValueName -ErrorAction SilentlyContinue
-
- # Check if the registry value exists
- if ($registryValue) {
- # Remove the registry value
- Remove-ItemProperty -Path $RegistryPath -Name $ValueName -Force
- Write-Host "Registry value '$ValueName' removed from '$RegistryPath'."
- } else {
- Write-Host "Registry value '$ValueName' not found in '$RegistryPath'."
- }
- } else {
- Write-Host "Registry path '$RegistryPath' not found."
- }
- }
-
- "FirstStartup has worked" | Out-File -FilePath "$env:HOMEDRIVE\windows\LogFirstRun.txt" -Append -NoClobber
-
- $taskbarPath = "$env:AppData\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar"
- # Delete all files on the Taskbar
- Get-ChildItem -Path $taskbarPath -File | Remove-Item -Force
- Remove-RegistryValue -RegistryPath "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband" -ValueName "FavoritesRemovedChanges"
- Remove-RegistryValue -RegistryPath "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband" -ValueName "FavoritesChanges"
- Remove-RegistryValue -RegistryPath "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband" -ValueName "Favorites"
-
- # Delete Edge Icon from the desktop
- $edgeShortcutFiles = Get-ChildItem -Path $desktopPath -Filter "*Edge*.lnk"
- # Check if Edge shortcuts exist on the desktop
- if ($edgeShortcutFiles) {
- foreach ($shortcutFile in $edgeShortcutFiles) {
- # Remove each Edge shortcut
- Remove-Item -Path $shortcutFile.FullName -Force
- Write-Host "Edge shortcut '$($shortcutFile.Name)' removed from the desktop."
- }
- }
- Remove-Item -Path "$env:USERPROFILE\Desktop\*.lnk"
- Remove-Item -Path "$env:HOMEDRIVE\Users\Default\Desktop\*.lnk"
-
- try
- {
- if ((Get-WindowsOptionalFeature -Online | Where-Object { $_.FeatureName -like "Recall" }).Count -gt 0)
- {
- Disable-WindowsOptionalFeature -Online -FeatureName "Recall" -Remove
- }
- }
- catch
- {
-
- }
-'@
- $firstRun | Out-File -FilePath "$env:temp\FirstStartup.ps1" -Force
-}
diff --git a/functions/public/Invoke-WPFButton.ps1 b/functions/public/Invoke-WPFButton.ps1
index 6473f693..7fe63d62 100644
--- a/functions/public/Invoke-WPFButton.ps1
+++ b/functions/public/Invoke-WPFButton.ps1
@@ -52,8 +52,8 @@ function Invoke-WPFButton {
"WPFUpdatessecurity" {Invoke-WPFUpdatessecurity}
"WPFGetInstalled" {Invoke-WPFGetInstalled -CheckBox "winget"}
"WPFGetInstalledTweaks" {Invoke-WPFGetInstalled -CheckBox "tweaks"}
- "WPFGetIso" {Invoke-WPFGetIso}
- "WPFMicrowin" {Invoke-WPFMicrowin}
+ "WPFGetIso" {Invoke-MicrowinGetIso}
+ "WPFMicrowin" {Invoke-Microwin}
"WPFCloseButton" {Invoke-WPFCloseButton}
"MicrowinScratchDirBT" {Invoke-ScratchDialog}
"WPFWinUtilPSProfile" {Invoke-WinUtilpsProfile}
diff --git a/scripts/main.ps1 b/scripts/main.ps1
index 9186fb9c..c1c7097c 100644
--- a/scripts/main.ps1
+++ b/scripts/main.ps1
@@ -10,7 +10,7 @@ $InitialSessionState = [System.Management.Automation.Runspaces.InitialSessionSta
$InitialSessionState.Variables.Add($hashVars)
# Get every private function and add them to the session state
-$functions = (Get-ChildItem function:\).where{$_.name -like "*winutil*" -or $_.name -like "*WPF*"}
+$functions = Get-ChildItem function:\ | Where-Object { $_.Name -imatch 'winutil|Microwin|WPF' }
foreach ($function in $functions) {
$functionDefinition = Get-Content function:\$($function.name)
$functionEntry = New-Object System.Management.Automation.Runspaces.SessionStateFunctionEntry -ArgumentList $($function.name), $functionDefinition
@@ -413,7 +413,7 @@ $sync["ISOmanual"].add_Checked({
$sync["ISORelease"].Items.Add("24H2") | Out-Null
$sync["ISORelease"].SelectedItem = "24H2"
-$sync["ISOLanguage"].Items.Add("System Language ($(Get-FidoLangFromCulture -langName $((Get-Culture).Name)))") | Out-Null
+$sync["ISOLanguage"].Items.Add("System Language ($(Microwin-GetLangFromCulture -langName $((Get-Culture).Name)))") | Out-Null
if ($currentCulture -ne "English International") {
$sync["ISOLanguage"].Items.Add("English International") | Out-Null
}