diff --git a/scripts/Windows/OS/InitialBoot.ps1 b/scripts/Windows/OS/InitialBoot.ps1 new file mode 100644 index 00000000..bd55d157 --- /dev/null +++ b/scripts/Windows/OS/InitialBoot.ps1 @@ -0,0 +1,16 @@ +[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; +Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')); + +Import-Module $env:ChocolateyInstall/helpers/chocolateyProfile.psm1; + +choco install -y git --params='/WindowsTerminalProfile /DefaultBranchName:main'; +choco install -y powershell-core --install-arguments='"ADD_FILE_CONTEXT_MENU_RUNPOWERSHELL=1 ADD_EXPLORER_CONTEXT_MENU_OPENPOWERSHELL=1 REGISTER_MANIFEST=1 USE_MU=1 ENABLE_MU=1"'; +refreshenv; + +if (-not $(Get-Command winget)) { + choco install -y winget; +} + +Set-Location C:/; +git clone https://git.nuth.ch/manuth/PortValhalla.git; +Set-Location PortValhalla; diff --git a/scripts/Windows/OS/Setup.ps1 b/scripts/Windows/OS/Setup.ps1 index f3a1bd68..b1d0dd44 100644 --- a/scripts/Windows/OS/Setup.ps1 +++ b/scripts/Windows/OS/Setup.ps1 @@ -10,7 +10,7 @@ $unattendedConfig.PreserveWhitespace = $true; $readerSettings = [System.Xml.XmlReaderSettings]::new(); $readerSettings.IgnoreComments = $true; -$reader = [System.Xml.XmlReader]::Create("$drive\Autounattend.template.xml", $readerSettings); +$reader = [System.Xml.XmlReader]::Create("$PSScriptRoot/../Resources/Autounattend.template.xml", $readerSettings); $unattendedConfig.Load($reader); $namespace = New-Object -TypeName "Xml.XmlNamespaceManager" -ArgumentList $unattendedConfig.NameTable; @@ -29,15 +29,27 @@ function Get-PassSettings { $specializeSettings = Get-PassSettings "specialize"; $specializeSettings.SelectSingleNode("./ua:component[@name='Microsoft-Windows-Shell-Setup']/ua:ComputerName", $namespace).InnerText = "$env:WIN_COMPUTER_NAME"; +# Execute corresponding installer script after startup $oobeSystemSettings = Get-PassSettings "oobeSystem"; -$oobeSystemSettings.SelectSingleNode("./ua:component/ua:FirstLogonCommands/ua:SynchronousCommand[last()]/ua:CommandLine", $namespace).InnerText += "; pwsh '$env:SETUP_SCRIPT_NAME';"; +$installationCommand = $oobeSystemSettings.SelectSingleNode("./ua:component/ua:FirstLogonCommands/ua:SynchronousCommand[last()]/ua:CommandLine", $namespace); +$newCommand = $installationCommand.CloneNode($true); + +$newCommand.SelectSingleNode("./ua:CommandLine", $namespace).InnerText = ` + "powershell -Command " + ` + $(Get-Content "$PSScriptRoot/InitialBoot.ps1") + ` + "; pwsh '$env:SETUP_SCRIPT_NAME';"; + +$order = [int]$newCommand.SelectSingleNode("./ua:Order", $namespace).InnerText; +$newCommand.SelectSingleNode("./ua:Order", $namespace).InnerText = $order++; +$newCommand.SelectSingleNode("./ua:Description", $namespace).InnerText = "Install PowerShell Core and git and run setup script"; +$installationCommand.ParentNode.AppendChild($newCommand); if ($Global:SetupConfigPostprocessor) { $Global:SetupConfigPostprocessor.Invoke($unattendedConfig, $namespace); } $unattendedConfig.PreserveWhitespace = $true; -$unattendedConfig.Save("$drive\Autounattend.xml"); +$unattendedConfig.Save("$drive/Autounattend.xml"); Write-Warning "Attention: This program will completely wipe your current disk #1 and install Windows on it. Are you sure you want to do this?" Read-Host -Prompt "Hit enter to continue or CTRL+C to abort" diff --git a/scripts/Windows/Resources/Autounattend.template.xml b/scripts/Windows/Resources/Autounattend.template.xml new file mode 100644 index 00000000..075f51e8 --- /dev/null +++ b/scripts/Windows/Resources/Autounattend.template.xml @@ -0,0 +1,223 @@ +<?xml version="1.0" encoding="utf-8"?> +<unattend xmlns="urn:schemas-microsoft-com:unattend"> + <settings pass="windowsPE"> + <component name="Microsoft-Windows-International-Core-WinPE" 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"> + <SetupUILanguage> + <UILanguage>en-US</UILanguage> + </SetupUILanguage> + <InputLocale>0807:00000807</InputLocale> + <SystemLocale>en-US</SystemLocale> + <UILanguage>en-US</UILanguage> + <UILanguageFallback>en-US</UILanguageFallback> + <UserLocale>en-US</UserLocale> + </component> + <component name="Microsoft-Windows-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"> + <DiskConfiguration> + <Disk wcm:action="add"> + <DiskID>0</DiskID> + <WillWipeDisk>true</WillWipeDisk> + <CreatePartitions> + <!-- Windows RE Tools partition --> + <CreatePartition wcm:action="add"> + <Order>1</Order> + <Type>Primary</Type> + <Size>300</Size> + </CreatePartition> + <!-- System partition (ESP) --> + <CreatePartition wcm:action="add"> + <Order>2</Order> + <Type>EFI</Type> + <Size>100</Size> + </CreatePartition> + <!-- Microsoft reserved partition (MSR) --> + <CreatePartition wcm:action="add"> + <Order>3</Order> + <Type>MSR</Type> + <Size>128</Size> + </CreatePartition> + <!-- Windows partition --> + <CreatePartition wcm:action="add"> + <Order>4</Order> + <Type>Primary</Type> + <Extend>true</Extend> + </CreatePartition> + </CreatePartitions> + <ModifyPartitions> + <!-- Windows RE Tools partition --> + <ModifyPartition wcm:action="add"> + <Order>1</Order> + <PartitionID>1</PartitionID> + <Label>WINRE</Label> + <Format>NTFS</Format> + <TypeID>de94bba4-06d1-4d40-a16a-bfd50179d6ac</TypeID> + </ModifyPartition> + <!-- System partition (ESP) --> + <ModifyPartition wcm:action="add"> + <Order>2</Order> + <PartitionID>2</PartitionID> + <Label>System</Label> + <Format>FAT32</Format> + </ModifyPartition> + <!-- MSR partition does not need to be modified --> + <ModifyPartition wcm:action="add"> + <Order>3</Order> + <PartitionID>3</PartitionID> + </ModifyPartition> + <!-- Windows partition --> + <ModifyPartition wcm:action="add"> + <Order>4</Order> + <PartitionID>4</PartitionID> + <Label>OS</Label> + <Letter>C</Letter> + <Format>NTFS</Format> + </ModifyPartition> + </ModifyPartitions> + </Disk> + <WillShowUI>OnError</WillShowUI> + </DiskConfiguration> + <ImageInstall> + <OSImage> + <InstallTo> + <DiskID>0</DiskID> + <PartitionID>4</PartitionID> + </InstallTo> + </OSImage> + </ImageInstall> + <UserData> + <ProductKey> + <Key>VK7JG-NPHTM-C97JM-9MPGT-3V66T</Key> + <WillShowUI>Never</WillShowUI> + </ProductKey> + <AcceptEula>true</AcceptEula> + <FullName>Admin</FullName> + <Organization></Organization> + </UserData> + </component> + </settings> + <settings pass="offlineServicing"> + <component name="Microsoft-Windows-LUA-Settings" 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"> + <EnableLUA>false</EnableLUA> + </component> + </settings> + <settings pass="generalize"> + <component name="Microsoft-Windows-Security-SPP" 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"> + <SkipRearm>1</SkipRearm> + </component> + </settings> + <settings pass="specialize"> + <component name="Microsoft-Windows-International-Core" 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"> + <InputLocale>0807:00000807</InputLocale> + <SystemLocale>de-CH</SystemLocale> + <UILanguage>en-US</UILanguage> + <UILanguageFallback>en-US</UILanguageFallback> + <UserLocale>de-CH</UserLocale> + </component> + <component name="Microsoft-Windows-Security-SPP-UX" 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"> + <SkipAutoActivation>true</SkipAutoActivation> + </component> + <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"> + <ComputerName></ComputerName> + <ProductKey>VK7JG-NPHTM-C97JM-9MPGT-3V66T</ProductKey> + </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"> + <AutoLogon> + <Password> + <Value></Value> + <PlainText>true</PlainText> + </Password> + <Enabled>true</Enabled> + <Username>Admin</Username> + </AutoLogon> + <OOBE> + <HideEULAPage>true</HideEULAPage> + <HideOEMRegistrationScreen>true</HideOEMRegistrationScreen> + <HideOnlineAccountScreens>true</HideOnlineAccountScreens> + <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE> + <NetworkLocation>Home</NetworkLocation> + <SkipUserOOBE>true</SkipUserOOBE> + <SkipMachineOOBE>true</SkipMachineOOBE> + <ProtectYourPC>1</ProtectYourPC> + </OOBE> + <UserAccounts> + <LocalAccounts> + <LocalAccount wcm:action="add"> + <Password> + <Value></Value> + <PlainText>true</PlainText> + </Password> + <Description></Description> + <DisplayName>Admin</DisplayName> + <Group>Administrators</Group> + <Name>Admin</Name> + </LocalAccount> + </LocalAccounts> + </UserAccounts> + <RegisteredOrganization></RegisteredOrganization> + <RegisteredOwner>Admin</RegisteredOwner> + <DisableAutoDaylightTimeSet>false</DisableAutoDaylightTimeSet> + <FirstLogonCommands> + <!-- <SynchronousCommand wcm:action="add"> + <Description>Control Panel View</Description> + <Order>1</Order> + <CommandLine>reg add + "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ControlPanel" + /v StartupPage /t REG_DWORD /d 1 /f</CommandLine> + <RequiresUserInput>true</RequiresUserInput> + </SynchronousCommand> --> + <!-- <SynchronousCommand wcm:action="add"> + <Order>2</Order> + <Description>Control Panel Icon Size</Description> + <RequiresUserInput>false</RequiresUserInput> + <CommandLine>reg add + "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ControlPanel" + /v AllItemsIconView /t REG_DWORD /d 0 /f</CommandLine> + </SynchronousCommand> --> + <SynchronousCommand wcm:action="add"> + <Order>1</Order> + <RequiresUserInput>true</RequiresUserInput> + <CommandLine>cmd /C wmic useraccount where name="Admin" set PasswordExpires=false</CommandLine> + <Description>Password Never Expires</Description> + </SynchronousCommand> + <SynchronousCommand wcm:action="add"> + <Order>2</Order> + <RequiresUserInput>false</RequiresUserInput> + <CommandLine>powershell -Command "Set-ExecutionPolicy -Force Bypass"</CommandLine> + <Description>Allow PowerShell scripts from anywhere.</Description> + </SynchronousCommand> + </FirstLogonCommands> + <TimeZone>W. Europe Standard Time</TimeZone> + </component> + </settings> +</unattend>