Created
December 18, 2025 06:59
-
-
Save dongfg/2c9efdc72514e54f36c1107af0d5a9c8 to your computer and use it in GitHub Desktop.
autounattend.xml by https://schneegans.de/windows/unattend-generator
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?xml version="1.0" encoding="utf-8"?> | |
| <unattend xmlns="urn:schemas-microsoft-com:unattend" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State"> | |
| <!--https://schneegans.de/windows/unattend-generator/?LanguageMode=Interactive&ProcessorArchitecture=amd64&BypassRequirementsCheck=true&BypassNetworkCheck=true&ComputerNameMode=Script&ComputerNameScript=return+Read-Host+-Prompt+%27Enter+computer+name%27%3B&CompactOsMode=Default&TimeZoneMode=Explicit&TimeZone=China+Standard+Time&PartitionMode=Interactive&DiskAssertionMode=Skip&WindowsEditionMode=Generic&WindowsEdition=pro&InstallFromMode=Automatic&PEMode=Default&UserAccountMode=Unattended&AccountName0=dongfg&AccountDisplayName0=&AccountPassword0=&AccountGroup0=Administrators&AutoLogonMode=Own&PasswordExpirationMode=Unlimited&LockoutMode=Default&HideFiles=Hidden&ShowFileExtensions=true&ClassicContextMenu=true&LaunchToThisPC=true&ShowEndTask=true&TaskbarSearch=Hide&TaskbarIconsMode=Default&DisableWidgets=true&LeftTaskbar=true&HideTaskViewButton=true&DisableBingResults=true&StartTilesMode=Empty&StartPinsMode=Empty&DisableDefender=true&DisableSystemRestore=true&EnableLongPaths=true&AllowPowerShellScripts=true&DisableLastAccess=true&DisableAppSuggestions=true&PreventDeviceEncryption=true&HideEdgeFre=true&DisableEdgeStartupBoost=true&EffectsMode=Default&DeleteEdgeDesktopIcon=true&DesktopIconsMode=Default&StartFoldersMode=Custom&StartFolderDownloads=true&StartFolderSettings=true&WifiMode=Interactive&ExpressSettings=DisableAll&LockKeysMode=Skip&StickyKeysMode=Disabled&ColorMode=Default&WallpaperMode=Solid&WallpaperColor=%23008080&LockScreenMode=Default&Remove3DViewer=true&RemoveBingSearch=true&RemoveCalculator=true&RemoveCamera=true&RemoveClipchamp=true&RemoveClock=true&RemoveCopilot=true&RemoveCortana=true&RemoveDevHome=true&RemoveWindowsHello=true&RemoveFamily=true&RemoveFeedbackHub=true&RemoveGameAssist=true&RemoveGetHelp=true&RemoveHandwriting=true&RemoveInternetExplorer=true&RemoveMailCalendar=true&RemoveMaps=true&RemoveMathInputPanel=true&RemoveMediaFeatures=true&RemoveMixedReality=true&RemoveZuneVideo=true&RemoveNews=true&RemoveNotepad=true&RemoveOffice365=true&RemoveOneDrive=true&RemoveOneNote=true&RemoveOneSync=true&RemoveOpenSSHClient=true&RemoveOutlook=true&RemovePaint=true&RemovePaint3D=true&RemovePeople=true&RemovePhotos=true&RemovePowerAutomate=true&RemovePowerShell2=true&RemovePowerShellISE=true&RemoveQuickAssist=true&RemoveRecall=true&RemoveRdpClient=true&RemoveSkype=true&RemoveSnippingTool=true&RemoveSolitaire=true&RemoveSpeech=true&RemoveStepsRecorder=true&RemoveStickyNotes=true&RemoveTeams=true&RemoveGetStarted=true&RemoveToDo=true&RemoveVoiceRecorder=true&RemoveWallet=true&RemoveWeather=true&RemoveFaxAndScan=true&RemoveWindowsMediaPlayer=true&RemoveZuneMusic=true&RemoveWindowsTerminal=true&RemoveWordPad=true&RemoveXboxApps=true&RemoveYourPhone=true&WdacMode=Skip&AppLockerMode=Skip--> | |
| <settings pass="offlineServicing"></settings> | |
| <settings pass="windowsPE"> | |
| <component name="Microsoft-Windows-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS"> | |
| <UserData> | |
| <ProductKey> | |
| <Key>VK7JG-NPHTM-C97JM-9MPGT-3V66T</Key> | |
| <WillShowUI>OnError</WillShowUI> | |
| </ProductKey> | |
| <AcceptEula>true</AcceptEula> | |
| </UserData> | |
| <UseConfigurationSet>false</UseConfigurationSet> | |
| <RunSynchronous> | |
| <RunSynchronousCommand wcm:action="add"> | |
| <Order>1</Order> | |
| <Path>reg.exe add "HKLM\SYSTEM\Setup\LabConfig" /v BypassTPMCheck /t REG_DWORD /d 1 /f</Path> | |
| </RunSynchronousCommand> | |
| <RunSynchronousCommand wcm:action="add"> | |
| <Order>2</Order> | |
| <Path>reg.exe add "HKLM\SYSTEM\Setup\LabConfig" /v BypassSecureBootCheck /t REG_DWORD /d 1 /f</Path> | |
| </RunSynchronousCommand> | |
| <RunSynchronousCommand wcm:action="add"> | |
| <Order>3</Order> | |
| <Path>reg.exe add "HKLM\SYSTEM\Setup\LabConfig" /v BypassRAMCheck /t REG_DWORD /d 1 /f</Path> | |
| </RunSynchronousCommand> | |
| <RunSynchronousCommand wcm:action="add"> | |
| <Order>4</Order> | |
| <Path>cmd.exe /c ">>"X:\defender.vbs" (echo:WScript.Echo ^"Scanning for newly created SYSTEM registry hive file to disable Windows Defender services...^"&echo:Set fso = CreateObject(^"Scripting.FileSystemObject^"^))"</Path> | |
| </RunSynchronousCommand> | |
| <RunSynchronousCommand wcm:action="add"> | |
| <Order>5</Order> | |
| <Path>cmd.exe /c ">>"X:\defender.vbs" (echo:Set existing = CreateObject(^"Scripting.Dictionary^"^)&echo:Function Execute(command^)&echo:WScript.Echo ^"Running command '^" + command + ^"'^"&echo:Set shell = CreateObject(^"WScript.Shell^"^))"</Path> | |
| </RunSynchronousCommand> | |
| <RunSynchronousCommand wcm:action="add"> | |
| <Order>6</Order> | |
| <Path>cmd.exe /c ">>"X:\defender.vbs" (echo:Set exec = shell.Exec(command^)&echo:Do While exec.Status = 0&echo:WScript.Sleep 100&echo:Loop&echo:WScript.Echo exec.StdOut.ReadAll&echo:WScript.Echo exec.StdErr.ReadAll&echo:Execute = exec.ExitCode)"</Path> | |
| </RunSynchronousCommand> | |
| <RunSynchronousCommand wcm:action="add"> | |
| <Order>7</Order> | |
| <Path>cmd.exe /c ">>"X:\defender.vbs" (echo:End Function&echo:Function FindHiveFiles&echo:Set FindHiveFiles = CreateObject(^"Scripting.Dictionary^"^)&echo:For Each drive In fso.Drives&echo:If drive.IsReady And drive.DriveLetter ^<^> ^"X^" Then)"</Path> | |
| </RunSynchronousCommand> | |
| <RunSynchronousCommand wcm:action="add"> | |
| <Order>8</Order> | |
| <Path>cmd.exe /c ">>"X:\defender.vbs" (echo:For Each folder In Array(^"$Windows.~BT\NewOS\Windows^", ^"Windows^"^)&echo:file = fso.BuildPath(fso.BuildPath(drive.RootFolder, folder^), ^"System32\config\SYSTEM^"^))"</Path> | |
| </RunSynchronousCommand> | |
| <RunSynchronousCommand wcm:action="add"> | |
| <Order>9</Order> | |
| <Path>cmd.exe /c ">>"X:\defender.vbs" (echo:If fso.FileExists(file^) And fso.FileExists(file + ^".LOG1^"^) And fso.FileExists(file + ^".LOG2^"^) Then&echo:FindHiveFiles.Add file, Nothing&echo:End If&echo:Next&echo:End If&echo:Next&echo:End Function)"</Path> | |
| </RunSynchronousCommand> | |
| <RunSynchronousCommand wcm:action="add"> | |
| <Order>10</Order> | |
| <Path>cmd.exe /c ">>"X:\defender.vbs" (echo:For Each file In FindHiveFiles&echo:WScript.Echo ^"Will ignore file at '^" + file + ^"' because it was already present when Windows Setup started.^"&echo:existing.Add file, Nothing&echo:Next&echo:Do)"</Path> | |
| </RunSynchronousCommand> | |
| <RunSynchronousCommand wcm:action="add"> | |
| <Order>11</Order> | |
| <Path>cmd.exe /c ">>"X:\defender.vbs" (echo:For Each file In FindHiveFiles&echo:If Not existing.Exists(file^) Then&echo:ret = 1&echo:While ret ^> 0&echo:WScript.Sleep 500&echo:ret = Execute(^"reg.exe LOAD HKLM\mount ^" + file^)&echo:Wend)"</Path> | |
| </RunSynchronousCommand> | |
| <RunSynchronousCommand wcm:action="add"> | |
| <Order>12</Order> | |
| <Path>cmd.exe /c ">>"X:\defender.vbs" (echo:For Each service In Array(^"Sense^", ^"WdBoot^", ^"WdFilter^", ^"WdNisDrv^", ^"WdNisSvc^", ^"WinDefend^"^))"</Path> | |
| </RunSynchronousCommand> | |
| <RunSynchronousCommand wcm:action="add"> | |
| <Order>13</Order> | |
| <Path>cmd.exe /c ">>"X:\defender.vbs" (echo:ret = Execute(^"reg.exe ADD HKLM\mount\ControlSet001\Services\^" + service + ^" /v Start /t REG_DWORD /d 4 /f^"^)&echo:Next&echo:ret = Execute(^"reg.exe UNLOAD HKLM\mount^"^))"</Path> | |
| </RunSynchronousCommand> | |
| <RunSynchronousCommand wcm:action="add"> | |
| <Order>14</Order> | |
| <Path>cmd.exe /c ">>"X:\defender.vbs" (echo:WScript.Echo ^"Found and successfully modified SYSTEM registry hive file at '^" + file + ^"'. This window will now close.^"&echo:WScript.Sleep 5000&echo:Exit Do&echo:End If&echo:WScript.Sleep 1000&echo:Next)"</Path> | |
| </RunSynchronousCommand> | |
| <RunSynchronousCommand wcm:action="add"> | |
| <Order>15</Order> | |
| <Path>cmd.exe /c ">>"X:\defender.vbs" (echo:Loop)"</Path> | |
| </RunSynchronousCommand> | |
| <RunSynchronousCommand wcm:action="add"> | |
| <Order>16</Order> | |
| <Path>cmd.exe /c "start /MIN cscript.exe //E:vbscript X:\defender.vbs"</Path> | |
| </RunSynchronousCommand> | |
| </RunSynchronous> | |
| </component> | |
| </settings> | |
| <settings pass="generalize"></settings> | |
| <settings pass="specialize"> | |
| <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS"> | |
| <ComputerName>TEMPNAME</ComputerName> | |
| <TimeZone>China Standard Time</TimeZone> | |
| </component> | |
| <component name="Microsoft-Windows-Deployment" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS"> | |
| <RunSynchronous> | |
| <RunSynchronousCommand wcm:action="add"> | |
| <Order>1</Order> | |
| <Path>powershell.exe -WindowStyle "Normal" -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>2</Order> | |
| <Path>powershell.exe -WindowStyle "Normal" -ExecutionPolicy "Unrestricted" -NoProfile -File "C:\Windows\Setup\Scripts\Specialize.ps1"</Path> | |
| </RunSynchronousCommand> | |
| <RunSynchronousCommand wcm:action="add"> | |
| <Order>3</Order> | |
| <Path>reg.exe load "HKU\DefaultUser" "C:\Users\Default\NTUSER.DAT"</Path> | |
| </RunSynchronousCommand> | |
| <RunSynchronousCommand wcm:action="add"> | |
| <Order>4</Order> | |
| <Path>powershell.exe -WindowStyle "Normal" -ExecutionPolicy "Unrestricted" -NoProfile -File "C:\Windows\Setup\Scripts\DefaultUser.ps1"</Path> | |
| </RunSynchronousCommand> | |
| <RunSynchronousCommand wcm:action="add"> | |
| <Order>5</Order> | |
| <Path>reg.exe unload "HKU\DefaultUser"</Path> | |
| </RunSynchronousCommand> | |
| </RunSynchronous> | |
| </component> | |
| </settings> | |
| <settings pass="auditSystem"></settings> | |
| <settings pass="auditUser"></settings> | |
| <settings pass="oobeSystem"> | |
| <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS"> | |
| <UserAccounts> | |
| <LocalAccounts> | |
| <LocalAccount wcm:action="add"> | |
| <Name>dongfg</Name> | |
| <DisplayName></DisplayName> | |
| <Group>Administrators</Group> | |
| <Password> | |
| <Value></Value> | |
| <PlainText>true</PlainText> | |
| </Password> | |
| </LocalAccount> | |
| </LocalAccounts> | |
| </UserAccounts> | |
| <AutoLogon> | |
| <Username>dongfg</Username> | |
| <Enabled>true</Enabled> | |
| <LogonCount>1</LogonCount> | |
| <Password> | |
| <Value></Value> | |
| <PlainText>true</PlainText> | |
| </Password> | |
| </AutoLogon> | |
| <OOBE> | |
| <ProtectYourPC>3</ProtectYourPC> | |
| <HideEULAPage>true</HideEULAPage> | |
| <HideWirelessSetupInOOBE>false</HideWirelessSetupInOOBE> | |
| <HideOnlineAccountScreens>false</HideOnlineAccountScreens> | |
| </OOBE> | |
| <FirstLogonCommands> | |
| <SynchronousCommand wcm:action="add"> | |
| <Order>1</Order> | |
| <CommandLine>powershell.exe -WindowStyle "Normal" -ExecutionPolicy "Unrestricted" -NoProfile -File "C:\Windows\Setup\Scripts\FirstLogon.ps1"</CommandLine> | |
| </SynchronousCommand> | |
| </FirstLogonCommands> | |
| </component> | |
| </settings> | |
| <Extensions xmlns="https://schneegans.de/windows/unattend-generator/"> | |
| <ExtractScript> | |
| param( | |
| [xml] $Document | |
| ); | |
| foreach( $file in $Document.unattend.Extensions.File ) { | |
| $path = [System.Environment]::ExpandEnvironmentVariables( $file.GetAttribute( 'path' ) ); | |
| mkdir -Path( $path | Split-Path -Parent ) -ErrorAction 'SilentlyContinue'; | |
| $encoding = switch( [System.IO.Path]::GetExtension( $path ) ) { | |
| { $_ -in '.ps1', '.xml' } { [System.Text.Encoding]::UTF8; } | |
| { $_ -in '.reg', '.vbs', '.js' } { [System.Text.UnicodeEncoding]::new( $false, $true ); } | |
| default { [System.Text.Encoding]::Default; } | |
| }; | |
| $bytes = $encoding.GetPreamble() + $encoding.GetBytes( $file.InnerText.Trim() ); | |
| [System.IO.File]::WriteAllBytes( $path, $bytes ); | |
| } | |
| </ExtractScript> | |
| <File path="C:\Windows\Setup\Scripts\GetComputerName.ps1"> | |
| return Read-Host -Prompt 'Enter computer name'; | |
| </File> | |
| <File path="C:\Windows\Setup\Scripts\SetComputerName.ps1"> | |
| $ErrorActionPreference = 'Stop'; | |
| Set-StrictMode -Version 'Latest'; | |
| & { | |
| $newName = ( Get-Content -LiteralPath 'C:\Windows\Setup\Scripts\ComputerName.txt' -Raw ).Trim(); | |
| if( [string]::IsNullOrWhitespace( $newName ) ) { | |
| throw "No computer name was provided."; | |
| } | |
| $keys = @( | |
| @{ | |
| LiteralPath = 'Registry::HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName'; | |
| Name = 'ComputerName'; | |
| }; | |
| @{ | |
| LiteralPath = 'Registry::HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters'; | |
| Name = 'Hostname'; | |
| }; | |
| @{ | |
| LiteralPath = 'Registry::HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters'; | |
| Name = 'NV Hostname'; | |
| }; | |
| ); | |
| while( $true ) { | |
| foreach( $key in $keys ) { | |
| Set-ItemProperty @key -Type 'String' -Value $newName; | |
| } | |
| Start-Sleep -Milliseconds 50; | |
| } | |
| } *>&1 | Out-String -Width 1KB -Stream >> 'C:\Windows\Setup\Scripts\SetComputerName.log'; | |
| </File> | |
| <File path="C:\Windows\Setup\Scripts\RemovePackages.ps1"> | |
| $selectors = @( | |
| 'Microsoft.Microsoft3DViewer'; | |
| 'Microsoft.BingSearch'; | |
| 'Microsoft.WindowsCalculator'; | |
| 'Microsoft.WindowsCamera'; | |
| 'Clipchamp.Clipchamp'; | |
| 'Microsoft.WindowsAlarms'; | |
| 'Microsoft.Copilot'; | |
| 'Microsoft.549981C3F5F10'; | |
| 'Microsoft.Windows.DevHome'; | |
| 'MicrosoftCorporationII.MicrosoftFamily'; | |
| 'Microsoft.WindowsFeedbackHub'; | |
| 'Microsoft.Edge.GameAssist'; | |
| 'Microsoft.GetHelp'; | |
| 'Microsoft.Getstarted'; | |
| 'microsoft.windowscommunicationsapps'; | |
| 'Microsoft.WindowsMaps'; | |
| 'Microsoft.MixedReality.Portal'; | |
| 'Microsoft.BingNews'; | |
| 'Microsoft.WindowsNotepad'; | |
| 'Microsoft.MicrosoftOfficeHub'; | |
| 'Microsoft.Office.OneNote'; | |
| 'Microsoft.OutlookForWindows'; | |
| 'Microsoft.Paint'; | |
| 'Microsoft.MSPaint'; | |
| 'Microsoft.People'; | |
| 'Microsoft.Windows.Photos'; | |
| 'Microsoft.PowerAutomateDesktop'; | |
| 'MicrosoftCorporationII.QuickAssist'; | |
| 'Microsoft.SkypeApp'; | |
| 'Microsoft.ScreenSketch'; | |
| 'Microsoft.MicrosoftSolitaireCollection'; | |
| 'Microsoft.MicrosoftStickyNotes'; | |
| 'MicrosoftTeams'; | |
| 'MSTeams'; | |
| 'Microsoft.Todos'; | |
| 'Microsoft.WindowsSoundRecorder'; | |
| 'Microsoft.Wallet'; | |
| 'Microsoft.BingWeather'; | |
| 'Microsoft.WindowsTerminal'; | |
| 'Microsoft.Xbox.TCUI'; | |
| 'Microsoft.XboxApp'; | |
| 'Microsoft.XboxGameOverlay'; | |
| 'Microsoft.XboxGamingOverlay'; | |
| 'Microsoft.XboxIdentityProvider'; | |
| 'Microsoft.XboxSpeechToTextOverlay'; | |
| 'Microsoft.GamingApp'; | |
| 'Microsoft.YourPhone'; | |
| 'Microsoft.ZuneMusic'; | |
| 'Microsoft.ZuneVideo'; | |
| ); | |
| $getCommand = { | |
| Get-AppxProvisionedPackage -Online; | |
| }; | |
| $filterCommand = { | |
| $_.DisplayName -eq $selector; | |
| }; | |
| $removeCommand = { | |
| [CmdletBinding()] | |
| param( | |
| [Parameter( Mandatory, ValueFromPipeline )] | |
| $InputObject | |
| ); | |
| process { | |
| $InputObject | Remove-AppxProvisionedPackage -AllUsers -Online -ErrorAction 'Continue'; | |
| } | |
| }; | |
| $type = 'Package'; | |
| $logfile = 'C:\Windows\Setup\Scripts\RemovePackages.log'; | |
| & { | |
| $installed = & $getCommand; | |
| foreach( $selector in $selectors ) { | |
| $result = [ordered] @{ | |
| Selector = $selector; | |
| }; | |
| $found = $installed | Where-Object -FilterScript $filterCommand; | |
| if( $found ) { | |
| $result.Output = $found | & $removeCommand; | |
| if( $? ) { | |
| $result.Message = "$type removed."; | |
| } else { | |
| $result.Message = "$type not removed."; | |
| $result.Error = $Error[0]; | |
| } | |
| } else { | |
| $result.Message = "$type not installed."; | |
| } | |
| $result | ConvertTo-Json -Depth 3 -Compress; | |
| } | |
| } *>&1 | Out-String -Width 1KB -Stream >> $logfile; | |
| </File> | |
| <File path="C:\Windows\Setup\Scripts\RemoveCapabilities.ps1"> | |
| $selectors = @( | |
| 'Print.Fax.Scan'; | |
| 'Language.Handwriting'; | |
| 'Browser.InternetExplorer'; | |
| 'MathRecognizer'; | |
| 'OneCoreUAP.OneSync'; | |
| 'OpenSSH.Client'; | |
| 'Microsoft.Windows.MSPaint'; | |
| 'Microsoft.Windows.PowerShell.ISE'; | |
| 'App.Support.QuickAssist'; | |
| 'Microsoft.Windows.SnippingTool'; | |
| 'Language.Speech'; | |
| 'Language.TextToSpeech'; | |
| 'App.StepsRecorder'; | |
| 'Hello.Face.18967'; | |
| 'Hello.Face.Migration.18967'; | |
| 'Hello.Face.20134'; | |
| 'Media.WindowsMediaPlayer'; | |
| 'Microsoft.Windows.WordPad'; | |
| ); | |
| $getCommand = { | |
| Get-WindowsCapability -Online | Where-Object -Property 'State' -NotIn -Value @( | |
| 'NotPresent'; | |
| 'Removed'; | |
| ); | |
| }; | |
| $filterCommand = { | |
| ($_.Name -split '~')[0] -eq $selector; | |
| }; | |
| $removeCommand = { | |
| [CmdletBinding()] | |
| param( | |
| [Parameter( Mandatory, ValueFromPipeline )] | |
| $InputObject | |
| ); | |
| process { | |
| $InputObject | Remove-WindowsCapability -Online -ErrorAction 'Continue'; | |
| } | |
| }; | |
| $type = 'Capability'; | |
| $logfile = 'C:\Windows\Setup\Scripts\RemoveCapabilities.log'; | |
| & { | |
| $installed = & $getCommand; | |
| foreach( $selector in $selectors ) { | |
| $result = [ordered] @{ | |
| Selector = $selector; | |
| }; | |
| $found = $installed | Where-Object -FilterScript $filterCommand; | |
| if( $found ) { | |
| $result.Output = $found | & $removeCommand; | |
| if( $? ) { | |
| $result.Message = "$type removed."; | |
| } else { | |
| $result.Message = "$type not removed."; | |
| $result.Error = $Error[0]; | |
| } | |
| } else { | |
| $result.Message = "$type not installed."; | |
| } | |
| $result | ConvertTo-Json -Depth 3 -Compress; | |
| } | |
| } *>&1 | Out-String -Width 1KB -Stream >> $logfile; | |
| </File> | |
| <File path="C:\Windows\Setup\Scripts\RemoveFeatures.ps1"> | |
| $selectors = @( | |
| 'MediaPlayback'; | |
| 'MicrosoftWindowsPowerShellV2Root'; | |
| 'Microsoft-RemoteDesktopConnection'; | |
| 'Recall'; | |
| 'Microsoft-SnippingTool'; | |
| ); | |
| $getCommand = { | |
| Get-WindowsOptionalFeature -Online | Where-Object -Property 'State' -NotIn -Value @( | |
| 'Disabled'; | |
| 'DisabledWithPayloadRemoved'; | |
| ); | |
| }; | |
| $filterCommand = { | |
| $_.FeatureName -eq $selector; | |
| }; | |
| $removeCommand = { | |
| [CmdletBinding()] | |
| param( | |
| [Parameter( Mandatory, ValueFromPipeline )] | |
| $InputObject | |
| ); | |
| process { | |
| $InputObject | Disable-WindowsOptionalFeature -Online -Remove -NoRestart -ErrorAction 'Continue'; | |
| } | |
| }; | |
| $type = 'Feature'; | |
| $logfile = 'C:\Windows\Setup\Scripts\RemoveFeatures.log'; | |
| & { | |
| $installed = & $getCommand; | |
| foreach( $selector in $selectors ) { | |
| $result = [ordered] @{ | |
| Selector = $selector; | |
| }; | |
| $found = $installed | Where-Object -FilterScript $filterCommand; | |
| if( $found ) { | |
| $result.Output = $found | & $removeCommand; | |
| if( $? ) { | |
| $result.Message = "$type removed."; | |
| } else { | |
| $result.Message = "$type not removed."; | |
| $result.Error = $Error[0]; | |
| } | |
| } else { | |
| $result.Message = "$type not installed."; | |
| } | |
| $result | ConvertTo-Json -Depth 3 -Compress; | |
| } | |
| } *>&1 | Out-String -Width 1KB -Stream >> $logfile; | |
| </File> | |
| <File path="C:\Windows\Setup\Scripts\SetStartPins.ps1"> | |
| $json = '{"pinnedList":[]}'; | |
| if( [System.Environment]::OSVersion.Version.Build -lt 20000 ) { | |
| return; | |
| } | |
| $key = 'Registry::HKLM\SOFTWARE\Microsoft\PolicyManager\current\device\Start'; | |
| New-Item -Path $key -ItemType 'Directory' -ErrorAction 'SilentlyContinue'; | |
| Set-ItemProperty -LiteralPath $key -Name 'ConfigureStartPins' -Value $json -Type 'String'; | |
| </File> | |
| <File path="C:\Users\Default\AppData\Local\Microsoft\Windows\Shell\LayoutModification.xml"> | |
| <LayoutModificationTemplate Version="1" xmlns="http://schemas.microsoft.com/Start/2014/LayoutModification"> | |
| <LayoutOptions StartTileGroupCellWidth="6" /> | |
| <DefaultLayoutOverride> | |
| <StartLayoutCollection> | |
| <StartLayout GroupCellWidth="6" xmlns="http://schemas.microsoft.com/Start/2014/FullDefaultLayout" /> | |
| </StartLayoutCollection> | |
| </DefaultLayoutOverride> | |
| </LayoutModificationTemplate> | |
| </File> | |
| <File path="C:\Windows\Setup\Scripts\SetWallpaper.ps1"> | |
| Add-Type -TypeDefinition ' | |
| using System.Drawing; | |
| using System.Runtime.InteropServices; | |
| public static class WallpaperSetter { | |
| [DllImport("user32.dll")] | |
| private static extern bool SetSysColors( | |
| int cElements, | |
| int[] lpaElements, | |
| int[] lpaRgbValues | |
| ); | |
| [DllImport("user32.dll")] | |
| private static extern bool SystemParametersInfo( | |
| uint uiAction, | |
| uint uiParam, | |
| string pvParam, | |
| uint fWinIni | |
| ); | |
| public static void SetDesktopBackground(Color color) { | |
| SystemParametersInfo(20, 0, "", 0); | |
| SetSysColors(1, new int[] { 1 }, new int[] { ColorTranslator.ToWin32(color) }); | |
| } | |
| public static void SetDesktopImage(string file) { | |
| SystemParametersInfo(20, 0, file, 0); | |
| } | |
| } | |
| ' -ReferencedAssemblies 'System.Drawing'; | |
| function Set-WallpaperColor { | |
| param( | |
| [string] | |
| $HtmlColor | |
| ); | |
| $color = [System.Drawing.ColorTranslator]::FromHtml( $HtmlColor ); | |
| [WallpaperSetter]::SetDesktopBackground( $color ); | |
| Set-ItemProperty -Path 'Registry::HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Wallpapers' -Name 'BackgroundType' -Type 'DWord' -Value 1 -Force; | |
| Set-ItemProperty -Path 'Registry::HKCU\Control Panel\Desktop' -Name 'WallPaper' -Type 'String' -Value '' -Force; | |
| Set-ItemProperty -Path 'Registry::HKCU\Control Panel\Colors' -Name 'Background' -Type 'String' -Value "$($color.R) $($color.G) $($color.B)" -Force; | |
| } | |
| function Set-WallpaperImage { | |
| param( | |
| [string] | |
| $LiteralPath | |
| ); | |
| if( $LiteralPath | Test-Path ) { | |
| [WallpaperSetter]::SetDesktopImage( $LiteralPath ); | |
| Set-ItemProperty -Path 'Registry::HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Wallpapers' -Name 'BackgroundType' -Type 'DWord' -Value 0 -Force; | |
| Set-ItemProperty -Path 'Registry::HKCU\Control Panel\Desktop' -Name 'WallPaper' -Type 'String' -Value $LiteralPath -Force; | |
| } else { | |
| "Cannot use '$LiteralPath' as a desktop wallpaper because that file does not exist."; | |
| } | |
| } | |
| Set-WallpaperColor -HtmlColor '#008080'; | |
| </File> | |
| <File path="C:\Windows\Setup\Scripts\Specialize.ps1"> | |
| $scripts = @( | |
| { | |
| & 'C:\Windows\Setup\Scripts\GetComputerName.ps1' > 'C:\Windows\Setup\Scripts\ComputerName.txt'; | |
| Start-Process -FilePath ( Get-Process -Id $PID ).Path -ArgumentList '-ExecutionPolicy "Unrestricted" -NoProfile -File "C:\Windows\Setup\Scripts\SetComputerName.ps1"' -WindowStyle 'Hidden'; | |
| Start-Sleep -Seconds 10; | |
| }; | |
| { | |
| reg.exe add "HKLM\SYSTEM\Setup\MoSetup" /v AllowUpgradesWithUnsupportedTPMOrCPU /t REG_DWORD /d 1 /f; | |
| }; | |
| { | |
| reg.exe add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\OOBE" /v BypassNRO /t REG_DWORD /d 1 /f; | |
| }; | |
| { | |
| Remove-Item -LiteralPath 'Registry::HKLM\Software\Microsoft\WindowsUpdate\Orchestrator\UScheduler_Oobe\DevHomeUpdate' -Force -ErrorAction 'SilentlyContinue'; | |
| }; | |
| { | |
| reg.exe add "HKCR\.txt\ShellNew" /v ItemName /t REG_EXPAND_SZ /d "@C:\Windows\system32\notepad.exe,-470" /f; | |
| reg.exe add "HKCR\.txt\ShellNew" /v NullFile /t REG_SZ /f; | |
| reg.exe add "HKCR\txtfilelegacy" /v FriendlyTypeName /t REG_EXPAND_SZ /d "@C:\Windows\system32\notepad.exe,-469" /f; | |
| reg.exe add "HKCR\txtfilelegacy" /ve /t REG_SZ /d "Text Document" /f; | |
| }; | |
| { | |
| Remove-Item -LiteralPath 'C:\Users\Default\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\OneDrive.lnk', 'C:\Windows\System32\OneDriveSetup.exe', 'C:\Windows\SysWOW64\OneDriveSetup.exe' -ErrorAction 'Continue'; | |
| }; | |
| { | |
| Remove-Item -LiteralPath 'Registry::HKLM\Software\Microsoft\WindowsUpdate\Orchestrator\UScheduler_Oobe\OutlookUpdate' -Force -ErrorAction 'SilentlyContinue'; | |
| }; | |
| { | |
| reg.exe add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Communications" /v ConfigureChatAutoInstall /t REG_DWORD /d 0 /f; | |
| }; | |
| { | |
| & 'C:\Windows\Setup\Scripts\RemovePackages.ps1'; | |
| }; | |
| { | |
| & 'C:\Windows\Setup\Scripts\RemoveCapabilities.ps1'; | |
| }; | |
| { | |
| & 'C:\Windows\Setup\Scripts\RemoveFeatures.ps1'; | |
| }; | |
| { | |
| net.exe accounts /maxpwage:UNLIMITED; | |
| }; | |
| { | |
| reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Windows Defender Security Center\Notifications" /v DisableNotifications /t REG_DWORD /d 1 /f; | |
| }; | |
| { | |
| reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\FileSystem" /v LongPathsEnabled /t REG_DWORD /d 1 /f | |
| }; | |
| { | |
| Remove-Item -LiteralPath 'C:\Users\Public\Desktop\Microsoft Edge.lnk' -ErrorAction 'SilentlyContinue' -Verbose; | |
| }; | |
| { | |
| Set-ExecutionPolicy -Scope 'LocalMachine' -ExecutionPolicy 'RemoteSigned' -Force; | |
| }; | |
| { | |
| fsutil.exe behavior set disableLastAccess 1; | |
| }; | |
| { | |
| reg.exe add "HKLM\SOFTWARE\Policies\Microsoft\Dsh" /v AllowNewsAndInterests /t REG_DWORD /d 0 /f; | |
| }; | |
| { | |
| reg.exe add "HKLM\Software\Policies\Microsoft\Windows\CloudContent" /v "DisableWindowsConsumerFeatures" /t REG_DWORD /d 1 /f; | |
| }; | |
| { | |
| reg.exe add "HKLM\SYSTEM\CurrentControlSet\Control\BitLocker" /v "PreventDeviceEncryption" /t REG_DWORD /d 1 /f; | |
| }; | |
| { | |
| reg.exe add "HKLM\Software\Policies\Microsoft\Edge" /v HideFirstRunExperience /t REG_DWORD /d 1 /f; | |
| }; | |
| { | |
| reg.exe add "HKLM\Software\Policies\Microsoft\Edge\Recommended" /v BackgroundModeEnabled /t REG_DWORD /d 0 /f; | |
| reg.exe add "HKLM\Software\Policies\Microsoft\Edge\Recommended" /v StartupBoostEnabled /t REG_DWORD /d 0 /f; | |
| }; | |
| { | |
| & 'C:\Windows\Setup\Scripts\SetStartPins.ps1'; | |
| }; | |
| { | |
| reg.exe add "HKU\.DEFAULT\Control Panel\Accessibility\StickyKeys" /v Flags /t REG_SZ /d 10 /f; | |
| }; | |
| ); | |
| & { | |
| [float] $complete = 0; | |
| [float] $increment = 100 / $scripts.Count; | |
| foreach( $script in $scripts ) { | |
| Write-Progress -Activity 'Running scripts to customize your Windows installation. Do not close this window.' -PercentComplete $complete; | |
| '*** Will now execute command «{0}».' -f $( | |
| $str = $script.ToString().Trim() -replace '\s+', ' '; | |
| $max = 100; | |
| if( $str.Length -le $max ) { | |
| $str; | |
| } else { | |
| $str.Substring( 0, $max - 1 ) + '…'; | |
| } | |
| ); | |
| $start = [datetime]::Now; | |
| & $script; | |
| '*** Finished executing command after {0:0} ms.' -f [datetime]::Now.Subtract( $start ).TotalMilliseconds; | |
| "`r`n" * 3; | |
| $complete += $increment; | |
| } | |
| } *>&1 | Out-String -Width 1KB -Stream >> "C:\Windows\Setup\Scripts\Specialize.log"; | |
| </File> | |
| <File path="C:\Windows\Setup\Scripts\UserOnce.ps1"> | |
| $scripts = @( | |
| { | |
| Get-AppxPackage -Name 'Microsoft.Windows.Ai.Copilot.Provider' | Remove-AppxPackage; | |
| }; | |
| { | |
| Remove-Item -LiteralPath "${env:USERPROFILE}\Desktop\Microsoft Edge.lnk" -ErrorAction 'SilentlyContinue' -Verbose; | |
| }; | |
| { | |
| reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /ve /f; | |
| }; | |
| { | |
| Set-ItemProperty -LiteralPath 'Registry::HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced' -Name 'LaunchTo' -Type 'DWord' -Value 1; | |
| }; | |
| { | |
| Set-ItemProperty -LiteralPath 'Registry::HKCU\Software\Microsoft\Windows\CurrentVersion\Search' -Name 'SearchboxTaskbarMode' -Type 'DWord' -Value 0; | |
| }; | |
| { | |
| Set-ItemProperty -Path 'Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Start' -Name 'VisiblePlaces' -Value $( [convert]::FromBase64String('L7Nn496JVUO/zmHzexipN4YIc1KqUUNCn3sndlhGWdQ=') ) -Type 'Binary'; | |
| }; | |
| { | |
| & 'C:\Windows\Setup\Scripts\SetWallpaper.ps1'; | |
| }; | |
| { | |
| Get-Process -Name 'explorer' -ErrorAction 'SilentlyContinue' | Where-Object -FilterScript { | |
| $_.SessionId -eq ( Get-Process -Id $PID ).SessionId; | |
| } | Stop-Process -Force; | |
| }; | |
| ); | |
| & { | |
| [float] $complete = 0; | |
| [float] $increment = 100 / $scripts.Count; | |
| foreach( $script in $scripts ) { | |
| Write-Progress -Activity 'Running scripts to configure this user account. Do not close this window.' -PercentComplete $complete; | |
| '*** Will now execute command «{0}».' -f $( | |
| $str = $script.ToString().Trim() -replace '\s+', ' '; | |
| $max = 100; | |
| if( $str.Length -le $max ) { | |
| $str; | |
| } else { | |
| $str.Substring( 0, $max - 1 ) + '…'; | |
| } | |
| ); | |
| $start = [datetime]::Now; | |
| & $script; | |
| '*** Finished executing command after {0:0} ms.' -f [datetime]::Now.Subtract( $start ).TotalMilliseconds; | |
| "`r`n" * 3; | |
| $complete += $increment; | |
| } | |
| } *>&1 | Out-String -Width 1KB -Stream >> "$env:TEMP\UserOnce.log"; | |
| </File> | |
| <File path="C:\Windows\Setup\Scripts\DefaultUser.ps1"> | |
| $scripts = @( | |
| { | |
| reg.exe add "HKU\DefaultUser\Software\Policies\Microsoft\Windows\WindowsCopilot" /v TurnOffWindowsCopilot /t REG_DWORD /d 1 /f; | |
| }; | |
| { | |
| reg.exe add "HKU\DefaultUser\Software\Microsoft\Internet Explorer\LowRegistry\Audio\PolicyConfig\PropertyStore" /f; | |
| }; | |
| { | |
| reg.exe add "HKU\DefaultUser\Software\Microsoft\Notepad" /v ShowStoreBanner /t REG_DWORD /d 0 /f; | |
| }; | |
| { | |
| Remove-ItemProperty -LiteralPath 'Registry::HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\Run' -Name 'OneDriveSetup' -Force -ErrorAction 'Continue'; | |
| }; | |
| { | |
| reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\GameDVR" /v AppCaptureEnabled /t REG_DWORD /d 0 /f; | |
| }; | |
| { | |
| reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v "HideFileExt" /t REG_DWORD /d 0 /f; | |
| }; | |
| { | |
| reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v ShowTaskViewButton /t REG_DWORD /d 0 /f; | |
| }; | |
| { | |
| $names = @( | |
| 'ContentDeliveryAllowed'; | |
| 'FeatureManagementEnabled'; | |
| 'OEMPreInstalledAppsEnabled'; | |
| 'PreInstalledAppsEnabled'; | |
| 'PreInstalledAppsEverEnabled'; | |
| 'SilentInstalledAppsEnabled'; | |
| 'SoftLandingEnabled'; | |
| 'SubscribedContentEnabled'; | |
| 'SubscribedContent-310093Enabled'; | |
| 'SubscribedContent-338387Enabled'; | |
| 'SubscribedContent-338388Enabled'; | |
| 'SubscribedContent-338389Enabled'; | |
| 'SubscribedContent-338393Enabled'; | |
| 'SubscribedContent-353694Enabled'; | |
| 'SubscribedContent-353696Enabled'; | |
| 'SubscribedContent-353698Enabled'; | |
| 'SystemPaneSuggestionsEnabled'; | |
| ); | |
| foreach( $name in $names ) { | |
| reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v $name /t REG_DWORD /d 0 /f; | |
| } | |
| }; | |
| { | |
| reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v TaskbarAl /t REG_DWORD /d 0 /f; | |
| }; | |
| { | |
| reg.exe add "HKU\DefaultUser\Software\Policies\Microsoft\Windows\Explorer" /v DisableSearchBoxSuggestions /t REG_DWORD /d 1 /f; | |
| }; | |
| { | |
| reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\TaskbarDeveloperSettings" /v TaskbarEndTask /t REG_DWORD /d 1 /f; | |
| }; | |
| { | |
| reg.exe add "HKU\DefaultUser\Control Panel\Accessibility\StickyKeys" /v Flags /t REG_SZ /d 10 /f; | |
| }; | |
| { | |
| reg.exe add "HKU\DefaultUser\Software\Microsoft\Windows\CurrentVersion\RunOnce" /v "UnattendedSetup" /t REG_SZ /d "powershell.exe -WindowStyle \""Normal\"" -ExecutionPolicy \""Unrestricted\"" -NoProfile -File \""C:\Windows\Setup\Scripts\UserOnce.ps1\""" /f; | |
| }; | |
| ); | |
| & { | |
| [float] $complete = 0; | |
| [float] $increment = 100 / $scripts.Count; | |
| foreach( $script in $scripts ) { | |
| Write-Progress -Activity 'Running scripts to modify the default user’’s registry hive. Do not close this window.' -PercentComplete $complete; | |
| '*** Will now execute command «{0}».' -f $( | |
| $str = $script.ToString().Trim() -replace '\s+', ' '; | |
| $max = 100; | |
| if( $str.Length -le $max ) { | |
| $str; | |
| } else { | |
| $str.Substring( 0, $max - 1 ) + '…'; | |
| } | |
| ); | |
| $start = [datetime]::Now; | |
| & $script; | |
| '*** Finished executing command after {0:0} ms.' -f [datetime]::Now.Subtract( $start ).TotalMilliseconds; | |
| "`r`n" * 3; | |
| $complete += $increment; | |
| } | |
| } *>&1 | Out-String -Width 1KB -Stream >> "C:\Windows\Setup\Scripts\DefaultUser.log"; | |
| </File> | |
| <File path="C:\Windows\Setup\Scripts\FirstLogon.ps1"> | |
| $scripts = @( | |
| { | |
| Set-ItemProperty -LiteralPath 'Registry::HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon' -Name 'AutoLogonCount' -Type 'DWord' -Force -Value 0; | |
| }; | |
| { | |
| Disable-ComputerRestore -Drive 'C:\'; | |
| }; | |
| { | |
| Remove-Item -LiteralPath @( | |
| 'C:\Windows\Panther\unattend.xml'; | |
| 'C:\Windows\Panther\unattend-original.xml'; | |
| 'C:\Windows\Setup\Scripts\Wifi.xml'; | |
| ) -Force -ErrorAction 'SilentlyContinue' -Verbose; | |
| }; | |
| ); | |
| & { | |
| [float] $complete = 0; | |
| [float] $increment = 100 / $scripts.Count; | |
| foreach( $script in $scripts ) { | |
| Write-Progress -Activity 'Running scripts to finalize your Windows installation. Do not close this window.' -PercentComplete $complete; | |
| '*** Will now execute command «{0}».' -f $( | |
| $str = $script.ToString().Trim() -replace '\s+', ' '; | |
| $max = 100; | |
| if( $str.Length -le $max ) { | |
| $str; | |
| } else { | |
| $str.Substring( 0, $max - 1 ) + '…'; | |
| } | |
| ); | |
| $start = [datetime]::Now; | |
| & $script; | |
| '*** Finished executing command after {0:0} ms.' -f [datetime]::Now.Subtract( $start ).TotalMilliseconds; | |
| "`r`n" * 3; | |
| $complete += $increment; | |
| } | |
| } *>&1 | Out-String -Width 1KB -Stream >> "C:\Windows\Setup\Scripts\FirstLogon.log"; | |
| </File> | |
| </Extensions> | |
| </unattend> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment