diff --git a/.github/mkdocs.yml b/.github/mkdocs.yml index 8b9700bc..6c031004 100644 --- a/.github/mkdocs.yml +++ b/.github/mkdocs.yml @@ -5,7 +5,7 @@ repo_url: https://github.com/ChrisTitusTech/winutil nav: - Introduction: 'index.md' - User Guide: 'userguide.md' - - Contributing Guide: 'contribute.md' + - Contributing Guide: 'CONTRIBUTING.md' - Documentation: - Dev Docs: 'devdocs.md' - Known Issues: 'KnownIssues.md' diff --git a/README.md b/README.md index b3ef0aa9..ea62692c 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ If you have Issues, refer to [Known Issues](https://christitustech.github.io/win These are the sponsors that help keep this project alive with monthly contributions. -Yusuke SaitoTriHyderaMark AmosJason A. DiegmuellerwyattRMSStefanPaulDave JonesAnthony MendezxPandakuClaudemodsMaxDursleyGuySandman616Phillip Waters +Yusuke SaitoTriHyderaMark AmosJason A. DiegmuellerwyattRMSStefanPaulDave JonesAnthony MendezxPandakuClaudemodsMaxDursleyGuySandman616Phillip Waters ## 🏅 Thanks to all Contributors Thanks a lot for spending your time helping Winutil grow. Thanks a lot! Keep rocking 🍻. diff --git a/config/autounattend.xml b/config/autounattend.xml index 6a432641..a1daf403 100644 --- a/config/autounattend.xml +++ b/config/autounattend.xml @@ -113,7 +113,7 @@ 19 - powershell.exe -NoProfile -Command "Get-Content -LiteralPath 'C:\Windows\Temp\remove-packages.ps1' -Raw | Invoke-Expression;" + powershell.exe -NoProfile -Command "Get-Content -LiteralPath 'C:\Windows\Temp\Microwin-RemovePackages.ps1' -Raw | Invoke-Expression;" 20 @@ -312,7 +312,7 @@ foreach( $file in $Document.unattend.Extensions.File ) { [System.IO.File]::WriteAllBytes( $path, ( $encoding.GetPreamble() + $encoding.GetBytes( $file.InnerText.Trim() ) ) ); } - + $selectors = @( 'Microsoft.Microsoft3DViewer'; 'Microsoft.BingSearch'; @@ -359,7 +359,7 @@ $removeCommand = { } }; $type = 'Package'; -$logfile = 'C:\Windows\Temp\remove-packages.log'; +$logfile = 'C:\Windows\Temp\Microwin-RemovePackages.log'; & { $installed = & $getCommand; foreach( $selector in $selectors ) { diff --git a/config/tweaks.json b/config/tweaks.json index 93ed630c..e9117452 100644 --- a/config/tweaks.json +++ b/config/tweaks.json @@ -11,21 +11,21 @@ "Name": "EnableActivityFeed", "Type": "DWord", "Value": "0", - "OriginalValue": "1" + "OriginalValue": "" }, { "Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\System", "Name": "PublishUserActivities", "Type": "DWord", "Value": "0", - "OriginalValue": "1" + "OriginalValue": "" }, { "Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\System", "Name": "UploadUserActivities", "Type": "DWord", "Value": "0", - "OriginalValue": "1" + "OriginalValue": "" } ], "link": "https://christitustech.github.io/winutil/dev/tweaks/Essential-Tweaks/AH" @@ -1598,126 +1598,126 @@ "Name": "CreateDesktopShortcutDefault", "Type": "DWord", "Value": "0", - "OriginalValue": "1" + "OriginalValue": "" }, { "Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge", "Name": "PersonalizationReportingEnabled", "Type": "DWord", "Value": "0", - "OriginalValue": "1" + "OriginalValue": "" }, { "Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge", "Name": "ShowRecommendationsEnabled", "Type": "DWord", "Value": "0", - "OriginalValue": "1" + "OriginalValue": "" }, { "Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge", "Name": "HideFirstRunExperience", "Type": "DWord", "Value": "1", - "OriginalValue": "0" + "OriginalValue": "" }, { "Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge", "Name": "UserFeedbackAllowed", "Type": "DWord", "Value": "0", - "OriginalValue": "1" + "OriginalValue": "" }, { "Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge", "Name": "ConfigureDoNotTrack", "Type": "DWord", "Value": "1", - "OriginalValue": "0" + "OriginalValue": "" }, { "Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge", "Name": "AlternateErrorPagesEnabled", "Type": "DWord", "Value": "0", - "OriginalValue": "1" + "OriginalValue": "" }, { "Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge", "Name": "EdgeCollectionsEnabled", "Type": "DWord", "Value": "0", - "OriginalValue": "1" + "OriginalValue": "" }, { "Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge", "Name": "EdgeShoppingAssistantEnabled", "Type": "DWord", "Value": "0", - "OriginalValue": "1" + "OriginalValue": "" }, { "Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge", "Name": "MicrosoftEdgeInsiderPromotionEnabled", "Type": "DWord", "Value": "0", - "OriginalValue": "1" + "OriginalValue": "" }, { "Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge", "Name": "PersonalizationReportingEnabled", "Type": "DWord", "Value": "0", - "OriginalValue": "1" + "OriginalValue": "" }, { "Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge", "Name": "ShowMicrosoftRewards", "Type": "DWord", "Value": "0", - "OriginalValue": "1" + "OriginalValue": "" }, { "Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge", "Name": "WebWidgetAllowed", "Type": "DWord", "Value": "0", - "OriginalValue": "1" + "OriginalValue": "" }, { "Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge", "Name": "DiagnosticData", "Type": "DWord", "Value": "0", - "OriginalValue": "1" + "OriginalValue": "" }, { "Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge", "Name": "EdgeAssetDeliveryServiceEnabled", "Type": "DWord", "Value": "0", - "OriginalValue": "1" + "OriginalValue": "" }, { "Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge", "Name": "EdgeCollectionsEnabled", "Type": "DWord", "Value": "0", - "OriginalValue": "1" + "OriginalValue": "" }, { "Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge", "Name": "CryptoWalletEnabled", "Type": "DWord", "Value": "0", - "OriginalValue": "1" + "OriginalValue": "" }, { "Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Edge", "Name": "WalletDonationEnabled", "Type": "DWord", "Value": "0", - "OriginalValue": "1" + "OriginalValue": "" } ], "link": "https://christitustech.github.io/winutil/dev/tweaks/Essential-Tweaks/EdgeDebloat" @@ -1731,7 +1731,7 @@ "registry": [ { "Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\CloudContent", - "OriginalValue": "0", + "OriginalValue": "", "Name": "DisableWindowsConsumerFeatures", "Value": "1", "Type": "DWord" @@ -1818,11 +1818,11 @@ "Type": "DWord", "Value": "0", "Name": "AllowTelemetry", - "OriginalValue": "1" + "OriginalValue": "" }, { "Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\DataCollection", - "OriginalValue": "1", + "OriginalValue": "", "Name": "AllowTelemetry", "Value": "0", "Type": "DWord" @@ -1906,21 +1906,21 @@ }, { "Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\DataCollection", - "OriginalValue": "0", + "OriginalValue": "", "Name": "DoNotShowFeedbackNotifications", "Value": "1", "Type": "DWord" }, { "Path": "HKCU:\\SOFTWARE\\Policies\\Microsoft\\Windows\\CloudContent", - "OriginalValue": "0", + "OriginalValue": "", "Name": "DisableTailoredExperiencesWithDiagnosticData", "Value": "1", "Type": "DWord" }, { "Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\AdvertisingInfo", - "OriginalValue": "0", + "OriginalValue": "", "Name": "DisabledByGroupPolicy", "Value": "1", "Type": "DWord" @@ -2047,7 +2047,7 @@ }, { "Path": "HKCU:\\SOFTWARE\\Policies\\Microsoft\\Windows\\Windows Feeds", - "OriginalValue": "1", + "OriginalValue": "", "Name": "EnableFeeds", "Value": "0", "Type": "DWord" @@ -2061,7 +2061,7 @@ }, { "Path": "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer", - "OriginalValue": "1", + "OriginalValue": "", "Name": "HideSCAMeetNow", "Value": "1", "Type": "DWord" @@ -2553,14 +2553,14 @@ "Name": "TurnOffWindowsCopilot", "Type": "DWord", "Value": "1", - "OriginalValue": "0" + "OriginalValue": "" }, { "Path": "HKCU:\\Software\\Policies\\Microsoft\\Windows\\WindowsCopilot", "Name": "TurnOffWindowsCopilot", "Type": "DWord", "Value": "1", - "OriginalValue": "0" + "OriginalValue": "" }, { "Path": "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced", @@ -2597,7 +2597,7 @@ "Name": "DisableAIDataAnalysis", "Type": "DWord", "Value": "1", - "OriginalValue": "0" + "OriginalValue": "" } ], "InvokeScript": [ @@ -2824,7 +2824,7 @@ "Name": "DisableNotificationCenter", "Type": "DWord", "Value": "1", - "OriginalValue": "0" + "OriginalValue": "" }, { "Path": "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\PushNotifications", @@ -3183,7 +3183,7 @@ "Path": "HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\GameDVR", "Name": "AllowGameDVR", "Value": "0", - "OriginalValue": "1", + "OriginalValue": "", "Type": "DWord" } ], diff --git a/docs/contribute.md b/docs/CONTRIBUTING.md similarity index 100% rename from docs/contribute.md rename to docs/CONTRIBUTING.md diff --git a/functions/public/Invoke-WPFMicrowin.ps1 b/functions/microwin/Invoke-Microwin.ps1 similarity index 89% rename from functions/public/Invoke-WPFMicrowin.ps1 rename to functions/microwin/Invoke-Microwin.ps1 index 966d6a07..4151a3d1 100644 --- a/functions/public/Invoke-WPFMicrowin.ps1 +++ b/functions/microwin/Invoke-Microwin.ps1 @@ -1,4 +1,4 @@ -function Invoke-WPFMicrowin { +function Invoke-Microwin { <# .DESCRIPTION Invoke MicroWin routines... @@ -78,7 +78,7 @@ public class PowerManagement { $imgVersion = (Get-WindowsImage -ImagePath $mountDir\sources\install.wim -Index $index).Version # Detect image version to avoid performing MicroWin processing on Windows 8 and earlier - if ((Test-CompatibleImage $imgVersion $([System.Version]::new(10,0,10240,0))) -eq $false) { + if ((Microwin-TestCompatibleImage $imgVersion $([System.Version]::new(10,0,10240,0))) -eq $false) { $msg = "This image is not compatible with MicroWin processing. Make sure it isn't a Windows 8 or earlier image." $dlg_msg = $msg + "`n`nIf you want more information, the version of the image selected is $($imgVersion)`n`nIf an image has been incorrectly marked as incompatible, report an issue to the developers." Write-Host $msg @@ -88,7 +88,7 @@ public class PowerManagement { } # Detect whether the image to process contains Windows 10 and show warning - if ((Test-CompatibleImage $imgVersion $([System.Version]::new(10,0,21996,1))) -eq $false) { + if ((Microwin-TestCompatibleImage $imgVersion $([System.Version]::new(10,0,21996,1))) -eq $false) { $msg = "Windows 10 has been detected in the image you want to process. While you can continue, Windows 10 is not a recommended target for MicroWin, and you may not get the full experience." $dlg_msg = $msg Write-Host $msg @@ -155,28 +155,22 @@ public class PowerManagement { } Write-Host "Remove Features from the image" - Remove-Features + Microwin-RemoveFeatures Write-Host "Removing features complete!" Write-Host "Removing OS packages" - Remove-Packages + Microwin-RemovePackages Write-Host "Removing Appx Bloat" - Remove-ProvisionedPackages + Microwin-RemoveProvisionedPackages # Detect Windows 11 24H2 and add dependency to FileExp to prevent Explorer look from going back - thanks @WitherOrNot and @thecatontheceiling - if ((Test-CompatibleImage $imgVersion $([System.Version]::new(10,0,26100,1))) -eq $true) - { - try - { - if (Test-Path "$scratchDir\Windows\SystemApps\MicrosoftWindows.Client.FileExp_cw5n1h2txyewy\appxmanifest.xml" -PathType Leaf) - { + if ((Test-CompatibleImage $imgVersion $([System.Version]::new(10,0,26100,1))) -eq $true) { + try { + if (Test-Path "$scratchDir\Windows\SystemApps\MicrosoftWindows.Client.FileExp_cw5n1h2txyewy\appxmanifest.xml" -PathType Leaf) { # Found the culprit. Do the following: - # 1. Take ownership of the file, from TrustedInstaller to Administrators takeown /F "$scratchDir\Windows\SystemApps\MicrosoftWindows.Client.FileExp_cw5n1h2txyewy\appxmanifest.xml" /A - # 2. Set ACLs so that we can write to it - icacls "$scratchDir\Windows\SystemApps\MicrosoftWindows.Client.FileExp_cw5n1h2txyewy\appxmanifest.xml" /grant "$(Get-LocalizedUsers -admins $true):(M)" | Out-Host - + icacls "$scratchDir\Windows\SystemApps\MicrosoftWindows.Client.FileExp_cw5n1h2txyewy\appxmanifest.xml" /grant "$(Microwin-GetLocalizedUsers -admins $true):(M)" | Out-Host # 3. Open the file and do the modification $appxManifest = Get-Content -Path "$scratchDir\Windows\SystemApps\MicrosoftWindows.Client.FileExp_cw5n1h2txyewy\appxmanifest.xml" $originalLine = $appxManifest[13] @@ -185,46 +179,45 @@ public class PowerManagement { Set-Content -Path "$scratchDir\Windows\SystemApps\MicrosoftWindows.Client.FileExp_cw5n1h2txyewy\appxmanifest.xml" -Value $appxManifest -Force -Encoding utf8 } } - catch - { - + catch { + # Do nothing } } - Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\LogFiles\WMI\RtBackup" -Directory - Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\DiagTrack" -Directory - Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\InboxApps" -Directory - Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\LocationNotificationWindows.exe" - Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Windows Photo Viewer" -Directory - Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Windows Photo Viewer" -Directory - Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Windows Media Player" -Directory - Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Windows Media Player" -Directory - Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Windows Mail" -Directory - Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Windows Mail" -Directory - Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Internet Explorer" -Directory - Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Internet Explorer" -Directory - Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\GameBarPresenceWriter" - Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\OneDriveSetup.exe" - Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\OneDrive.ico" - Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\SystemApps" -mask "*narratorquickstart*" -Directory - Remove-FileOrDirectory -pathToDelete "$($scratchDir)\Windows\SystemApps" -mask "*ParentalControls*" -Directory + Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\LogFiles\WMI\RtBackup" -Directory + Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\DiagTrack" -Directory + Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\InboxApps" -Directory + Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\LocationNotificationWindows.exe" + Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Windows Photo Viewer" -Directory + Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Windows Photo Viewer" -Directory + Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Windows Media Player" -Directory + Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Windows Media Player" -Directory + Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Windows Mail" -Directory + Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Windows Mail" -Directory + Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files (x86)\Internet Explorer" -Directory + Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Program Files\Internet Explorer" -Directory + Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\GameBarPresenceWriter" + Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\OneDriveSetup.exe" + Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\System32\OneDrive.ico" + Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\SystemApps" -mask "*narratorquickstart*" -Directory + Microwin-RemoveFileOrDirectory -pathToDelete "$($scratchDir)\Windows\SystemApps" -mask "*ParentalControls*" -Directory Write-Host "Removal complete!" Write-Host "Create unattend.xml" - #New-Unattend + if ($sync.MicrowinUserName.Text -eq "") { - New-Unattend -userName "User" + Microwin-NewUnattend -userName "User" } else { if ($sync.MicrowinUserPassword.Password -eq "") { - New-Unattend -userName "$($sync.MicrowinUserName.Text)" + Microwin-NewUnattend -userName "$($sync.MicrowinUserName.Text)" } else { - New-Unattend -userName "$($sync.MicrowinUserName.Text)" -userPassword "$($sync.MicrowinUserPassword.Password)" + Microwin-NewUnattend -userName "$($sync.MicrowinUserName.Text)" -userPassword "$($sync.MicrowinUserPassword.Password)" } } Write-Host "Done Create unattend.xml" @@ -237,7 +230,7 @@ public class PowerManagement { Write-Host "Done Copy unattend.xml" Write-Host "Create FirstRun" - New-FirstRun + Microwin-NewFirstRun Write-Host "Done create FirstRun" Write-Host "Copy FirstRun.ps1 into the ISO" Copy-Item "$env:temp\FirstStartup.ps1" "$($scratchDir)\Windows\FirstStartup.ps1" -force @@ -249,7 +242,7 @@ public class PowerManagement { dism /English /image:$($scratchDir) /set-profilepath:"$($scratchDir)\Windows\Users\Default" Write-Host "Copy checkinstall.cmd into the ISO" - New-CheckInstall + Microwin-NewCheckInstall Copy-Item "$env:temp\checkinstall.cmd" "$($scratchDir)\Windows\checkinstall.cmd" -force Write-Host "Done copy checkinstall.cmd" @@ -325,7 +318,7 @@ public class PowerManagement { reg add "HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize" /v "AppsUseLightTheme" /t REG_DWORD /d 0 /f reg add "HKLM\zSOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize" /v "SystemUsesLightTheme" /t REG_DWORD /d 0 /f - if ((Test-CompatibleImage $imgVersion $([System.Version]::new(10,0,21996,1))) -eq $false) { + if ((Microwin-TestCompatibleImage $imgVersion $([System.Version]::new(10,0,21996,1))) -eq $false) { # We're dealing with Windows 10. Configure sane desktop settings. NOTE: even though stuff to disable News and Interests is there, # it doesn't seem to work, and I don't want to waste more time dealing with an operating system that will lose support in a year (2025) @@ -437,7 +430,7 @@ public class PowerManagement { if ($copyToUSB) { Write-Host "Copying target ISO to the USB drive" - Copy-ToUSB("$($SaveDialog.FileName)") + Microwin-CopyToUSB("$($SaveDialog.FileName)") if ($?) { Write-Host "Done Copying target ISO to USB drive!" } else { Write-Host "ISO copy failed." } } diff --git a/functions/public/Invoke-WPFGetIso.ps1 b/functions/microwin/Invoke-MicrowinGetIso.ps1 similarity index 98% rename from functions/public/Invoke-WPFGetIso.ps1 rename to functions/microwin/Invoke-MicrowinGetIso.ps1 index 954ee432..43f4caed 100644 --- a/functions/public/Invoke-WPFGetIso.ps1 +++ b/functions/microwin/Invoke-MicrowinGetIso.ps1 @@ -1,4 +1,4 @@ -function Invoke-WPFGetIso { +function Invoke-MicrowinGetIso { <# .DESCRIPTION Function to get the path to Iso file for MicroWin, unpack that isom=, read basic information and populate the UI Options @@ -50,7 +50,7 @@ function Invoke-WPFGetIso { return } else { [System.Windows.MessageBox]::Show("oscdimge.exe is not found on the system, winutil will now attempt do download and install it from github. This might take a long time.") - Get-Oscdimg -oscdimgPath $oscdimgPath + Microwin-GetOscdimg -oscdimgPath $oscdimgPath $oscdImgFound = Test-Path $oscdimgPath -PathType Leaf if (!$oscdImgFound) { $msg = "oscdimg was not downloaded can not proceed" @@ -100,7 +100,7 @@ function Invoke-WPFGetIso { Set-Location -Path $env:temp # Detect if the first option ("System language") has been selected and get a Fido-approved language from the current culture $lang = if ($sync["ISOLanguage"].SelectedIndex -eq 0) { - Get-FidoLangFromCulture -langName (Get-Culture).Name + Microwin-GetLangFromCulture -langName (Get-Culture).Name } else { $sync["ISOLanguage"].SelectedItem } diff --git a/functions/microwin/Microwin-Classes.ps1 b/functions/microwin/Microwin-Classes.ps1 new file mode 100644 index 00000000..4c5ad676 --- /dev/null +++ b/functions/microwin/Microwin-Classes.ps1 @@ -0,0 +1,10 @@ +class ErroredPackage { + [string]$PackageName + [string]$ErrorMessage + ErroredPackage() { $this.Init(@{} )} + # Constructor for packages that have errored out + ErroredPackage([string]$pkgName, [string]$reason) { + $this.PackageName = $pkgName + $this.ErrorMessage = $reason + } +} diff --git a/functions/microwin/Microwin-CopyToUSB.ps1 b/functions/microwin/Microwin-CopyToUSB.ps1 new file mode 100644 index 00000000..06f4219d --- /dev/null +++ b/functions/microwin/Microwin-CopyToUSB.ps1 @@ -0,0 +1,23 @@ +function Microwin-CopyToUSB([string]$fileToCopy) { + foreach ($volume in Get-Volume) { + if ($volume -and $volume.FileSystemLabel -ieq "ventoy") { + $destinationPath = "$($volume.DriveLetter):\" + #Copy-Item -Path $fileToCopy -Destination $destinationPath -Force + # Get the total size of the file + $totalSize = (Get-Item "$fileToCopy").length + + Copy-Item -Path "$fileToCopy" -Destination "$destinationPath" -Verbose -Force -Recurse -Container -PassThru | + ForEach-Object { + # Calculate the percentage completed + $completed = ($_.BytesTransferred / $totalSize) * 100 + + # Display the progress bar + Write-Progress -Activity "Copying File" -Status "Progress" -PercentComplete $completed -CurrentOperation ("{0:N2} MB / {1:N2} MB" -f ($_.BytesTransferred / 1MB), ($totalSize / 1MB)) + } + + Write-Host "File copied to Ventoy drive $($volume.DriveLetter)" + return + } + } + Write-Host "Ventoy USB Key is not inserted" +} diff --git a/functions/microwin/Microwin-GetLangFromCulture.ps1 b/functions/microwin/Microwin-GetLangFromCulture.ps1 new file mode 100644 index 00000000..5c6d8fd0 --- /dev/null +++ b/functions/microwin/Microwin-GetLangFromCulture.ps1 @@ -0,0 +1,49 @@ +function Microwin-GetLangFromCulture { + + param ( + [Parameter(Mandatory, Position = 0)] [string]$langName + ) + + switch -Wildcard ($langName) + { + "ar*" { return "Arabic" } + "pt-BR" { return "Brazilian Portuguese" } + "bg*" { return "Bulgarian" } + {($_ -eq "zh-CH") -or ($_ -like "zh-Hans*") -or ($_ -eq "zh-SG") -or ($_ -eq "zh-CHS")} { return "Chinese (Simplified)" } + {($_ -eq "zh") -or ($_ -eq "zh-Hant") -or ($_ -eq "zh-HK") -or ($_ -eq "zh-MO") -or ($_ -eq "zh-TW") -or ($_ -eq "zh-CHT")} { return "Chinese (Traditional)" } + "hr*" { return "Croatian" } + "cs*" { return "Czech" } + "da*" { return "Danish" } + "nl*" { return "Dutch" } + "en-US" { return "English" } + {($_ -like "en*") -and ($_ -ne "en-US")} { return "English International" } + "et*" { return "Estonian" } + "fi*" { return "Finnish" } + {($_ -like "fr*") -and ($_ -ne "fr-CA")} { return "French" } + "fr-CA" { return "French Canadian" } + "de*" { return "German" } + "el*" { return "Greek" } + "he*" { return "Hebrew" } + "hu*" { return "Hungarian" } + "it*" { return "Italian" } + "ja*" { return "Japanese" } + "ko*" { return "Korean" } + "lv*" { return "Latvian" } + "lt*" { return "Lituanian" } + "nb*" { return "Norwegian" } + "pl*" { return "Polish" } + {($_ -like "pt*") -and ($_ -ne "pt-BR")} { return "Portuguese" } + "ro*" { return "Romanian" } + "ru*" { return "Russian" } + "sr-Latn*" { return "Serbian Latin" } + "sk*" { return "Slovak" } + "sl*" { return "Slovenian" } + {($_ -like "es*") -and ($_ -ne "es-MX")} { return "Spanish" } + "es-MX" { return "Spanish (Mexico)" } + "sv*" { return "Swedish" } + "th*" { return "Thai" } + "tr*" { return "Turkish" } + "uk*" { return "Ukrainian" } + default { return "English" } + } +} diff --git a/functions/microwin/Microwin-GetLocalizedUsers.ps1 b/functions/microwin/Microwin-GetLocalizedUsers.ps1 new file mode 100644 index 00000000..0f7bf7bd --- /dev/null +++ b/functions/microwin/Microwin-GetLocalizedUsers.ps1 @@ -0,0 +1,21 @@ +function Microwin-GetLocalizedUsers +{ + <# + .SYNOPSIS + Gets a localized user group representation for ICACLS commands (Port from DISMTools PE Helper) + .PARAMETER admins + Determines whether to get a localized user group representation for the Administrators user group + .OUTPUTS + A string containing the localized user group + .EXAMPLE + Microwin-GetLocalizedUsers -admins $true + #> + param ( + [Parameter(Mandatory = $true, Position = 0)] [bool]$admins + ) + if ($admins) { + return (Get-LocalGroup | Where-Object { $_.SID.Value -like "S-1-5-32-544" }).Name + } else { + return (Get-LocalGroup | Where-Object { $_.SID.Value -like "S-1-5-32-545" }).Name + } +} \ No newline at end of file diff --git a/functions/private/Get-Oscdimg.ps1 b/functions/microwin/Microwin-GetOscdimg.ps1 similarity index 94% rename from functions/private/Get-Oscdimg.ps1 rename to functions/microwin/Microwin-GetOscdimg.ps1 index 4680a39b..f395f71f 100644 --- a/functions/private/Get-Oscdimg.ps1 +++ b/functions/microwin/Microwin-GetOscdimg.ps1 @@ -1,10 +1,10 @@ -function Get-Oscdimg { +function Microwin-GetOscdimg { <# .DESCRIPTION This function will download oscdimg file from github Release folders and put it into env:temp folder .EXAMPLE - Get-Oscdimg + Microwin-GetOscdimg #> param( diff --git a/functions/microwin/Microwin-NewCheckInstall.ps1 b/functions/microwin/Microwin-NewCheckInstall.ps1 new file mode 100644 index 00000000..6520ac6a --- /dev/null +++ b/functions/microwin/Microwin-NewCheckInstall.ps1 @@ -0,0 +1,73 @@ +function Microwin-NewCheckInstall { + + # using here string to embedd firstrun + $checkInstall = @' + @echo off + if exist "%HOMEDRIVE%\windows\cpu.txt" ( + echo %HOMEDRIVE%\windows\cpu.txt exists + ) else ( + echo %HOMEDRIVE%\windows\cpu.txt does not exist + ) + if exist "%HOMEDRIVE%\windows\SerialNumber.txt" ( + echo %HOMEDRIVE%\windows\SerialNumber.txt exists + ) else ( + echo %HOMEDRIVE%\windows\SerialNumber.txt does not exist + ) + if exist "%HOMEDRIVE%\unattend.xml" ( + echo %HOMEDRIVE%\unattend.xml exists + ) else ( + echo %HOMEDRIVE%\unattend.xml does not exist + ) + if exist "%HOMEDRIVE%\Windows\Setup\Scripts\SetupComplete.cmd" ( + echo %HOMEDRIVE%\Windows\Setup\Scripts\SetupComplete.cmd exists + ) else ( + echo %HOMEDRIVE%\Windows\Setup\Scripts\SetupComplete.cmd does not exist + ) + if exist "%HOMEDRIVE%\Windows\Panther\unattend.xml" ( + echo %HOMEDRIVE%\Windows\Panther\unattend.xml exists + ) else ( + echo %HOMEDRIVE%\Windows\Panther\unattend.xml does not exist + ) + if exist "%HOMEDRIVE%\Windows\System32\Sysprep\unattend.xml" ( + echo %HOMEDRIVE%\Windows\System32\Sysprep\unattend.xml exists + ) else ( + echo %HOMEDRIVE%\Windows\System32\Sysprep\unattend.xml does not exist + ) + if exist "%HOMEDRIVE%\Windows\FirstStartup.ps1" ( + echo %HOMEDRIVE%\Windows\FirstStartup.ps1 exists + ) else ( + echo %HOMEDRIVE%\Windows\FirstStartup.ps1 does not exist + ) + if exist "%HOMEDRIVE%\Windows\winutil.ps1" ( + echo %HOMEDRIVE%\Windows\winutil.ps1 exists + ) else ( + echo %HOMEDRIVE%\Windows\winutil.ps1 does not exist + ) + if exist "%HOMEDRIVE%\Windows\LogSpecialize.txt" ( + echo %HOMEDRIVE%\Windows\LogSpecialize.txt exists + ) else ( + echo %HOMEDRIVE%\Windows\LogSpecialize.txt does not exist + ) + if exist "%HOMEDRIVE%\Windows\LogAuditUser.txt" ( + echo %HOMEDRIVE%\Windows\LogAuditUser.txt exists + ) else ( + echo %HOMEDRIVE%\Windows\LogAuditUser.txt does not exist + ) + if exist "%HOMEDRIVE%\Windows\LogOobeSystem.txt" ( + echo %HOMEDRIVE%\Windows\LogOobeSystem.txt exists + ) else ( + echo %HOMEDRIVE%\Windows\LogOobeSystem.txt does not exist + ) + if exist "%HOMEDRIVE%\windows\csup.txt" ( + echo %HOMEDRIVE%\windows\csup.txt exists + ) else ( + echo %HOMEDRIVE%\windows\csup.txt does not exist + ) + if exist "%HOMEDRIVE%\windows\LogFirstRun.txt" ( + echo %HOMEDRIVE%\windows\LogFirstRun.txt exists + ) else ( + echo %HOMEDRIVE%\windows\LogFirstRun.txt does not exist + ) +'@ + $checkInstall | Out-File -FilePath "$env:temp\checkinstall.cmd" -Force -Encoding Ascii +} diff --git a/functions/microwin/Microwin-NewFirstRun.ps1 b/functions/microwin/Microwin-NewFirstRun.ps1 new file mode 100644 index 00000000..614df6bc --- /dev/null +++ b/functions/microwin/Microwin-NewFirstRun.ps1 @@ -0,0 +1,68 @@ +function Microwin-NewFirstRun { + + # using here string to embedd firstrun + $firstRun = @' + # Set the global error action preference to continue + $ErrorActionPreference = "Continue" + function Remove-RegistryValue { + param ( + [Parameter(Mandatory = $true)] + [string]$RegistryPath, + + [Parameter(Mandatory = $true)] + [string]$ValueName + ) + + # Check if the registry path exists + if (Test-Path -Path $RegistryPath) { + $registryValue = Get-ItemProperty -Path $RegistryPath -Name $ValueName -ErrorAction SilentlyContinue + + # Check if the registry value exists + if ($registryValue) { + # Remove the registry value + Remove-ItemProperty -Path $RegistryPath -Name $ValueName -Force + Write-Host "Registry value '$ValueName' removed from '$RegistryPath'." + } else { + Write-Host "Registry value '$ValueName' not found in '$RegistryPath'." + } + } else { + Write-Host "Registry path '$RegistryPath' not found." + } + } + + "FirstStartup has worked" | Out-File -FilePath "$env:HOMEDRIVE\windows\LogFirstRun.txt" -Append -NoClobber + + $taskbarPath = "$env:AppData\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar" + # Delete all files on the Taskbar + Get-ChildItem -Path $taskbarPath -File | Remove-Item -Force + Remove-RegistryValue -RegistryPath "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband" -ValueName "FavoritesRemovedChanges" + Remove-RegistryValue -RegistryPath "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband" -ValueName "FavoritesChanges" + Remove-RegistryValue -RegistryPath "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband" -ValueName "Favorites" + + # Delete Edge Icon from the desktop + $edgeShortcutFiles = Get-ChildItem -Path $desktopPath -Filter "*Edge*.lnk" + # Check if Edge shortcuts exist on the desktop + if ($edgeShortcutFiles) { + foreach ($shortcutFile in $edgeShortcutFiles) { + # Remove each Edge shortcut + Remove-Item -Path $shortcutFile.FullName -Force + Write-Host "Edge shortcut '$($shortcutFile.Name)' removed from the desktop." + } + } + Remove-Item -Path "$env:USERPROFILE\Desktop\*.lnk" + Remove-Item -Path "$env:HOMEDRIVE\Users\Default\Desktop\*.lnk" + + try + { + if ((Get-WindowsOptionalFeature -Online | Where-Object { $_.FeatureName -like "Recall" }).Count -gt 0) + { + Disable-WindowsOptionalFeature -Online -FeatureName "Recall" -Remove + } + } + catch + { + + } +'@ + $firstRun | Out-File -FilePath "$env:temp\FirstStartup.ps1" -Force +} diff --git a/functions/microwin/Microwin-NewUnattend.ps1 b/functions/microwin/Microwin-NewUnattend.ps1 new file mode 100644 index 00000000..87188aca --- /dev/null +++ b/functions/microwin/Microwin-NewUnattend.ps1 @@ -0,0 +1,310 @@ +function Microwin-NewUnattend { + + param ( + [Parameter(Mandatory, Position = 0)] [string]$userName, + [Parameter(Position = 1)] [string]$userPassword + ) + + $unattend = @' + + + <#REPLACEME#> + + + + + 1 + CMD /C echo LAU GG>C:\Windows\LogAuditUser.txt + StartMenu + + + + + + + + + + USER-REPLACEME + Administrators + + PW-REPLACEME + true</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\Microwin-RemovePackages.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 ((Microwin-TestCompatibleImage $imgVersion $([System.Version]::new(10,0,22000,1))) -eq $false) { + # Replace the placeholder text with an empty string to make it valid for Windows 10 Setup + $unattend = $unattend.Replace("<#REPLACEME#>", "").Trim() + } else { + # Replace the placeholder text with the Specialize pass + $unattend = $unattend.Replace("<#REPLACEME#>", $specPass).Trim() + } + # Replace default User and Password values with the provided parameters + $unattend = $unattend.Replace("USER-REPLACEME", $userName).Trim() + $unattend = $unattend.Replace("PW-REPLACEME", $userPassword).Trim() + + # Save unattended answer file with UTF-8 encoding + $unattend | Out-File -FilePath "$env:temp\unattend.xml" -Force -Encoding utf8 +} diff --git a/functions/microwin/Microwin-RemoveFeatures.ps1 b/functions/microwin/Microwin-RemoveFeatures.ps1 new file mode 100644 index 00000000..5b37adb2 --- /dev/null +++ b/functions/microwin/Microwin-RemoveFeatures.ps1 @@ -0,0 +1,40 @@ +function Microwin-RemoveFeatures() { + <# + .SYNOPSIS + Removes certain features from ISO image + + .PARAMETER Name + No Params + + .EXAMPLE + Microwin-RemoveFeatures + #> + try { + $featlist = (Get-WindowsOptionalFeature -Path $scratchDir) + + $featlist = $featlist | Where-Object { + $_.FeatureName -NotLike "*Defender*" -AND + $_.FeatureName -NotLike "*Printing*" -AND + $_.FeatureName -NotLike "*TelnetClient*" -AND + $_.FeatureName -NotLike "*PowerShell*" -AND + $_.FeatureName -NotLike "*NetFx*" -AND + $_.FeatureName -NotLike "*Media*" -AND + $_.FeatureName -NotLike "*NFS*" -AND + $_.FeatureName -NotLike "*SearchEngine*" -AND + $_.FeatureName -NotLike "*RemoteDesktop*" -AND + $_.State -ne "Disabled" + } + + foreach($feature in $featlist) { + $status = "Removing feature $($feature.FeatureName)" + Write-Progress -Activity "Removing features" -Status $status -PercentComplete ($counter++/$featlist.Count*100) + Write-Debug "Removing feature $($feature.FeatureName)" + Disable-WindowsOptionalFeature -Path "$scratchDir" -FeatureName $($feature.FeatureName) -Remove -ErrorAction SilentlyContinue -NoRestart + } + Write-Progress -Activity "Removing features" -Status "Ready" -Completed + Write-Host "You can re-enable the disabled features at any time, using either Windows Update or the SxS folder in <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/Microwin-RemoveFileOrDirectory.ps1 b/functions/microwin/Microwin-RemoveFileOrDirectory.ps1 new file mode 100644 index 00000000..002e7a65 --- /dev/null +++ b/functions/microwin/Microwin-RemoveFileOrDirectory.ps1 @@ -0,0 +1,42 @@ +function Microwin-RemoveFileOrDirectory([string]$pathToDelete, [string]$mask = "", [switch]$Directory = $false) { + if(([string]::IsNullOrEmpty($pathToDelete))) { return } + if (-not (Test-Path -Path "$($pathToDelete)")) { return } + + $yesNo = Get-LocalizedYesNo + Write-Host "[INFO] In Your local takeown expects '$($yesNo[0])' as a Yes answer." + + $itemsToDelete = [System.Collections.ArrayList]::new() + + if ($mask -eq "") { + Write-Debug "Adding $($pathToDelete) to array." + [void]$itemsToDelete.Add($pathToDelete) + } else { + Write-Debug "Adding $($pathToDelete) to array and mask is $($mask)" + if ($Directory) { $itemsToDelete = Get-ChildItem $pathToDelete -Include $mask -Recurse -Directory } else { $itemsToDelete = Get-ChildItem $pathToDelete -Include $mask -Recurse } + } + + foreach($itemToDelete in $itemsToDelete) { + $status = "Deleting $($itemToDelete)" + Write-Progress -Activity "Removing Items" -Status $status -PercentComplete ($counter++/$itemsToDelete.Count*100) + + if (Test-Path -Path "$($itemToDelete)" -PathType Container) { + $status = "Deleting directory: $($itemToDelete)" + + takeown /r /d $yesNo[0] /a /f "$($itemToDelete)" + icacls "$($itemToDelete)" /q /c /t /reset + icacls $itemToDelete /setowner "*S-1-5-32-544" + icacls $itemToDelete /grant "*S-1-5-32-544:(OI)(CI)F" /t /c /q + Remove-Item -Force -Recurse "$($itemToDelete)" + } + elseif (Test-Path -Path "$($itemToDelete)" -PathType Leaf) { + $status = "Deleting file: $($itemToDelete)" + + takeown /a /f "$($itemToDelete)" + icacls "$($itemToDelete)" /q /c /t /reset + icacls "$($itemToDelete)" /setowner "*S-1-5-32-544" + icacls "$($itemToDelete)" /grant "*S-1-5-32-544:(OI)(CI)F" /t /c /q + Remove-Item -Force "$($itemToDelete)" + } + } + Write-Progress -Activity "Removing Items" -Status "Ready" -Completed +} diff --git a/functions/microwin/Microwin-RemovePackages.ps1 b/functions/microwin/Microwin-RemovePackages.ps1 new file mode 100644 index 00000000..ed53056c --- /dev/null +++ b/functions/microwin/Microwin-RemovePackages.ps1 @@ -0,0 +1,96 @@ +function Microwin-RemovePackages { + try { + $pkglist = (Get-WindowsPackage -Path "$scratchDir").PackageName + + $pkglist = $pkglist | Where-Object { + $_ -NotLike "*ApplicationModel*" -AND + $_ -NotLike "*indows-Client-LanguagePack*" -AND + $_ -NotLike "*LanguageFeatures-Basic*" -AND + $_ -NotLike "*Package_for_ServicingStack*" -AND + $_ -NotLike "*.NET*" -AND + $_ -NotLike "*Store*" -AND + $_ -NotLike "*VCLibs*" -AND + $_ -NotLike "*AAD.BrokerPlugin", + $_ -NotLike "*LockApp*" -AND + $_ -NotLike "*Notepad*" -AND + $_ -NotLike "*immersivecontrolpanel*" -AND + $_ -NotLike "*ContentDeliveryManager*" -AND + $_ -NotLike "*PinningConfirMationDialog*" -AND + $_ -NotLike "*SecHealthUI*" -AND + $_ -NotLike "*SecureAssessmentBrowser*" -AND + $_ -NotLike "*PrintDialog*" -AND + $_ -NotLike "*AssignedAccessLockApp*" -AND + $_ -NotLike "*OOBENetworkConnectionFlow*" -AND + $_ -NotLike "*Apprep.ChxApp*" -AND + $_ -NotLike "*CBS*" -AND + $_ -NotLike "*OOBENetworkCaptivePortal*" -AND + $_ -NotLike "*PeopleExperienceHost*" -AND + $_ -NotLike "*ParentalControls*" -AND + $_ -NotLike "*Win32WebViewHost*" -AND + $_ -NotLike "*InputApp*" -AND + $_ -NotLike "*DirectPlay*" -AND + $_ -NotLike "*AccountsControl*" -AND + $_ -NotLike "*AsyncTextService*" -AND + $_ -NotLike "*CapturePicker*" -AND + $_ -NotLike "*CredDialogHost*" -AND + $_ -NotLike "*BioEnrollMent*" -AND + $_ -NotLike "*ShellExperienceHost*" -AND + $_ -NotLike "*DesktopAppInstaller*" -AND + $_ -NotLike "*WebMediaExtensions*" -AND + $_ -NotLike "*WMIC*" -AND + $_ -NotLike "*UI.XaML*" -AND + $_ -NotLike "*Ethernet*" -AND + $_ -NotLike "*Wifi*" -AND + $_ -NotLike "*FodMetadata*" -AND + $_ -NotLike "*Foundation*" -AND + $_ -NotLike "*LanguageFeatures*" -AND + $_ -NotLike "*VBSCRIPT*" -AND + $_ -NotLike "*License*" + } + + $failedCount = 0 + + $erroredPackages = [System.Collections.Generic.List[ErroredPackage]]::new() + + foreach ($pkg in $pkglist) { + try { + $status = "Removing $pkg" + Write-Progress -Activity "Removing Packages" -Status $status -PercentComplete ($counter++/$pkglist.Count*100) + Remove-WindowsPackage -Path "$scratchDir" -PackageName $pkg -NoRestart -ErrorAction SilentlyContinue + } catch { + # This can happen if the package that is being removed is a permanent one + $erroredPackages.Add([ErroredPackage]::new($pkg, $_.Exception.Message)) + $failedCount += 1 + continue + } + } + Write-Progress -Activity "Removing Packages" -Status "Ready" -Completed + if ($failedCount -gt 0) + { + Write-Host "$failedCount package(s) could not be removed. Your image will still work fine, however. Below is information on what packages failed to be removed and why." + if ($erroredPackages.Count -gt 0) + { + $erroredPackages = $erroredPackages | Sort-Object -Property ErrorMessage + + $previousErroredPackage = $erroredPackages[0] + $counter = 0 + Write-Host "" + Write-Host "- $($previousErroredPackage.ErrorMessage)" + foreach ($erroredPackage in $erroredPackages) { + if ($erroredPackage.ErrorMessage -ne $previousErroredPackage.ErrorMessage) { + Write-Host "" + $counter = 0 + Write-Host "- $($erroredPackage.ErrorMessage)" + } + $counter += 1 + Write-Host " $counter) $($erroredPackage.PackageName)" + $previousErroredPackage = $erroredPackage + } + Write-Host "" + } + } + } catch { + Write-Host "Unable to get information about the packages. MicroWin processing will continue, but packages will not be processed" + Write-Host "Error information: $($_.Exception.Message)" -ForegroundColor Yellow + } +} diff --git a/functions/microwin/Microwin-RemoveProvisionedPackages.ps1 b/functions/microwin/Microwin-RemoveProvisionedPackages.ps1 new file mode 100644 index 00000000..30bc0d74 --- /dev/null +++ b/functions/microwin/Microwin-RemoveProvisionedPackages.ps1 @@ -0,0 +1,51 @@ +function Microwin-RemoveProvisionedPackages() { + <# + .SYNOPSIS + Removes AppX packages from a Windows image during MicroWin processing + + .PARAMETER Name + No Params + + .EXAMPLE + Microwin-RemoveProvisionedPackages + #> + try + { + $appxProvisionedPackages = Get-AppxProvisionedPackage -Path "$($scratchDir)" | Where-Object { + $_.PackageName -NotLike "*AppInstaller*" -AND + $_.PackageName -NotLike "*Store*" -and + $_.PackageName -NotLike "*Notepad*" -and + $_.PackageName -NotLike "*Printing*" -and + $_.PackageName -NotLike "*YourPhone*" -and + $_.PackageName -NotLike "*Xbox*" -and + $_.PackageName -NotLike "*WindowsTerminal*" -and + $_.PackageName -NotLike "*Calculator*" -and + $_.PackageName -NotLike "*Photos*" -and + $_.PackageName -NotLike "*VCLibs*" -and + $_.PackageName -NotLike "*Paint*" -and + $_.PackageName -NotLike "*Gaming*" -and + $_.PackageName -NotLike "*Extension*" -and + $_.PackageName -NotLike "*SecHealthUI*" -and + $_.PackageName -NotLike "*ScreenSketch*" + } + + $counter = 0 + foreach ($appx in $appxProvisionedPackages) { + $status = "Removing Provisioned $($appx.PackageName)" + Write-Progress -Activity "Removing Provisioned Apps" -Status $status -PercentComplete ($counter++/$appxProvisionedPackages.Count*100) + try { + Remove-AppxProvisionedPackage -Path "$scratchDir" -PackageName $appx.PackageName -ErrorAction SilentlyContinue + } catch { + Write-Host "Application $($appx.PackageName) could not be removed" + continue + } + } + Write-Progress -Activity "Removing Provisioned Apps" -Status "Ready" -Completed + } + catch + { + # This can happen if getting AppX packages fails + Write-Host "Unable to get information about the AppX packages. MicroWin processing will continue, but AppX packages will not be processed" + Write-Host "Error information: $($_.Exception.Message)" -ForegroundColor Yellow + } +} diff --git a/functions/microwin/Microwin-TestCompatibleImage.ps1 b/functions/microwin/Microwin-TestCompatibleImage.ps1 new file mode 100644 index 00000000..f1305e92 --- /dev/null +++ b/functions/microwin/Microwin-TestCompatibleImage.ps1 @@ -0,0 +1,26 @@ +function Microwin-TestCompatibleImage() { + <# + .SYNOPSIS + Checks the version of a Windows image and determines whether or not it is compatible with a specific feature depending on a desired version + + .PARAMETER Name + imgVersion - The version of the Windows image + desiredVersion - The version to compare the image version with + #> + + param + ( + [Parameter(Mandatory, position=0)] + [string]$imgVersion, + + [Parameter(Mandatory, position=1)] + [Version]$desiredVersion + ) + + try { + $version = [Version]$imgVersion + return $version -ge $desiredVersion + } catch { + return $False + } +} diff --git a/functions/private/Invoke-WinUtilMicroWin-Helper.ps1 b/functions/private/Invoke-WinUtilMicroWin-Helper.ps1 deleted file mode 100644 index 361f21b2..00000000 --- a/functions/private/Invoke-WinUtilMicroWin-Helper.ps1 +++ /dev/null @@ -1,823 +0,0 @@ -function Test-CompatibleImage() { - <# - .SYNOPSIS - Checks the version of a Windows image and determines whether or not it is compatible with a specific feature depending on a desired version - - .PARAMETER Name - imgVersion - The version of the Windows image - desiredVersion - The version to compare the image version with - #> - - param - ( - [Parameter(Mandatory, position=0)] - [string]$imgVersion, - - [Parameter(Mandatory, position=1)] - [Version]$desiredVersion - ) - - try { - $version = [Version]$imgVersion - return $version -ge $desiredVersion - } catch { - return $False - } -} - -class ErroredPackage { - [string]$PackageName - [string]$ErrorMessage - ErroredPackage() { $this.Init(@{} )} - # Constructor for packages that have errored out - ErroredPackage([string]$pkgName, [string]$reason) { - $this.PackageName = $pkgName - $this.ErrorMessage = $reason - } -} - -function Get-FidoLangFromCulture { - - param ( - [Parameter(Mandatory, Position = 0)] [string]$langName - ) - - switch -Wildcard ($langName) - { - "ar*" { return "Arabic" } - "pt-BR" { return "Brazilian Portuguese" } - "bg*" { return "Bulgarian" } - {($_ -eq "zh-CH") -or ($_ -like "zh-Hans*") -or ($_ -eq "zh-SG") -or ($_ -eq "zh-CHS")} { return "Chinese (Simplified)" } - {($_ -eq "zh") -or ($_ -eq "zh-Hant") -or ($_ -eq "zh-HK") -or ($_ -eq "zh-MO") -or ($_ -eq "zh-TW") -or ($_ -eq "zh-CHT")} { return "Chinese (Traditional)" } - "hr*" { return "Croatian" } - "cs*" { return "Czech" } - "da*" { return "Danish" } - "nl*" { return "Dutch" } - "en-US" { return "English" } - {($_ -like "en*") -and ($_ -ne "en-US")} { return "English International" } - "et*" { return "Estonian" } - "fi*" { return "Finnish" } - {($_ -like "fr*") -and ($_ -ne "fr-CA")} { return "French" } - "fr-CA" { return "French Canadian" } - "de*" { return "German" } - "el*" { return "Greek" } - "he*" { return "Hebrew" } - "hu*" { return "Hungarian" } - "it*" { return "Italian" } - "ja*" { return "Japanese" } - "ko*" { return "Korean" } - "lv*" { return "Latvian" } - "lt*" { return "Lituanian" } - "nb*" { return "Norwegian" } - "pl*" { return "Polish" } - {($_ -like "pt*") -and ($_ -ne "pt-BR")} { return "Portuguese" } - "ro*" { return "Romanian" } - "ru*" { return "Russian" } - "sr-Latn*" { return "Serbian Latin" } - "sk*" { return "Slovak" } - "sl*" { return "Slovenian" } - {($_ -like "es*") -and ($_ -ne "es-MX")} { return "Spanish" } - "es-MX" { return "Spanish (Mexico)" } - "sv*" { return "Swedish" } - "th*" { return "Thai" } - "tr*" { return "Turkish" } - "uk*" { return "Ukrainian" } - default { return "English" } - } -} - -function Remove-Features() { - <# - .SYNOPSIS - Removes certain features from ISO image - - .PARAMETER Name - No Params - - .EXAMPLE - Remove-Features - #> - try { - $featlist = (Get-WindowsOptionalFeature -Path $scratchDir) - - $featlist = $featlist | Where-Object { - $_.FeatureName -NotLike "*Defender*" -AND - $_.FeatureName -NotLike "*Printing*" -AND - $_.FeatureName -NotLike "*TelnetClient*" -AND - $_.FeatureName -NotLike "*PowerShell*" -AND - $_.FeatureName -NotLike "*NetFx*" -AND - $_.FeatureName -NotLike "*Media*" -AND - $_.FeatureName -NotLike "*NFS*" -AND - $_.FeatureName -NotLike "*SearchEngine*" -AND - $_.FeatureName -NotLike "*RemoteDesktop*" -AND - $_.State -ne "Disabled" - } - - foreach($feature in $featlist) { - $status = "Removing feature $($feature.FeatureName)" - Write-Progress -Activity "Removing features" -Status $status -PercentComplete ($counter++/$featlist.Count*100) - Write-Debug "Removing feature $($feature.FeatureName)" - Disable-WindowsOptionalFeature -Path "$scratchDir" -FeatureName $($feature.FeatureName) -Remove -ErrorAction SilentlyContinue -NoRestart - } - Write-Progress -Activity "Removing features" -Status "Ready" -Completed - Write-Host "You can re-enable the disabled features at any time, using either Windows Update or the SxS folder in <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 Get-LocalizedUsers -{ - <# - .SYNOPSIS - Gets a localized user group representation for ICACLS commands (Port from DISMTools PE Helper) - .PARAMETER admins - Determines whether to get a localized user group representation for the Administrators user group - .OUTPUTS - A string containing the localized user group - .EXAMPLE - Get-LocalizedUsers -admins $true - #> - param ( - [Parameter(Mandatory = $true, Position = 0)] [bool]$admins - ) - if ($admins) - { - return (Get-LocalGroup | Where-Object { $_.SID.Value -like "S-1-5-32-544" }).Name - } - else - { - return (Get-LocalGroup | Where-Object { $_.SID.Value -like "S-1-5-32-545" }).Name - } -} - -function Copy-ToUSB([string]$fileToCopy) { - foreach ($volume in Get-Volume) { - if ($volume -and $volume.FileSystemLabel -ieq "ventoy") { - $destinationPath = "$($volume.DriveLetter):\" - #Copy-Item -Path $fileToCopy -Destination $destinationPath -Force - # Get the total size of the file - $totalSize = (Get-Item "$fileToCopy").length - - Copy-Item -Path "$fileToCopy" -Destination "$destinationPath" -Verbose -Force -Recurse -Container -PassThru | - ForEach-Object { - # Calculate the percentage completed - $completed = ($_.BytesTransferred / $totalSize) * 100 - - # Display the progress bar - Write-Progress -Activity "Copying File" -Status "Progress" -PercentComplete $completed -CurrentOperation ("{0:N2} MB / {1:N2} MB" -f ($_.BytesTransferred / 1MB), ($totalSize / 1MB)) - } - - Write-Host "File copied to Ventoy drive $($volume.DriveLetter)" - return - } - } - Write-Host "Ventoy USB Key is not inserted" -} - -function Remove-FileOrDirectory([string]$pathToDelete, [string]$mask = "", [switch]$Directory = $false) { - if(([string]::IsNullOrEmpty($pathToDelete))) { return } - if (-not (Test-Path -Path "$($pathToDelete)")) { return } - - $yesNo = Get-LocalizedYesNo - Write-Host "[INFO] In Your local takeown expects '$($yesNo[0])' as a Yes answer." - - $itemsToDelete = [System.Collections.ArrayList]::new() - - if ($mask -eq "") { - Write-Debug "Adding $($pathToDelete) to array." - [void]$itemsToDelete.Add($pathToDelete) - } else { - Write-Debug "Adding $($pathToDelete) to array and mask is $($mask)" - if ($Directory) { $itemsToDelete = Get-ChildItem $pathToDelete -Include $mask -Recurse -Directory } else { $itemsToDelete = Get-ChildItem $pathToDelete -Include $mask -Recurse } - } - - foreach($itemToDelete in $itemsToDelete) { - $status = "Deleting $($itemToDelete)" - Write-Progress -Activity "Removing Items" -Status $status -PercentComplete ($counter++/$itemsToDelete.Count*100) - - if (Test-Path -Path "$($itemToDelete)" -PathType Container) { - $status = "Deleting directory: $($itemToDelete)" - - takeown /r /d $yesNo[0] /a /f "$($itemToDelete)" - icacls "$($itemToDelete)" /q /c /t /reset - icacls $itemToDelete /setowner "*S-1-5-32-544" - icacls $itemToDelete /grant "*S-1-5-32-544:(OI)(CI)F" /t /c /q - Remove-Item -Force -Recurse "$($itemToDelete)" - } - elseif (Test-Path -Path "$($itemToDelete)" -PathType Leaf) { - $status = "Deleting file: $($itemToDelete)" - - takeown /a /f "$($itemToDelete)" - icacls "$($itemToDelete)" /q /c /t /reset - icacls "$($itemToDelete)" /setowner "*S-1-5-32-544" - icacls "$($itemToDelete)" /grant "*S-1-5-32-544:(OI)(CI)F" /t /c /q - Remove-Item -Force "$($itemToDelete)" - } - } - Write-Progress -Activity "Removing Items" -Status "Ready" -Completed -} - -function New-Unattend { - - param ( - [Parameter(Mandatory, Position = 0)] [string]$userName, - [Parameter(Position = 1)] [string]$userPassword - ) - - $unattend = @' - <?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" - - 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/private/Set-WinUtilRegistry.ps1 b/functions/private/Set-WinUtilRegistry.ps1 index d2141800..cc81e1c8 100644 --- a/functions/private/Set-WinUtilRegistry.ps1 +++ b/functions/private/Set-WinUtilRegistry.ps1 @@ -35,11 +35,12 @@ function Set-WinUtilRegistry { New-Item -Path $Path -Force -ErrorAction Stop | Out-Null } - Write-Host "Set $Path\$Name to $Value" if ($Value -ne "<RemoveEntry>") { + Write-Host "Set $Path\$Name to $Value" Set-ItemProperty -Path $Path -Name $Name -Type $Type -Value $Value -Force -ErrorAction Stop | Out-Null } else{ + Write-Host "Remove $Path\$Name" Remove-ItemProperty -Path $Path -Name $Name -Force -ErrorAction Stop | Out-Null } } catch [System.Security.SecurityException] { diff --git a/functions/public/Invoke-WPFButton.ps1 b/functions/public/Invoke-WPFButton.ps1 index 5c927026..8a63e3bb 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} "WPFWinUtilInstallPSProfile" {Invoke-WinUtilInstallPSProfile} diff --git a/scripts/main.ps1 b/scripts/main.ps1 index 9186fb9c..c1c7097c 100644 --- a/scripts/main.ps1 +++ b/scripts/main.ps1 @@ -10,7 +10,7 @@ $InitialSessionState = [System.Management.Automation.Runspaces.InitialSessionSta $InitialSessionState.Variables.Add($hashVars) # Get every private function and add them to the session state -$functions = (Get-ChildItem function:\).where{$_.name -like "*winutil*" -or $_.name -like "*WPF*"} +$functions = Get-ChildItem function:\ | Where-Object { $_.Name -imatch 'winutil|Microwin|WPF' } foreach ($function in $functions) { $functionDefinition = Get-Content function:\$($function.name) $functionEntry = New-Object System.Management.Automation.Runspaces.SessionStateFunctionEntry -ArgumentList $($function.name), $functionDefinition @@ -413,7 +413,7 @@ $sync["ISOmanual"].add_Checked({ $sync["ISORelease"].Items.Add("24H2") | Out-Null $sync["ISORelease"].SelectedItem = "24H2" -$sync["ISOLanguage"].Items.Add("System Language ($(Get-FidoLangFromCulture -langName $((Get-Culture).Name)))") | Out-Null +$sync["ISOLanguage"].Items.Add("System Language ($(Microwin-GetLangFromCulture -langName $((Get-Culture).Name)))") | Out-Null if ($currentCulture -ne "English International") { $sync["ISOLanguage"].Items.Add("English International") | Out-Null } diff --git a/windev.ps1 b/windev.ps1 index 9668d2a7..6b627e08 100644 --- a/windev.ps1 +++ b/windev.ps1 @@ -30,7 +30,7 @@ function RedirectToLatestPreRelease { if ($latestRelease) { $url = "https://github.com/ChrisTitusTech/winutil/releases/download/$latestRelease/winutil.ps1" } else { - Write-Host 'Unable to determine latest pre-release version.' -ForegroundColor Red + Write-Host 'No pre-release version found. This is most likely because the latest release is a full release and no newer pre-release exists.' -ForegroundColor Yellow Write-Host "Using latest Full Release" $url = "https://github.com/ChrisTitusTech/winutil/releases/latest/download/winutil.ps1" }