====== Introduction ====== Windows Preinstallation Environment (also known as Windows PE and WinPE) is a lightweight version of Windows used for the deployment of PCs, workstations, and servers, or troubleshooting an operating system while it is offline. It is intended to replace MS-DOS boot disks and can be booted via USB flash drive, PXE, iPXE, CD-ROM, or hard disk. Traditionally used by large corporations and OEMs (to preinstall Windows client operating systems on PCs during manufacturing), it is now widely available free of charge via the Windows Automated Installation Kit (WAIK). ====== Requirements ====== * DHCP and PXE server * The Windows Automated Installation Toolkit (WAIK) * A PC running Windows 7 SP1 * Windows Installations (DVD or ISO file) * Samba4 share ====== Deployment ====== ===== Windows Automated Installation Toolkit ===== In a technician machine (a regular Windows 7 PC) download and install the Windows Automated Installation Toolkit (WAIK). Download available from: * [[http://softlib.uclv.edu.cu/softlib/Software/Microsoft.Windows.Automated.Installation.Kit%20(AIK).for.Windows%207/KB3AIK_EN.iso]] ===== Create a WinPE ISO image ===== ==== Create a set of either 32-bit or 64-bit Windows PE files ==== * Click **Start**, and type deployment. Right-click Deployment and Imaging Tools Environment and then select **Run as administrator**. * In the Deployment Tools and Imaging Environment, copy the Windows PE files for the PCs you want to boot: For 64 bits: copype amd64 C:\winPE_amd64 For 32 bits: copype x86 C:\winPE_x86 **NOTE:** * The 64-bit version can boot 64-bit UEFI and 64-bit BIOS PCs. * The 32-bit version of Windows PE can boot 32-bit UEFI, 32-bit BIOS, and 64-bit BIOS PCs. **From now on we assume that will deploy 64-bit Windows PE files.** ==== Mount the WindowsPE image ==== Mount the WindowsPE image to perzonalize later Dism /Mount-Wim /WimFile:"C:\winPE_amd64\winpe.wim" /index:1 /MountDir:"C:\winPE_amd64\mount" ==== Add customatizations ==== == Add a startup script == Modify the Startnet.cmd script to include your customized commands (see the following example code). This file is located at C:\winPE_amd64\mount\Windows\System32\Startnet.cmd. @echo off echo Trying to load networks drivers... wpeinit ping 10.12.1.36 > NUL if errorlevel 1 goto finish if errorlevel 0 goto continue :continue echo Networks drivers loaded successfully echo Mounting network drive in Q: rem Mounting Samba share in q: net use q: \\10.12.1.36\isos echo Accessing the shared resource in Q: q: menu-os.cmd :finish echo Fail to load network driver!! echo You must to load it manually using 'drvload.exe' echo Sorry!! You can also call other batch files or command line scripts from this file. //Note that the code above mount a share located in \\10.12.1.36\ISOs (this is your Windows/Samba server) and run 'menu-os.cmd', this file will be located in mounted shared.// For Plug and Play or networking support, make sure that you include a call to wpeinit in your customized Startnet.cmd script. For more info, see [[https://technet.microsoft.com/en-us/library/hh825191.aspx|Wpeinit and Startnet.cmd: Using WinPE Startup Scripts]]. Wpeinit outputs log messages to c:\Windows\system32\wpeinit.log. == Remove "//press any key to boot from CD or DVD//" message when the ISO boots == del C:\winPE_amd64\ISO\boot\bootfix.bin == Add an app == **This step is optional!!** * Create an app directory inside the mounted Windows PE image. md "C:\winPE_amd64\mount\windows\" * Copy the necessary app files to the local Windows PE directory. Xcopy C:\ "C:\winPE_amd64\mount\windows\" * Test the app later by booting Windows PE and running the application from the X: directory. If your app requires temporary storage, or if Windows PE becomes unresponsive when it runs an app, you may need to increase the amount of temporary storage (scratch space) allocated to Windows PE. * To automatically launch a shell or application that runs when Windows PE starts, add the path location to the Winpeshl.ini file. For more info, see [[https://technet.microsoft.com/en-us/library/hh825046.aspx|Winpeshl.ini Reference: Launching an app when WinPE starts]]. == Add temporary storage (scratch space) == **This step is optional!!** Windows PE reserves memory on the X: drive to unpack the Windows PE files, plus additional temporary file storage, known as scratch space, that can be used by your applications. By default, this is 512MB for PCs with more than 1GB of RAM, otherwise the default is 32MB. Valid values are 32, 64, 128, 256, or 512: Dism /Set-ScratchSpace:128 /Image:"C:\winPE_amd64\mount" == Replace the background image == **This step is optional!!** If you've got multiple versions of Windows PE, you can set the background image so you can instantly tell which version of Windows PE is running. Change the security permissions of the Windows PE background image file (\windows\system32\winpe.jpg). This allows you to modify or delete the file: * In Windows Explorer, navigate to C:\winPE_amd64\mount\windows\system32. * Right-click the C:\winPE_amd64\mount\windows\system32\winpe.jpg file, and select **Properties** -> **Security** tab -> **Advanced**. * Next to Owner, select Change. **Change** the owner to **Administrators**. * Apply the changes, and exit the Properties window to save changes. * Right-click the C:\winPE_amd64\mount\windows\system32\winpe.jpg file, and select **Properties** -> **Security** tab -> **Advanced**. * Modify the permissions for **Administrators** to allow full access. * Apply the changes, and exit the Properties window to save changes. Finally replace the winpe.jpg file with your own image file. == Add answer file settings == **This step is optional!!** Some Windows PE settings can be managed by using an answer file, such as firewall, network, and display settings. Create an answer file, name it unattend.xml, and add it to the root of the Windows PE media to process these settings. For more information, see [[https://technet.microsoft.com/en-us/library/hh825191.aspx|Wpeinit and Startnet.cmd: Using WinPE Startup Scripts]]. ==== Unmount the Windows PE image and create media ==== * Unmount the Windows PE image and commit the changes: Dism /Unmount-Wim /MountDir:"C:\winPE_amd64\mount" /commit * Copy the new Windows PE image to C:\winPE_amd64\ISO\Sources copy C:\winPE_amd64\winpe.wim C:\winPE_amd64\ISO\Sources\Boot.wim * Remaster the boot CD: oscdimg -n -bC:\winPE_amd64\etfsboot.com C:\winPE_amd64\ISO C:\winPE_amd64\winpe_amd64.iso * Finally copy the file "winpe_amd64.iso" to your PXE server directory. ===== Edit WinPE ISO image ===== If you want to edit a WinPE ISO image previously created just follow the next steps: * [[unattended_installations:windows_pxe#mount_the_windowspe_image | Mount the WindowsPE image ]] * [[unattended_installations:windows_pxe#add_customatizations | Add customatizations (optional!!)]] * [[unattended_installations:windows_pxe#unmount_the_windows_pe_image_and_create_media | Unmount the Windows PE image and create media]] ===== Configure Samba4 share ===== A Windows/Samba share is required to export Windows installations. First we need to create a directory in /srv to storage Windows installations, for instance: # mkdir -p /srv/samba-shares/ISOs Within create a subdirectory for each installation of Windows, ie: mkdir -p /srv/samba-shares/ISOs/{Win2008R2-ENG,Win2008x32-ENG,Win2008x64-ENG,Win2012R2-VL-ENG,Win7SP1-allver-ESP,Win8.1enterprise-withupdate-x32-ENG,Win8.1enterprise-withupdate-x32-ESP,Win8.1enterprise-withupdate-x64-ENG,Win8.1enterprise-withupdate-x64-ESP,Win8-allver-ESP} Finally begins to copy the contents of Windows ISO in the right directory. == Configure Samba share == To configure Samba4 share with public access (no require a valid user and password), check the following lines in /etc/samba/smb.conf security = user map to guest = Bad User To add a new share (public share): * Edith /etc/samba/smb.conf * Add a new share inside: [ISOs] comment = Windows Installations path = /srv/samba-shares/WinISOs guest ok = Yes * To test the config: # testparm * Apply the changes: # service sernet-samba-smbd restart # service sernet-samba-nmbd restart == Testing Samba share == To list the shares resources on your Samba server: # smbclient -L localhost -N The option -N don't prompt for authentication!! To access to a public resource: # smbclient //localhost/ISOs -N -c 'ls' ===== Windows Intallations Menu ===== At this point you have configured a public Samba share with many Windows installations inside, so to show the installations menu when boot Windows PE, create the following files in /srv/samba-shares/WinISOs/: **/srv/samba-shares/WinISOs/menu-os.cmd** @echo off REM Selecting the correct menu if %PROCESSOR_ARCHITECTURE%==x86 ( menu-os-x32.cmd ) else ( menu-os-x64.cmd ) **/srv/samba-shares/WinISOs/menu-os-x32.cmd** @echo off echo Starting menu... :menu ECHO. ECHO ............................................... ECHO INSTALLATION MENU - DIC UCLV ECHO ............................................... ECHO. ECHO 1 - Install Windows Server 2008 x32 ENGLISH ECHO 2 - Install Windows 7 SP1 All Version SPANISH ECHO 3 - Install Windows 8 All Version SPANISH ECHO 4 - Install Windows 8.1 Enterprise with Update x32 ENGLISH ECHO 5 - Install Windows 8.1 Enterprise with Update x32 SPANISH ECHO q - EXIT ECHO. REM Selecting an option SET /P M=Select an option by a number or 'q' to exit, then press ENTER: IF %M%==1 GOTO win2008x32 IF %M%==2 GOTO win7sp1allversp IF %M%==3 GOTO win8allversp IF %M%==4 GOTO win8.1enterprise-withupdate-x32-eng IF %M%==5 GOTO win8.1enterprise-withupdate-x32-esp IF %M%==q GOTO EOF REM Sections :win2008x32 ECHO You choose to install Windows 2008 x32 ENGLISH PAUSE ECHO Starting setup.exe q:\Win2008x32-ENG\setup.exe CLS GOTO menu :win7sp1allversp ECHO You choose to install Windows 7 SP1 All Version SPANISH PAUSE ECHO Starting setup.exe q:\Win7SP1-allver-ESP\setup.exe CLS GOTO menu :win8allversp ECHO You choose to install Windows 8 All Version SPANISH PAUSE ECHO Starting setup.exe q:\Win8-allver-ESP\setup.exe CLS GOTO menu :win8.1enterprise-withupdate-x32-eng ECHO You choose to install Windows 8.1 Enterprise x32 with Update ENGLISH PAUSE ECHO Starting setup.exe q:\Win8.1enterprise-withupdate-x32-ENG\setup.exe CLS GOTO menu :win8.1enterprise-withupdate-x32-esp ECHO You choose to install Windows 8.1 Enterprise x32 with Update SPANISH PAUSE ECHO Starting setup.exe q:\Win8.1enterprise-withupdate-x32-ESP\setup.exe CLS GOTO menu :EOF ECHO. ECHO To reload the installation menu type 'menu-os.cmd' PAUSE CLS **/srv/samba-shares/WinISOs/menu-os-x64.cmd** @echo off echo Starting menu... :menu ECHO. ECHO ............................................... ECHO INSTALLATION MENU - DIC UCLV ECHO ............................................... ECHO. ECHO 1 - Install Windows Server 2008 x64 ENGLISH ECHO 2 - Install Windows Server 2008R2 ENGLISH ECHO 3 - Install Windows Server 2012R2 VL ENGLISH ECHO 4 - Install Windows 8.1 Enterprise with Update x64 ENGLISH ECHO 5 - Install Windows 8.1 Enterprise with Update x64 SPANISH ECHO q - EXIT ECHO. REM Selecting an option SET /P M=Select an option by a number or 'q' to exit, then press ENTER: IF %M%==1 GOTO win2008x64 IF %M%==2 GOTO win2008R2 IF %M%==3 GOTO win2012R2VL IF %M%==4 GOTO win8.1enterprise-withupdate-64-eng IF %M%==5 GOTO win8.1enterprise-withupdate-x64-esp IF %M%==q GOTO EOF REM Sections :win2008x64 ECHO You choose to install Windows 2008 x64 ENGLISH PAUSE ECHO Starting setup.exe q:\Win2008x64-ENG\setup.exe CLS GOTO menu :win2008R2 ECHO You choose to install Windows 2008R2 ENGLISH PAUSE ECHO Starting setup.exe q:\Win2008R2-ENG\setup.exe CLS GOTO menu :win2012R2VL ECHO You choose to install Windows 2012R2 VL ENGLISH PAUSE ECHO Starting setup.exe q:\Win2012R2-VL-ENG\setup.exe CLS GOTO menu :win8.1enterprise-withupdate-x64-eng ECHO You choose to install Windows 8.1 Enterprise x64 with Update ENGLISH PAUSE ECHO Starting setup.exe q:\Win8.1enterprise-withupdate-x64-ENG\setup.exe CLS GOTO menu :win8.1enterprise-withupdate-x64-esp ECHO You choose to install Windows 8.1 Enterprise x64 with Update SPANISH PAUSE ECHO Starting setup.exe q:\Win8.1enterprise-withupdate-x64-ESP\setup.exe CLS GOTO menu :EOF ECHO. ECHO To reload the installation menu type 'menu-os.cmd' PAUSE CLS **NOTE:** To add or remove Windows installations modify menu-os-x32.cmd or menu-os-x64.cmd ===== Configure PXE menu ===== The configuration for PXE menu may look like: LABEL WinPE for 32 bits systems kernel memdisk append iso raw initrd=/commons/sysinstall/winpe/winpe_x86.iso LABEL WinPE for 64 bits systems kernel memdisk append iso raw initrd=/commons/sysinstall/winpe/winpe_amd64.iso Where WinPE ISO files are copied in /srv/tftp/commons/sysinstall/winpe/ directory. ====== Resources ====== * [[https://technet.microsoft.com/en-us/library/hh824972.aspx|WinPE: Mount and Customize]] * [[https://technet.microsoft.com/en-us/library/hh825191.aspx|Wpeinit and Startnet.cmd: Using WinPE Startup Scripts]]