From a6c83370494700f4b1013d1e323fdc266d441724 Mon Sep 17 00:00:00 2001 From: MyDrift Date: Mon, 7 Oct 2024 23:22:16 +0200 Subject: [PATCH 1/5] move Microwin related stuff to own Folder under "Functions" --- config/autounattend.xml | 6 +- .../Invoke-Microwin.ps1} | 62 +- functions/microwin/Invoke-MicrowinClasses.ps1 | 10 + .../microwin/Invoke-MicrowinCopyToUSB.ps1 | 23 + .../Invoke-MicrowinGetIso.ps1} | 6 +- .../Invoke-MicrowinGetLangFromCulture.ps1 | 49 + .../Invoke-MicrowinGetOscdimg.ps1} | 4 +- .../Invoke-MicrowinNewCheckInstall.ps1 | 73 ++ .../microwin/Invoke-MicrowinNewFirstRun.ps1 | 103 +++ .../microwin/Invoke-MicrowinNewUnattend.ps1 | 310 +++++++ .../Invoke-MicrowinRemoveFeatures.ps1 | 41 + .../Invoke-MicrowinRemoveFileOrDirectory.ps1 | 42 + .../Invoke-MicrowinRemovePackages.ps1 | 96 ++ ...voke-MicrowinRemoveProvisionedPackages.ps1 | 51 ++ .../Invoke-MicrowinTestCompatibleImage.ps1 | 26 + .../private/Invoke-WinUtilMicroWin-Helper.ps1 | 834 ------------------ functions/public/Invoke-WPFButton.ps1 | 4 +- scripts/main.ps1 | 2 +- 18 files changed, 866 insertions(+), 876 deletions(-) rename functions/{public/Invoke-WPFMicrowin.ps1 => microwin/Invoke-Microwin.ps1} (88%) create mode 100644 functions/microwin/Invoke-MicrowinClasses.ps1 create mode 100644 functions/microwin/Invoke-MicrowinCopyToUSB.ps1 rename functions/{public/Invoke-WPFGetIso.ps1 => microwin/Invoke-MicrowinGetIso.ps1} (98%) create mode 100644 functions/microwin/Invoke-MicrowinGetLangFromCulture.ps1 rename functions/{private/Get-Oscdimg.ps1 => microwin/Invoke-MicrowinGetOscdimg.ps1} (92%) create mode 100644 functions/microwin/Invoke-MicrowinNewCheckInstall.ps1 create mode 100644 functions/microwin/Invoke-MicrowinNewFirstRun.ps1 create mode 100644 functions/microwin/Invoke-MicrowinNewUnattend.ps1 create mode 100644 functions/microwin/Invoke-MicrowinRemoveFeatures.ps1 create mode 100644 functions/microwin/Invoke-MicrowinRemoveFileOrDirectory.ps1 create mode 100644 functions/microwin/Invoke-MicrowinRemovePackages.ps1 create mode 100644 functions/microwin/Invoke-MicrowinRemoveProvisionedPackages.ps1 create mode 100644 functions/microwin/Invoke-MicrowinTestCompatibleImage.ps1 delete mode 100644 functions/private/Invoke-WinUtilMicroWin-Helper.ps1 diff --git a/config/autounattend.xml b/config/autounattend.xml index 6a432641..6cfe33a4 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\Invoke-MicrowinRemovePackages.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\Invoke-MicrowinRemovePackages.log'; & { $installed = & $getCommand; foreach( $selector in $selectors ) { diff --git a/functions/public/Invoke-WPFMicrowin.ps1 b/functions/microwin/Invoke-Microwin.ps1 similarity index 88% rename from functions/public/Invoke-WPFMicrowin.ps1 rename to functions/microwin/Invoke-Microwin.ps1 index 4b90a5bc..aedcbc3e 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 ((Invoke-MicrowinTestCompatibleImage $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 ((Invoke-MicrowinTestCompatibleImage $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,47 +155,47 @@ public class PowerManagement { } Write-Host "Remove Features from the image" - Remove-Features + Invoke-MicrowinRemoveFeatures Write-Host "Removing features complete!" Write-Host "Removing OS packages" - Remove-Packages + Invoke-MicrowinRemovePackages Write-Host "Removing Appx Bloat" - Remove-ProvisionedPackages + Invoke-MicrowinRemoveProvisionedPackages - 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 + Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\LogFiles\WMI\RtBackup" -Directory + Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\DiagTrack" -Directory + Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\InboxApps" -Directory + Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\LocationNotificationWindows.exe" + Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Windows Photo Viewer" -Directory + Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Windows Photo Viewer" -Directory + Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Windows Media Player" -Directory + Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Windows Media Player" -Directory + Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Windows Mail" -Directory + Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Windows Mail" -Directory + Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Internet Explorer" -Directory + Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Internet Explorer" -Directory + Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\GameBarPresenceWriter" + Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\OneDriveSetup.exe" + Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\OneDrive.ico" + Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\SystemApps" -mask "*narratorquickstart*" -Directory + Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\SystemApps" -mask "*ParentalControls*" -Directory Write-Host "Removal complete!" Write-Host "Create unattend.xml" - #New-Unattend + #Invoke-MicrowinNewUnattend if ($sync.MicrowinUserName.Text -eq "") { - New-Unattend -userName "User" + Invoke-MicrowinNewUnattend -userName "User" } else { if ($sync.MicrowinUserPassword.Password -eq "") { - New-Unattend -userName "$($sync.MicrowinUserName.Text)" + Invoke-MicrowinNewUnattend -userName "$($sync.MicrowinUserName.Text)" } else { - New-Unattend -userName "$($sync.MicrowinUserName.Text)" -userPassword "$($sync.MicrowinUserPassword.Password)" + Invoke-MicrowinNewUnattend -userName "$($sync.MicrowinUserName.Text)" -userPassword "$($sync.MicrowinUserPassword.Password)" } } Write-Host "Done Create unattend.xml" @@ -208,7 +208,7 @@ public class PowerManagement { Write-Host "Done Copy unattend.xml" Write-Host "Create FirstRun" - New-FirstRun + Invoke-MicrowinNewFirstRun Write-Host "Done create FirstRun" Write-Host "Copy FirstRun.ps1 into the ISO" Copy-Item "$env:temp\FirstStartup.ps1" "$($scratchDir)\Windows\FirstStartup.ps1" -force @@ -220,7 +220,7 @@ public class PowerManagement { dism /English /image:$($scratchDir) /set-profilepath:"$($scratchDir)\Windows\Users\Default" Write-Host "Copy checkinstall.cmd into the ISO" - New-CheckInstall + Invoke-MicrowinNewCheckInstall Copy-Item "$env:temp\checkinstall.cmd" "$($scratchDir)\Windows\checkinstall.cmd" -force Write-Host "Done copy checkinstall.cmd" @@ -296,7 +296,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 ((Invoke-MicrowinTestCompatibleImage $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) @@ -408,7 +408,7 @@ public class PowerManagement { if ($copyToUSB) { Write-Host "Copying target ISO to the USB drive" - Copy-ToUSB("$($SaveDialog.FileName)") + Invoke-MicrowinCopyToUSB("$($SaveDialog.FileName)") if ($?) { Write-Host "Done Copying target ISO to USB drive!" } else { Write-Host "ISO copy failed." } } diff --git a/functions/microwin/Invoke-MicrowinClasses.ps1 b/functions/microwin/Invoke-MicrowinClasses.ps1 new file mode 100644 index 00000000..4c5ad676 --- /dev/null +++ b/functions/microwin/Invoke-MicrowinClasses.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/Invoke-MicrowinCopyToUSB.ps1 b/functions/microwin/Invoke-MicrowinCopyToUSB.ps1 new file mode 100644 index 00000000..c6389234 --- /dev/null +++ b/functions/microwin/Invoke-MicrowinCopyToUSB.ps1 @@ -0,0 +1,23 @@ +function Invoke-MicrowinCopyToUSB([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/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..9e438662 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 + Invoke-MicrowinGetOscdimg -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 + Invoke-MicrowinGetLangFromCulture -langName (Get-Culture).Name } else { $sync["ISOLanguage"].SelectedItem } diff --git a/functions/microwin/Invoke-MicrowinGetLangFromCulture.ps1 b/functions/microwin/Invoke-MicrowinGetLangFromCulture.ps1 new file mode 100644 index 00000000..4a4234dc --- /dev/null +++ b/functions/microwin/Invoke-MicrowinGetLangFromCulture.ps1 @@ -0,0 +1,49 @@ +function Invoke-MicrowinGetLangFromCulture { + + 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/private/Get-Oscdimg.ps1 b/functions/microwin/Invoke-MicrowinGetOscdimg.ps1 similarity index 92% rename from functions/private/Get-Oscdimg.ps1 rename to functions/microwin/Invoke-MicrowinGetOscdimg.ps1 index 4680a39b..a515310c 100644 --- a/functions/private/Get-Oscdimg.ps1 +++ b/functions/microwin/Invoke-MicrowinGetOscdimg.ps1 @@ -1,10 +1,10 @@ -function Get-Oscdimg { +function Invoke-MicrowinGetOscdimg { <# .DESCRIPTION This function will download oscdimg file from github Release folders and put it into env:temp folder .EXAMPLE - Get-Oscdimg + Invoke-MicrowinGetOscdimg #> param( diff --git a/functions/microwin/Invoke-MicrowinNewCheckInstall.ps1 b/functions/microwin/Invoke-MicrowinNewCheckInstall.ps1 new file mode 100644 index 00000000..f1b2979b --- /dev/null +++ b/functions/microwin/Invoke-MicrowinNewCheckInstall.ps1 @@ -0,0 +1,73 @@ +function Invoke-MicrowinNewCheckInstall { + + # 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/Invoke-MicrowinNewFirstRun.ps1 b/functions/microwin/Invoke-MicrowinNewFirstRun.ps1 new file mode 100644 index 00000000..db056941 --- /dev/null +++ b/functions/microwin/Invoke-MicrowinNewFirstRun.ps1 @@ -0,0 +1,103 @@ +function Invoke-MicrowinNewFirstRun { + + # 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" + + # ************************************************ + # Create WinUtil shortcut on the desktop + # + $desktopPath = "$($env:USERPROFILE)\Desktop" + # Specify the target PowerShell command + $command = "powershell.exe -NoProfile -ExecutionPolicy Bypass -Command 'irm https://christitus.com/win | iex'" + # Specify the path for the shortcut + $shortcutPath = Join-Path $desktopPath 'winutil.lnk' + # Create a shell object + $shell = New-Object -ComObject WScript.Shell + + # Create a shortcut object + $shortcut = $shell.CreateShortcut($shortcutPath) + + if (Test-Path -Path "$env:HOMEDRIVE\Windows\cttlogo.png") { + $shortcut.IconLocation = "$env:HOMEDRIVE\Windows\cttlogo.png" + } + + # Set properties of the shortcut + $shortcut.TargetPath = "powershell.exe" + $shortcut.Arguments = "-NoProfile -ExecutionPolicy Bypass -Command `"$command`"" + # Save the shortcut + $shortcut.Save() + + # Make the shortcut have 'Run as administrator' property on + $bytes = [System.IO.File]::ReadAllBytes($shortcutPath) + # Set byte value at position 0x15 in hex, or 21 in decimal, from the value 0x00 to 0x20 in hex + $bytes[0x15] = $bytes[0x15] -bor 0x20 + [System.IO.File]::WriteAllBytes($shortcutPath, $bytes) + + Write-Host "Shortcut created at: $shortcutPath" + # + # Done create WinUtil shortcut on the desktop + # ************************************************ + + 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/Invoke-MicrowinNewUnattend.ps1 b/functions/microwin/Invoke-MicrowinNewUnattend.ps1 new file mode 100644 index 00000000..bd35b0a6 --- /dev/null +++ b/functions/microwin/Invoke-MicrowinNewUnattend.ps1 @@ -0,0 +1,310 @@ +function Invoke-MicrowinNewUnattend { + + 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</PlainText> + </Password> + </LocalAccount> + </LocalAccounts> + </UserAccounts> + <AutoLogon> + <Username>USER-REPLACEME</Username> + <Enabled>true</Enabled> + <LogonCount>1</LogonCount> + <Password> + <Value>PW-REPLACEME</Value> + <PlainText>true</PlainText> + </Password> + </AutoLogon> + <OOBE> + <HideOEMRegistrationScreen>true</HideOEMRegistrationScreen> + <SkipUserOOBE>true</SkipUserOOBE> + <SkipMachineOOBE>true</SkipMachineOOBE> + <HideOnlineAccountScreens>true</HideOnlineAccountScreens> + <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE> + <HideEULAPage>true</HideEULAPage> + <ProtectYourPC>3</ProtectYourPC> + </OOBE> + <FirstLogonCommands> + <SynchronousCommand wcm:action="add"> + <Order>1</Order> + <CommandLine>reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoLogonCount /t REG_DWORD /d 0 /f</CommandLine> + </SynchronousCommand> + <SynchronousCommand wcm:action="add"> + <Order>2</Order> + <CommandLine>cmd.exe /c echo 23&gt;c:\windows\csup.txt</CommandLine> + </SynchronousCommand> + <SynchronousCommand wcm:action="add"> + <Order>3</Order> + <CommandLine>CMD /C echo GG&gt;C:\Windows\LogOobeSystem.txt</CommandLine> + </SynchronousCommand> + <SynchronousCommand wcm:action="add"> + <Order>4</Order> + <CommandLine>powershell -ExecutionPolicy Bypass -File c:\windows\FirstStartup.ps1</CommandLine> + </SynchronousCommand> + </FirstLogonCommands> + </component> + </settings> + </unattend> +'@ + $specPass = @' +<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> + <component name="Microsoft-Windows-Deployment" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS"> + <RunSynchronous> + <RunSynchronousCommand wcm:action="add"> + <Order>1</Order> + <Path>reg.exe add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OOBE" /v BypassNRO /t REG_DWORD /d 1 /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>2</Order> + <Path>reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>3</Order> + <Path>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</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>4</Order> + <Path>reg.exe add "HKU\DefaultUser\Software\Policies\Microsoft\Windows\WindowsCopilot" /v TurnOffWindowsCopilot /t REG_DWORD /d 1 /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>5</Order> + <Path>reg.exe unload "HKU\DefaultUser"</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>6</Order> + <Path>reg.exe delete "HKLM\SOFTWARE\Microsoft\WindowsUpdate\Orchestrator\UScheduler_Oobe\DevHomeUpdate" /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>7</Order> + <Path>reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>8</Order> + <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Notepad" /v ShowStoreBanner /t REG_DWORD /d 0 /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>9</Order> + <Path>reg.exe unload "HKU\DefaultUser"</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>10</Order> + <Path>cmd.exe /c "del "C:\Users\Default\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\OneDrive.lnk""</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>11</Order> + <Path>cmd.exe /c "del "C:\Windows\System32\OneDriveSetup.exe""</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>12</Order> + <Path>cmd.exe /c "del "C:\Windows\SysWOW64\OneDriveSetup.exe""</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>13</Order> + <Path>reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>14</Order> + <Path>reg.exe delete "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\Run" /v OneDriveSetup /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>15</Order> + <Path>reg.exe unload "HKU\DefaultUser"</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>16</Order> + <Path>reg.exe delete "HKLM\SOFTWARE\Microsoft\WindowsUpdate\Orchestrator\UScheduler_Oobe\OutlookUpdate" /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>17</Order> + <Path>reg.exe add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Communications" /v ConfigureChatAutoInstall /t REG_DWORD /d 0 /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>18</Order> + <Path>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;"</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>19</Order> + <Path>powershell.exe -NoProfile -Command "Get-Content -LiteralPath 'C:\Windows\Temp\Invoke-MicrowinRemovePackages.ps1' -Raw | Invoke-Expression;"</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>20</Order> + <Path>powershell.exe -NoProfile -Command "Get-Content -LiteralPath 'C:\Windows\Temp\remove-caps.ps1' -Raw | Invoke-Expression;"</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>21</Order> + <Path>reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\current\device\Start" /v ConfigureStartPins /t REG_SZ /d "{ \"pinnedList\": [] }" /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>22</Order> + <Path>reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\current\device\Start" /v ConfigureStartPins_ProviderSet /t REG_DWORD /d 1 /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>23</Order> + <Path>reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\current\device\Start" /v ConfigureStartPins_WinningProvider /t REG_SZ /d B5292708-1619-419B-9923-E5D9F3925E71 /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>24</Order> + <Path>reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\providers\B5292708-1619-419B-9923-E5D9F3925E71\default\Device\Start" /v ConfigureStartPins /t REG_SZ /d "{ \"pinnedList\": [] }" /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>25</Order> + <Path>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</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>26</Order> + <Path>net.exe accounts /maxpwage:UNLIMITED</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>27</Order> + <Path>reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\FileSystem" /v LongPathsEnabled /t REG_DWORD /d 1 /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>28</Order> + <Path>reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Power" /v HiberbootEnabled /t REG_DWORD /d 0 /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>29</Order> + <Path>reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Dsh" /v AllowNewsAndInterests /t REG_DWORD /d 0 /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>30</Order> + <Path>reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>31</Order> + <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "ContentDeliveryAllowed" /t REG_DWORD /d 0 /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>32</Order> + <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "FeatureManagementEnabled" /t REG_DWORD /d 0 /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>33</Order> + <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "OEMPreInstalledAppsEnabled" /t REG_DWORD /d 0 /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>34</Order> + <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "PreInstalledAppsEnabled" /t REG_DWORD /d 0 /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>35</Order> + <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "PreInstalledAppsEverEnabled" /t REG_DWORD /d 0 /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>36</Order> + <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SilentInstalledAppsEnabled" /t REG_DWORD /d 0 /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>37</Order> + <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SoftLandingEnabled" /t REG_DWORD /d 0 /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>38</Order> + <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContentEnabled" /t REG_DWORD /d 0 /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>39</Order> + <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-310093Enabled" /t REG_DWORD /d 0 /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>40</Order> + <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338387Enabled" /t REG_DWORD /d 0 /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>41</Order> + <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338388Enabled" /t REG_DWORD /d 0 /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>42</Order> + <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338389Enabled" /t REG_DWORD /d 0 /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>43</Order> + <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338393Enabled" /t REG_DWORD /d 0 /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>44</Order> + <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-353698Enabled" /t REG_DWORD /d 0 /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>45</Order> + <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SystemPaneSuggestionsEnabled" /t REG_DWORD /d 0 /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>46</Order> + <Path>reg.exe unload "HKU\DefaultUser"</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>47</Order> + <Path>reg.exe add "HKLM\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableWindowsConsumerFeatures" /t REG_DWORD /d 0 /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>48</Order> + <Path>reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\BitLocker" /v "PreventDeviceEncryption" /t REG_DWORD /d 1 /f</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>49</Order> + <Path>reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>50</Order> + <Path>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</Path> + </RunSynchronousCommand> + <RunSynchronousCommand wcm:action="add"> + <Order>51</Order> + <Path>reg.exe unload "HKU\DefaultUser"</Path> + </RunSynchronousCommand> + </RunSynchronous> + </component> + </settings> +'@ + if ((Invoke-MicrowinTestCompatibleImage $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/Invoke-MicrowinRemoveFeatures.ps1 b/functions/microwin/Invoke-MicrowinRemoveFeatures.ps1 new file mode 100644 index 00000000..a3e4205a --- /dev/null +++ b/functions/microwin/Invoke-MicrowinRemoveFeatures.ps1 @@ -0,0 +1,41 @@ +function Invoke-MicrowinRemoveFeatures() { + <# + .SYNOPSIS + Removes certain features from ISO image + + .PARAMETER Name + No Params + + .EXAMPLE + Invoke-MicrowinRemoveFeatures + #> + 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 + $_.FeatureName -NotLike "*Recall*" -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 <installation media>\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/Invoke-MicrowinRemoveFileOrDirectory.ps1 b/functions/microwin/Invoke-MicrowinRemoveFileOrDirectory.ps1 new file mode 100644 index 00000000..fb08a1db --- /dev/null +++ b/functions/microwin/Invoke-MicrowinRemoveFileOrDirectory.ps1 @@ -0,0 +1,42 @@ +function Invoke-MicrowinRemoveFileOrDirectory([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/Invoke-MicrowinRemovePackages.ps1 b/functions/microwin/Invoke-MicrowinRemovePackages.ps1 new file mode 100644 index 00000000..f94fc9d6 --- /dev/null +++ b/functions/microwin/Invoke-MicrowinRemovePackages.ps1 @@ -0,0 +1,96 @@ +function Invoke-MicrowinRemovePackages { + 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/Invoke-MicrowinRemoveProvisionedPackages.ps1 b/functions/microwin/Invoke-MicrowinRemoveProvisionedPackages.ps1 new file mode 100644 index 00000000..33bd0d94 --- /dev/null +++ b/functions/microwin/Invoke-MicrowinRemoveProvisionedPackages.ps1 @@ -0,0 +1,51 @@ +function Invoke-MicrowinRemoveProvisionedPackages() { + <# + .SYNOPSIS + Removes AppX packages from a Windows image during MicroWin processing + + .PARAMETER Name + No Params + + .EXAMPLE + Invoke-MicrowinRemoveProvisionedPackages + #> + 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/Invoke-MicrowinTestCompatibleImage.ps1 b/functions/microwin/Invoke-MicrowinTestCompatibleImage.ps1 new file mode 100644 index 00000000..c41bc276 --- /dev/null +++ b/functions/microwin/Invoke-MicrowinTestCompatibleImage.ps1 @@ -0,0 +1,26 @@ +function Invoke-MicrowinTestCompatibleImage() { + <# + .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 b38dc2a2..00000000 --- a/functions/private/Invoke-WinUtilMicroWin-Helper.ps1 +++ /dev/null @@ -1,834 +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 - $_.FeatureName -NotLike "*Recall*" -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 <installation media>\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 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 = @' - <?xml version="1.0" encoding="utf-8"?> - <unattend xmlns="urn:schemas-microsoft-com:unattend" - xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <#REPLACEME#> - <settings pass="auditUser"> - <component name="Microsoft-Windows-Deployment" 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"> - <RunSynchronous> - <RunSynchronousCommand wcm:action="add"> - <Order>1</Order> - <CommandLine>CMD /C echo LAU GG&gt;C:\Windows\LogAuditUser.txt</CommandLine> - <Description>StartMenu</Description> - </RunSynchronousCommand> - </RunSynchronous> - </component> - </settings> - <settings pass="oobeSystem"> - <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"> - <UserAccounts> - <LocalAccounts> - <LocalAccount wcm:action="add"> - <Name>USER-REPLACEME</Name> - <Group>Administrators</Group> - <Password> - <Value>PW-REPLACEME</Value> - <PlainText>true</PlainText> - </Password> - </LocalAccount> - </LocalAccounts> - </UserAccounts> - <AutoLogon> - <Username>USER-REPLACEME</Username> - <Enabled>true</Enabled> - <LogonCount>1</LogonCount> - <Password> - <Value>PW-REPLACEME</Value> - <PlainText>true</PlainText> - </Password> - </AutoLogon> - <OOBE> - <HideOEMRegistrationScreen>true</HideOEMRegistrationScreen> - <SkipUserOOBE>true</SkipUserOOBE> - <SkipMachineOOBE>true</SkipMachineOOBE> - <HideOnlineAccountScreens>true</HideOnlineAccountScreens> - <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE> - <HideEULAPage>true</HideEULAPage> - <ProtectYourPC>3</ProtectYourPC> - </OOBE> - <FirstLogonCommands> - <SynchronousCommand wcm:action="add"> - <Order>1</Order> - <CommandLine>reg.exe add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoLogonCount /t REG_DWORD /d 0 /f</CommandLine> - </SynchronousCommand> - <SynchronousCommand wcm:action="add"> - <Order>2</Order> - <CommandLine>cmd.exe /c echo 23&gt;c:\windows\csup.txt</CommandLine> - </SynchronousCommand> - <SynchronousCommand wcm:action="add"> - <Order>3</Order> - <CommandLine>CMD /C echo GG&gt;C:\Windows\LogOobeSystem.txt</CommandLine> - </SynchronousCommand> - <SynchronousCommand wcm:action="add"> - <Order>4</Order> - <CommandLine>powershell -ExecutionPolicy Bypass -File c:\windows\FirstStartup.ps1</CommandLine> - </SynchronousCommand> - </FirstLogonCommands> - </component> - </settings> - </unattend> -'@ - $specPass = @' -<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> - <component name="Microsoft-Windows-Deployment" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS"> - <RunSynchronous> - <RunSynchronousCommand wcm:action="add"> - <Order>1</Order> - <Path>reg.exe add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OOBE" /v BypassNRO /t REG_DWORD /d 1 /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>2</Order> - <Path>reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>3</Order> - <Path>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</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>4</Order> - <Path>reg.exe add "HKU\DefaultUser\Software\Policies\Microsoft\Windows\WindowsCopilot" /v TurnOffWindowsCopilot /t REG_DWORD /d 1 /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>5</Order> - <Path>reg.exe unload "HKU\DefaultUser"</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>6</Order> - <Path>reg.exe delete "HKLM\SOFTWARE\Microsoft\WindowsUpdate\Orchestrator\UScheduler_Oobe\DevHomeUpdate" /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>7</Order> - <Path>reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>8</Order> - <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Notepad" /v ShowStoreBanner /t REG_DWORD /d 0 /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>9</Order> - <Path>reg.exe unload "HKU\DefaultUser"</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>10</Order> - <Path>cmd.exe /c "del "C:\Users\Default\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\OneDrive.lnk""</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>11</Order> - <Path>cmd.exe /c "del "C:\Windows\System32\OneDriveSetup.exe""</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>12</Order> - <Path>cmd.exe /c "del "C:\Windows\SysWOW64\OneDriveSetup.exe""</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>13</Order> - <Path>reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>14</Order> - <Path>reg.exe delete "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\Run" /v OneDriveSetup /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>15</Order> - <Path>reg.exe unload "HKU\DefaultUser"</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>16</Order> - <Path>reg.exe delete "HKLM\SOFTWARE\Microsoft\WindowsUpdate\Orchestrator\UScheduler_Oobe\OutlookUpdate" /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>17</Order> - <Path>reg.exe add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Communications" /v ConfigureChatAutoInstall /t REG_DWORD /d 0 /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>18</Order> - <Path>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;"</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>19</Order> - <Path>powershell.exe -NoProfile -Command "Get-Content -LiteralPath 'C:\Windows\Temp\remove-packages.ps1' -Raw | Invoke-Expression;"</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>20</Order> - <Path>powershell.exe -NoProfile -Command "Get-Content -LiteralPath 'C:\Windows\Temp\remove-caps.ps1' -Raw | Invoke-Expression;"</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>21</Order> - <Path>reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\current\device\Start" /v ConfigureStartPins /t REG_SZ /d "{ \"pinnedList\": [] }" /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>22</Order> - <Path>reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\current\device\Start" /v ConfigureStartPins_ProviderSet /t REG_DWORD /d 1 /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>23</Order> - <Path>reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\current\device\Start" /v ConfigureStartPins_WinningProvider /t REG_SZ /d B5292708-1619-419B-9923-E5D9F3925E71 /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>24</Order> - <Path>reg.exe add "HKLM\SOFTWARE\Microsoft\PolicyManager\providers\B5292708-1619-419B-9923-E5D9F3925E71\default\Device\Start" /v ConfigureStartPins /t REG_SZ /d "{ \"pinnedList\": [] }" /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>25</Order> - <Path>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</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>26</Order> - <Path>net.exe accounts /maxpwage:UNLIMITED</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>27</Order> - <Path>reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\FileSystem" /v LongPathsEnabled /t REG_DWORD /d 1 /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>28</Order> - <Path>reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Power" /v HiberbootEnabled /t REG_DWORD /d 0 /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>29</Order> - <Path>reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Dsh" /v AllowNewsAndInterests /t REG_DWORD /d 0 /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>30</Order> - <Path>reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>31</Order> - <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "ContentDeliveryAllowed" /t REG_DWORD /d 0 /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>32</Order> - <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "FeatureManagementEnabled" /t REG_DWORD /d 0 /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>33</Order> - <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "OEMPreInstalledAppsEnabled" /t REG_DWORD /d 0 /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>34</Order> - <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "PreInstalledAppsEnabled" /t REG_DWORD /d 0 /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>35</Order> - <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "PreInstalledAppsEverEnabled" /t REG_DWORD /d 0 /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>36</Order> - <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SilentInstalledAppsEnabled" /t REG_DWORD /d 0 /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>37</Order> - <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SoftLandingEnabled" /t REG_DWORD /d 0 /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>38</Order> - <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContentEnabled" /t REG_DWORD /d 0 /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>39</Order> - <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-310093Enabled" /t REG_DWORD /d 0 /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>40</Order> - <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338387Enabled" /t REG_DWORD /d 0 /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>41</Order> - <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338388Enabled" /t REG_DWORD /d 0 /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>42</Order> - <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338389Enabled" /t REG_DWORD /d 0 /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>43</Order> - <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-338393Enabled" /t REG_DWORD /d 0 /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>44</Order> - <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SubscribedContent-353698Enabled" /t REG_DWORD /d 0 /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>45</Order> - <Path>reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v "SystemPaneSuggestionsEnabled" /t REG_DWORD /d 0 /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>46</Order> - <Path>reg.exe unload "HKU\DefaultUser"</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>47</Order> - <Path>reg.exe add "HKLM\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableWindowsConsumerFeatures" /t REG_DWORD /d 0 /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>48</Order> - <Path>reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\BitLocker" /v "PreventDeviceEncryption" /t REG_DWORD /d 1 /f</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>49</Order> - <Path>reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>50</Order> - <Path>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</Path> - </RunSynchronousCommand> - <RunSynchronousCommand wcm:action="add"> - <Order>51</Order> - <Path>reg.exe unload "HKU\DefaultUser"</Path> - </RunSynchronousCommand> - </RunSynchronous> - </component> - </settings> -'@ - 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" - - # ************************************************ - # Create WinUtil shortcut on the desktop - # - $desktopPath = "$($env:USERPROFILE)\Desktop" - # Specify the target PowerShell command - $command = "powershell.exe -NoProfile -ExecutionPolicy Bypass -Command 'irm https://christitus.com/win | iex'" - # Specify the path for the shortcut - $shortcutPath = Join-Path $desktopPath 'winutil.lnk' - # Create a shell object - $shell = New-Object -ComObject WScript.Shell - - # Create a shortcut object - $shortcut = $shell.CreateShortcut($shortcutPath) - - if (Test-Path -Path "$env:HOMEDRIVE\Windows\cttlogo.png") { - $shortcut.IconLocation = "$env:HOMEDRIVE\Windows\cttlogo.png" - } - - # Set properties of the shortcut - $shortcut.TargetPath = "powershell.exe" - $shortcut.Arguments = "-NoProfile -ExecutionPolicy Bypass -Command `"$command`"" - # Save the shortcut - $shortcut.Save() - - # Make the shortcut have 'Run as administrator' property on - $bytes = [System.IO.File]::ReadAllBytes($shortcutPath) - # Set byte value at position 0x15 in hex, or 21 in decimal, from the value 0x00 to 0x20 in hex - $bytes[0x15] = $bytes[0x15] -bor 0x20 - [System.IO.File]::WriteAllBytes($shortcutPath, $bytes) - - Write-Host "Shortcut created at: $shortcutPath" - # - # Done create WinUtil shortcut on the desktop - # ************************************************ - - 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 ee4d0421..1dc7f4dd 100644 --- a/functions/public/Invoke-WPFButton.ps1 +++ b/functions/public/Invoke-WPFButton.ps1 @@ -53,8 +53,8 @@ function Invoke-WPFButton { "WPFWinUtilShortcut" {Invoke-WPFShortcut -ShortcutToAdd "WinUtil" -RunAsAdmin $true} "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..7d07ffb6 100644 --- a/scripts/main.ps1 +++ b/scripts/main.ps1 @@ -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 ($(Invoke-MicrowinGetLangFromCulture -langName $((Get-Culture).Name)))") | Out-Null if ($currentCulture -ne "English International") { $sync["ISOLanguage"].Items.Add("English International") | Out-Null } From 4682db2ed66c20f0082d95576a50b5821c72ad1a Mon Sep 17 00:00:00 2001 From: MyDrift <personal@mdiana.ch> Date: Tue, 15 Oct 2024 16:54:19 +0200 Subject: [PATCH 2/5] update runspace function gathering logic --- scripts/main.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/main.ps1 b/scripts/main.ps1 index 7d07ffb6..e847644b 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 From d3e0fb4b3e67590f4bf9987ab8b2da0e7717a9fe Mon Sep 17 00:00:00 2001 From: MyDrift <personal@mdiana.ch> Date: Fri, 25 Oct 2024 10:33:42 +0200 Subject: [PATCH 3/5] update Recall logic (from main repo) --- functions/microwin/Invoke-Microwin.ps1 | 22 +++++++++++++++++++ .../Invoke-MicrowinGet-LocalizedUsers.ps1 | 21 ++++++++++++++++++ .../Invoke-MicrowinRemoveFeatures.ps1 | 1 - 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 functions/microwin/Invoke-MicrowinGet-LocalizedUsers.ps1 diff --git a/functions/microwin/Invoke-Microwin.ps1 b/functions/microwin/Invoke-Microwin.ps1 index aedcbc3e..acaa2654 100644 --- a/functions/microwin/Invoke-Microwin.ps1 +++ b/functions/microwin/Invoke-Microwin.ps1 @@ -162,6 +162,28 @@ public class PowerManagement { Write-Host "Removing Appx Bloat" Invoke-MicrowinRemoveProvisionedPackages + # 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) { + # 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 "$(Invoke-MicrowinGetLocalizedUsers -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] + $dependency = "`n <PackageDependency Name=`"Microsoft.WindowsAppRuntime.CBS`" MinVersion=`"1.0.0.0`" Publisher=`"CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US`" />" + $appxManifest[13] = "$originalLine$dependency" + Set-Content -Path "$scratchDir\Windows\SystemApps\MicrosoftWindows.Client.FileExp_cw5n1h2txyewy\appxmanifest.xml" -Value $appxManifest -Force -Encoding utf8 + } + } + catch { + # Do nothing + } + } + Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\LogFiles\WMI\RtBackup" -Directory Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\DiagTrack" -Directory Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\InboxApps" -Directory diff --git a/functions/microwin/Invoke-MicrowinGet-LocalizedUsers.ps1 b/functions/microwin/Invoke-MicrowinGet-LocalizedUsers.ps1 new file mode 100644 index 00000000..0fd98e4a --- /dev/null +++ b/functions/microwin/Invoke-MicrowinGet-LocalizedUsers.ps1 @@ -0,0 +1,21 @@ +function Invoke-MicrowinGetLocalizedUsers +{ + <# + .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 + Invoke-MicrowinGetLocalizedUsers -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/microwin/Invoke-MicrowinRemoveFeatures.ps1 b/functions/microwin/Invoke-MicrowinRemoveFeatures.ps1 index a3e4205a..8c32dbf9 100644 --- a/functions/microwin/Invoke-MicrowinRemoveFeatures.ps1 +++ b/functions/microwin/Invoke-MicrowinRemoveFeatures.ps1 @@ -22,7 +22,6 @@ function Invoke-MicrowinRemoveFeatures() { $_.FeatureName -NotLike "*NFS*" -AND $_.FeatureName -NotLike "*SearchEngine*" -AND $_.FeatureName -NotLike "*RemoteDesktop*" -AND - $_.FeatureName -NotLike "*Recall*" -AND $_.State -ne "Disabled" } From 24a7d13e1b1af95467c38113d42a51557a9adf1e Mon Sep 17 00:00:00 2001 From: MyDrift <personal@mdiana.ch> Date: Fri, 25 Oct 2024 10:56:50 +0200 Subject: [PATCH 4/5] change to easier naming scheme - rename files - rename function names --- config/autounattend.xml | 6 +- functions/microwin/Invoke-Microwin.ps1 | 62 +++++++++---------- functions/microwin/Invoke-MicrowinGetIso.ps1 | 4 +- ...crowinClasses.ps1 => Microwin-Classes.ps1} | 0 ...inCopyToUSB.ps1 => Microwin-CopyToUSB.ps1} | 2 +- ...re.ps1 => Microwin-GetLangFromCulture.ps1} | 2 +- ...ers.ps1 => Microwin-GetLocalizedUsers.ps1} | 4 +- ...GetOscdimg.ps1 => Microwin-GetOscdimg.ps1} | 4 +- ...stall.ps1 => Microwin-NewCheckInstall.ps1} | 2 +- ...wFirstRun.ps1 => Microwin-NewFirstRun.ps1} | 2 +- ...wUnattend.ps1 => Microwin-NewUnattend.ps1} | 6 +- ...atures.ps1 => Microwin-RemoveFeatures.ps1} | 4 +- ...ps1 => Microwin-RemoveFileOrDirectory.ps1} | 2 +- ...ckages.ps1 => Microwin-RemovePackages.ps1} | 2 +- ...=> Microwin-RemoveProvisionedPackages.ps1} | 4 +- ...e.ps1 => Microwin-TestCompatibleImage.ps1} | 2 +- scripts/main.ps1 | 2 +- 17 files changed, 55 insertions(+), 55 deletions(-) rename functions/microwin/{Invoke-MicrowinClasses.ps1 => Microwin-Classes.ps1} (100%) rename functions/microwin/{Invoke-MicrowinCopyToUSB.ps1 => Microwin-CopyToUSB.ps1} (94%) rename functions/microwin/{Invoke-MicrowinGetLangFromCulture.ps1 => Microwin-GetLangFromCulture.ps1} (97%) rename functions/microwin/{Invoke-MicrowinGet-LocalizedUsers.ps1 => Microwin-GetLocalizedUsers.ps1} (86%) rename functions/microwin/{Invoke-MicrowinGetOscdimg.ps1 => Microwin-GetOscdimg.ps1} (92%) rename functions/microwin/{Invoke-MicrowinNewCheckInstall.ps1 => Microwin-NewCheckInstall.ps1} (98%) rename functions/microwin/{Invoke-MicrowinNewFirstRun.ps1 => Microwin-NewFirstRun.ps1} (99%) rename functions/microwin/{Invoke-MicrowinNewUnattend.ps1 => Microwin-NewUnattend.ps1} (98%) rename functions/microwin/{Invoke-MicrowinRemoveFeatures.ps1 => Microwin-RemoveFeatures.ps1} (95%) rename functions/microwin/{Invoke-MicrowinRemoveFileOrDirectory.ps1 => Microwin-RemoveFileOrDirectory.ps1} (94%) rename functions/microwin/{Invoke-MicrowinRemovePackages.ps1 => Microwin-RemovePackages.ps1} (99%) rename functions/microwin/{Invoke-MicrowinRemoveProvisionedPackages.ps1 => Microwin-RemoveProvisionedPackages.ps1} (95%) rename functions/microwin/{Invoke-MicrowinTestCompatibleImage.ps1 => Microwin-TestCompatibleImage.ps1} (92%) diff --git a/config/autounattend.xml b/config/autounattend.xml index 6cfe33a4..a1daf403 100644 --- a/config/autounattend.xml +++ b/config/autounattend.xml @@ -113,7 +113,7 @@ </RunSynchronousCommand> <RunSynchronousCommand wcm:action="add"> <Order>19</Order> - <Path>powershell.exe -NoProfile -Command "Get-Content -LiteralPath 'C:\Windows\Temp\Invoke-MicrowinRemovePackages.ps1' -Raw | Invoke-Expression;"</Path> + <Path>powershell.exe -NoProfile -Command "Get-Content -LiteralPath 'C:\Windows\Temp\Microwin-RemovePackages.ps1' -Raw | Invoke-Expression;"</Path> </RunSynchronousCommand> <RunSynchronousCommand wcm:action="add"> <Order>20</Order> @@ -312,7 +312,7 @@ foreach( $file in $Document.unattend.Extensions.File ) { [System.IO.File]::WriteAllBytes( $path, ( $encoding.GetPreamble() + $encoding.GetBytes( $file.InnerText.Trim() ) ) ); } </ExtractScript> - <File path="C:\Windows\Temp\Invoke-MicrowinRemovePackages.ps1"> + <File path="C:\Windows\Temp\Microwin-RemovePackages.ps1"> $selectors = @( 'Microsoft.Microsoft3DViewer'; 'Microsoft.BingSearch'; @@ -359,7 +359,7 @@ $removeCommand = { } }; $type = 'Package'; -$logfile = 'C:\Windows\Temp\Invoke-MicrowinRemovePackages.log'; +$logfile = 'C:\Windows\Temp\Microwin-RemovePackages.log'; &amp; { $installed = &amp; $getCommand; foreach( $selector in $selectors ) { diff --git a/functions/microwin/Invoke-Microwin.ps1 b/functions/microwin/Invoke-Microwin.ps1 index acaa2654..567e0aa4 100644 --- a/functions/microwin/Invoke-Microwin.ps1 +++ b/functions/microwin/Invoke-Microwin.ps1 @@ -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 ((Invoke-MicrowinTestCompatibleImage $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 ((Invoke-MicrowinTestCompatibleImage $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,12 +155,12 @@ public class PowerManagement { } Write-Host "Remove Features from the image" - Invoke-MicrowinRemoveFeatures + Microwin-RemoveFeatures Write-Host "Removing features complete!" Write-Host "Removing OS packages" - Invoke-MicrowinRemovePackages + Microwin-RemovePackages Write-Host "Removing Appx Bloat" - Invoke-MicrowinRemoveProvisionedPackages + 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) { @@ -170,7 +170,7 @@ public class PowerManagement { # 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 "$(Invoke-MicrowinGetLocalizedUsers -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] @@ -184,40 +184,40 @@ public class PowerManagement { } } - Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\LogFiles\WMI\RtBackup" -Directory - Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\DiagTrack" -Directory - Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\InboxApps" -Directory - Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\LocationNotificationWindows.exe" - Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Windows Photo Viewer" -Directory - Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Windows Photo Viewer" -Directory - Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Windows Media Player" -Directory - Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Windows Media Player" -Directory - Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Windows Mail" -Directory - Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Windows Mail" -Directory - Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Internet Explorer" -Directory - Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Internet Explorer" -Directory - Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\GameBarPresenceWriter" - Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\OneDriveSetup.exe" - Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\OneDrive.ico" - Invoke-MicrowinRemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\SystemApps" -mask "*narratorquickstart*" -Directory - Invoke-MicrowinRemoveFileOrDirectory -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" - #Invoke-MicrowinNewUnattend + #Microwin-NewUnattend if ($sync.MicrowinUserName.Text -eq "") { - Invoke-MicrowinNewUnattend -userName "User" + Microwin-NewUnattend -userName "User" } else { if ($sync.MicrowinUserPassword.Password -eq "") { - Invoke-MicrowinNewUnattend -userName "$($sync.MicrowinUserName.Text)" + Microwin-NewUnattend -userName "$($sync.MicrowinUserName.Text)" } else { - Invoke-MicrowinNewUnattend -userName "$($sync.MicrowinUserName.Text)" -userPassword "$($sync.MicrowinUserPassword.Password)" + Microwin-NewUnattend -userName "$($sync.MicrowinUserName.Text)" -userPassword "$($sync.MicrowinUserPassword.Password)" } } Write-Host "Done Create unattend.xml" @@ -230,7 +230,7 @@ public class PowerManagement { Write-Host "Done Copy unattend.xml" Write-Host "Create FirstRun" - Invoke-MicrowinNewFirstRun + 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 @@ -242,7 +242,7 @@ public class PowerManagement { dism /English /image:$($scratchDir) /set-profilepath:"$($scratchDir)\Windows\Users\Default" Write-Host "Copy checkinstall.cmd into the ISO" - Invoke-MicrowinNewCheckInstall + Microwin-NewCheckInstall Copy-Item "$env:temp\checkinstall.cmd" "$($scratchDir)\Windows\checkinstall.cmd" -force Write-Host "Done copy checkinstall.cmd" @@ -318,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 ((Invoke-MicrowinTestCompatibleImage $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) @@ -430,7 +430,7 @@ public class PowerManagement { if ($copyToUSB) { Write-Host "Copying target ISO to the USB drive" - Invoke-MicrowinCopyToUSB("$($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/microwin/Invoke-MicrowinGetIso.ps1 b/functions/microwin/Invoke-MicrowinGetIso.ps1 index 9e438662..43f4caed 100644 --- a/functions/microwin/Invoke-MicrowinGetIso.ps1 +++ b/functions/microwin/Invoke-MicrowinGetIso.ps1 @@ -50,7 +50,7 @@ function Invoke-MicrowinGetIso { 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.") - Invoke-MicrowinGetOscdimg -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-MicrowinGetIso { 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) { - Invoke-MicrowinGetLangFromCulture -langName (Get-Culture).Name + Microwin-GetLangFromCulture -langName (Get-Culture).Name } else { $sync["ISOLanguage"].SelectedItem } diff --git a/functions/microwin/Invoke-MicrowinClasses.ps1 b/functions/microwin/Microwin-Classes.ps1 similarity index 100% rename from functions/microwin/Invoke-MicrowinClasses.ps1 rename to functions/microwin/Microwin-Classes.ps1 diff --git a/functions/microwin/Invoke-MicrowinCopyToUSB.ps1 b/functions/microwin/Microwin-CopyToUSB.ps1 similarity index 94% rename from functions/microwin/Invoke-MicrowinCopyToUSB.ps1 rename to functions/microwin/Microwin-CopyToUSB.ps1 index c6389234..06f4219d 100644 --- a/functions/microwin/Invoke-MicrowinCopyToUSB.ps1 +++ b/functions/microwin/Microwin-CopyToUSB.ps1 @@ -1,4 +1,4 @@ -function Invoke-MicrowinCopyToUSB([string]$fileToCopy) { +function Microwin-CopyToUSB([string]$fileToCopy) { foreach ($volume in Get-Volume) { if ($volume -and $volume.FileSystemLabel -ieq "ventoy") { $destinationPath = "$($volume.DriveLetter):\" diff --git a/functions/microwin/Invoke-MicrowinGetLangFromCulture.ps1 b/functions/microwin/Microwin-GetLangFromCulture.ps1 similarity index 97% rename from functions/microwin/Invoke-MicrowinGetLangFromCulture.ps1 rename to functions/microwin/Microwin-GetLangFromCulture.ps1 index 4a4234dc..5c6d8fd0 100644 --- a/functions/microwin/Invoke-MicrowinGetLangFromCulture.ps1 +++ b/functions/microwin/Microwin-GetLangFromCulture.ps1 @@ -1,4 +1,4 @@ -function Invoke-MicrowinGetLangFromCulture { +function Microwin-GetLangFromCulture { param ( [Parameter(Mandatory, Position = 0)] [string]$langName diff --git a/functions/microwin/Invoke-MicrowinGet-LocalizedUsers.ps1 b/functions/microwin/Microwin-GetLocalizedUsers.ps1 similarity index 86% rename from functions/microwin/Invoke-MicrowinGet-LocalizedUsers.ps1 rename to functions/microwin/Microwin-GetLocalizedUsers.ps1 index 0fd98e4a..0f7bf7bd 100644 --- a/functions/microwin/Invoke-MicrowinGet-LocalizedUsers.ps1 +++ b/functions/microwin/Microwin-GetLocalizedUsers.ps1 @@ -1,4 +1,4 @@ -function Invoke-MicrowinGetLocalizedUsers +function Microwin-GetLocalizedUsers { <# .SYNOPSIS @@ -8,7 +8,7 @@ function Invoke-MicrowinGetLocalizedUsers .OUTPUTS A string containing the localized user group .EXAMPLE - Invoke-MicrowinGetLocalizedUsers -admins $true + Microwin-GetLocalizedUsers -admins $true #> param ( [Parameter(Mandatory = $true, Position = 0)] [bool]$admins diff --git a/functions/microwin/Invoke-MicrowinGetOscdimg.ps1 b/functions/microwin/Microwin-GetOscdimg.ps1 similarity index 92% rename from functions/microwin/Invoke-MicrowinGetOscdimg.ps1 rename to functions/microwin/Microwin-GetOscdimg.ps1 index a515310c..f395f71f 100644 --- a/functions/microwin/Invoke-MicrowinGetOscdimg.ps1 +++ b/functions/microwin/Microwin-GetOscdimg.ps1 @@ -1,10 +1,10 @@ -function Invoke-MicrowinGetOscdimg { +function Microwin-GetOscdimg { <# .DESCRIPTION This function will download oscdimg file from github Release folders and put it into env:temp folder .EXAMPLE - Invoke-MicrowinGetOscdimg + Microwin-GetOscdimg #> param( diff --git a/functions/microwin/Invoke-MicrowinNewCheckInstall.ps1 b/functions/microwin/Microwin-NewCheckInstall.ps1 similarity index 98% rename from functions/microwin/Invoke-MicrowinNewCheckInstall.ps1 rename to functions/microwin/Microwin-NewCheckInstall.ps1 index f1b2979b..6520ac6a 100644 --- a/functions/microwin/Invoke-MicrowinNewCheckInstall.ps1 +++ b/functions/microwin/Microwin-NewCheckInstall.ps1 @@ -1,4 +1,4 @@ -function Invoke-MicrowinNewCheckInstall { +function Microwin-NewCheckInstall { # using here string to embedd firstrun $checkInstall = @' diff --git a/functions/microwin/Invoke-MicrowinNewFirstRun.ps1 b/functions/microwin/Microwin-NewFirstRun.ps1 similarity index 99% rename from functions/microwin/Invoke-MicrowinNewFirstRun.ps1 rename to functions/microwin/Microwin-NewFirstRun.ps1 index db056941..bb2deb6d 100644 --- a/functions/microwin/Invoke-MicrowinNewFirstRun.ps1 +++ b/functions/microwin/Microwin-NewFirstRun.ps1 @@ -1,4 +1,4 @@ -function Invoke-MicrowinNewFirstRun { +function Microwin-NewFirstRun { # using here string to embedd firstrun $firstRun = @' diff --git a/functions/microwin/Invoke-MicrowinNewUnattend.ps1 b/functions/microwin/Microwin-NewUnattend.ps1 similarity index 98% rename from functions/microwin/Invoke-MicrowinNewUnattend.ps1 rename to functions/microwin/Microwin-NewUnattend.ps1 index bd35b0a6..87188aca 100644 --- a/functions/microwin/Invoke-MicrowinNewUnattend.ps1 +++ b/functions/microwin/Microwin-NewUnattend.ps1 @@ -1,4 +1,4 @@ -function Invoke-MicrowinNewUnattend { +function Microwin-NewUnattend { param ( [Parameter(Mandatory, Position = 0)] [string]$userName, @@ -160,7 +160,7 @@ function Invoke-MicrowinNewUnattend { </RunSynchronousCommand> <RunSynchronousCommand wcm:action="add"> <Order>19</Order> - <Path>powershell.exe -NoProfile -Command "Get-Content -LiteralPath 'C:\Windows\Temp\Invoke-MicrowinRemovePackages.ps1' -Raw | Invoke-Expression;"</Path> + <Path>powershell.exe -NoProfile -Command "Get-Content -LiteralPath 'C:\Windows\Temp\Microwin-RemovePackages.ps1' -Raw | Invoke-Expression;"</Path> </RunSynchronousCommand> <RunSynchronousCommand wcm:action="add"> <Order>20</Order> @@ -294,7 +294,7 @@ function Invoke-MicrowinNewUnattend { </component> </settings> '@ - if ((Invoke-MicrowinTestCompatibleImage $imgVersion $([System.Version]::new(10,0,22000,1))) -eq $false) { + 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 { diff --git a/functions/microwin/Invoke-MicrowinRemoveFeatures.ps1 b/functions/microwin/Microwin-RemoveFeatures.ps1 similarity index 95% rename from functions/microwin/Invoke-MicrowinRemoveFeatures.ps1 rename to functions/microwin/Microwin-RemoveFeatures.ps1 index 8c32dbf9..5b37adb2 100644 --- a/functions/microwin/Invoke-MicrowinRemoveFeatures.ps1 +++ b/functions/microwin/Microwin-RemoveFeatures.ps1 @@ -1,4 +1,4 @@ -function Invoke-MicrowinRemoveFeatures() { +function Microwin-RemoveFeatures() { <# .SYNOPSIS Removes certain features from ISO image @@ -7,7 +7,7 @@ function Invoke-MicrowinRemoveFeatures() { No Params .EXAMPLE - Invoke-MicrowinRemoveFeatures + Microwin-RemoveFeatures #> try { $featlist = (Get-WindowsOptionalFeature -Path $scratchDir) diff --git a/functions/microwin/Invoke-MicrowinRemoveFileOrDirectory.ps1 b/functions/microwin/Microwin-RemoveFileOrDirectory.ps1 similarity index 94% rename from functions/microwin/Invoke-MicrowinRemoveFileOrDirectory.ps1 rename to functions/microwin/Microwin-RemoveFileOrDirectory.ps1 index fb08a1db..002e7a65 100644 --- a/functions/microwin/Invoke-MicrowinRemoveFileOrDirectory.ps1 +++ b/functions/microwin/Microwin-RemoveFileOrDirectory.ps1 @@ -1,4 +1,4 @@ -function Invoke-MicrowinRemoveFileOrDirectory([string]$pathToDelete, [string]$mask = "", [switch]$Directory = $false) { +function Microwin-RemoveFileOrDirectory([string]$pathToDelete, [string]$mask = "", [switch]$Directory = $false) { if(([string]::IsNullOrEmpty($pathToDelete))) { return } if (-not (Test-Path -Path "$($pathToDelete)")) { return } diff --git a/functions/microwin/Invoke-MicrowinRemovePackages.ps1 b/functions/microwin/Microwin-RemovePackages.ps1 similarity index 99% rename from functions/microwin/Invoke-MicrowinRemovePackages.ps1 rename to functions/microwin/Microwin-RemovePackages.ps1 index f94fc9d6..ed53056c 100644 --- a/functions/microwin/Invoke-MicrowinRemovePackages.ps1 +++ b/functions/microwin/Microwin-RemovePackages.ps1 @@ -1,4 +1,4 @@ -function Invoke-MicrowinRemovePackages { +function Microwin-RemovePackages { try { $pkglist = (Get-WindowsPackage -Path "$scratchDir").PackageName diff --git a/functions/microwin/Invoke-MicrowinRemoveProvisionedPackages.ps1 b/functions/microwin/Microwin-RemoveProvisionedPackages.ps1 similarity index 95% rename from functions/microwin/Invoke-MicrowinRemoveProvisionedPackages.ps1 rename to functions/microwin/Microwin-RemoveProvisionedPackages.ps1 index 33bd0d94..30bc0d74 100644 --- a/functions/microwin/Invoke-MicrowinRemoveProvisionedPackages.ps1 +++ b/functions/microwin/Microwin-RemoveProvisionedPackages.ps1 @@ -1,4 +1,4 @@ -function Invoke-MicrowinRemoveProvisionedPackages() { +function Microwin-RemoveProvisionedPackages() { <# .SYNOPSIS Removes AppX packages from a Windows image during MicroWin processing @@ -7,7 +7,7 @@ function Invoke-MicrowinRemoveProvisionedPackages() { No Params .EXAMPLE - Invoke-MicrowinRemoveProvisionedPackages + Microwin-RemoveProvisionedPackages #> try { diff --git a/functions/microwin/Invoke-MicrowinTestCompatibleImage.ps1 b/functions/microwin/Microwin-TestCompatibleImage.ps1 similarity index 92% rename from functions/microwin/Invoke-MicrowinTestCompatibleImage.ps1 rename to functions/microwin/Microwin-TestCompatibleImage.ps1 index c41bc276..f1305e92 100644 --- a/functions/microwin/Invoke-MicrowinTestCompatibleImage.ps1 +++ b/functions/microwin/Microwin-TestCompatibleImage.ps1 @@ -1,4 +1,4 @@ -function Invoke-MicrowinTestCompatibleImage() { +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 diff --git a/scripts/main.ps1 b/scripts/main.ps1 index e847644b..c1c7097c 100644 --- a/scripts/main.ps1 +++ b/scripts/main.ps1 @@ -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 ($(Invoke-MicrowinGetLangFromCulture -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 } From 3f933cecc08776ac20aa8235d112b918cae72890 Mon Sep 17 00:00:00 2001 From: MyDrift <personal@mdiana.ch> Date: Fri, 25 Oct 2024 16:44:42 +0200 Subject: [PATCH 5/5] remove unneeded comment (after @CodingWonders's suggestion) --- functions/microwin/Invoke-Microwin.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/microwin/Invoke-Microwin.ps1 b/functions/microwin/Invoke-Microwin.ps1 index 567e0aa4..4151a3d1 100644 --- a/functions/microwin/Invoke-Microwin.ps1 +++ b/functions/microwin/Invoke-Microwin.ps1 @@ -204,7 +204,7 @@ public class PowerManagement { Write-Host "Removal complete!" Write-Host "Create unattend.xml" - #Microwin-NewUnattend + if ($sync.MicrowinUserName.Text -eq "") { Microwin-NewUnattend -userName "User"