From 01e78a7c612682b2e27a82c6726d710de91c3de8 Mon Sep 17 00:00:00 2001 From: andre Date: Thu, 8 Feb 2018 15:14:19 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20d'un=20script=20Technet=20pour=20reg?= =?UTF-8?q?=C3=A9nerer=20les=20images=20de=20boot=20sur=20SCCM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pour régénérer les images de boot sur SCCM après une MAJ du Windows Deployment Kit Sur SCCM : Désinstall du windows deployment kit Installation de la nouvelle version ADKSetup Reboot du serveur Passage du script Possible reboot du serveur --- SCCM/RegenerateBootImageWinPE10-v7.ps1 | 368 +++++++++++++++++++++++++ 1 file changed, 368 insertions(+) create mode 100644 SCCM/RegenerateBootImageWinPE10-v7.ps1 diff --git a/SCCM/RegenerateBootImageWinPE10-v7.ps1 b/SCCM/RegenerateBootImageWinPE10-v7.ps1 new file mode 100644 index 0000000..536ca98 --- /dev/null +++ b/SCCM/RegenerateBootImageWinPE10-v7.ps1 @@ -0,0 +1,368 @@ +# //**************************************************************************** +# // ***** Script Header ***** +# // +# // File: RegenerateBootImageWinPE.ps1 +# // +# // Purpose: Regenerate the Configuration Manager default boot images to use +# // the latest Windows PE winpe.wim from the Windows ADK +# // The script must be used on your Primary Site Server +# // +# // Usage: powershell -ExecutionPolicy Bypass -file .\RegenerateBootImageWinPE.ps1 -BootimageName "CMBoot.wim" -BootImageConsoleName "Boot Image 1607" -OSArchitecture "x64" +# // +# // File Version: 1.0.7 +# // +# // Note: +# // $PxeEnabled and $EnableDebugShell are only honored if you create new Boot Images +# // $UpdateDistributionPoints is only honored if you OverwriteExistingImage is set to $True +# // +# // +# // ***** End Header ***** +# //**************************************************************************** + +# ***** Disclaimer ***** +# This file is provided "AS IS" with no warranties, confers no rights, +# and is not supported by the authors or Microsoft Corporation. + +  +### Static Parameters +[CmdLetBinding()] +Param +( + [Parameter(Mandatory = $true, + HelpMessage='Change the name matching your personal preference - Example: CMBootImage.wim')] + [ValidateScript({$_.EndsWith(".wim")})] + [String]$BootImageName, + + [Parameter(Mandatory = $true, + HelpMessage='Change the name matching your personal preference - Example: "Boot Image 1607"')] + [String]$BootImageConsoleName, + + [Parameter(Mandatory = $true, + HelpMessage='Change the name matching your personal preference - Example: "Boot Image based on Windows 10 1607"')] + [AllowEmptyString()] + [String]$BootImageConsoleDescription, + + [Parameter(Mandatory = $true, + HelpMessage='Just cosmetics to display the OS version of your boot image. If this is "" we copy OS version as new version name')] + [AllowEmptyString()] + [String]$BootImageConsoleVersion, + + [Parameter(Mandatory = $true, + HelpMessage="Provide the Boote Image Architecture - Valid Values x86, x64 or Both")] + [ValidateSet("x86","x64","Both")] + [String]$OSArchitecture, + + [Parameter(Mandatory = $true, + HelpMessage='Valid Values True/False - Set to True if you want to enable Command Command support on your new created boot images (applies only to new created boot images)')] + [ValidateSet('True','False')] + [String]$EnableDebugShell, + + [Parameter(Mandatory = $true, + HelpMessage='Valid Values True/False -Set to True if the new created boot image should be enabled to be deployed from PXE enabled DP (applies only to new created boot images)')] + [ValidateSet('True','False')] + [String]$PxeEnabled, + + [Parameter(Mandatory = $true, + HelpMessage='Valid Values True/False - Set to $True if you want to replace an existing boot image')] + [ValidateSet('True','False')] + [String]$OverwriteExistingImage, + + [Parameter(Mandatory = $true, + HelpMessage='Valid Values True/False - Set to $True if you want update Distribution Point (applies only if $OverwriteExistingImage = $True and the script detects an existing boot image matching $BootImageName)')] + [ValidateSet('True','False')] + [String]$UpdateDistributionPoints +) + +### Convert necessary Parameter to Boolean - the Param-Strings were used to simplify the Input in the Beginning + +Switch ($EnableDebugShell) +{ + "True" {[Boolean]$EnableDebugShell = $true; Break} + "False" {[Boolean]$EnableDebugShell = $false; Break} +} + +Switch ($PxeEnabled) +{ + "True" {[Boolean]$PxeEnabled = $true; Break} + "False" {[Boolean]$PxeEnabled = $false; Break} +} + +Switch ($OverwriteExistingImage) +{ + "True" {[Boolean]$OverwriteExistingImage = $true; Break} + "False" {[Boolean]$OverwriteExistingImage = $false; Break} +} + +Switch ($UpdateDistributionPoints) +{ + "True" {[Boolean]$UpdateDistributionPoints = $true; Break} + "False" {[Boolean]$UpdateDistributionPoints = $false; Break} +} +  +### Logging - Static Paramter can be changed +  +[String]$LogfileName = "RegenerateBootImageWinPE" +[String]$Logfile = "$env:SystemRoot\logs\$LogfileName.log" +  +Function Write-Log +{ + Param ([string]$logstring) + If (Test-Path $Logfile) + { + If ((Get-Item $Logfile).Length -gt 2MB) + { + Rename-Item $Logfile $Logfile".bak" -Force + } + } + $WriteLine = (Get-Date).ToString() + " " + $logstring + Add-content $Logfile -value $WriteLine + Write-Host $WriteLine +} +  +### Verify access to Configuration Manager Console for a PowerShell Commandlet import +  +Try +{ + $ConfigMgrModule = ($Env:SMS_ADMIN_UI_PATH.Substring(0,$Env:SMS_ADMIN_UI_PATH.Length-5) + '\ConfigurationManager.psd1') + Import-Module $ConfigMgrModule + Write-Log "Found SCCM-Console-Environment" + Write-Log $ConfigMgrModule +} +Catch +{ + Write-host "Exception Type: $($_.Exception.GetType().FullName)" + Write-host "Exception Message: $($_.Exception.Message)" + Write-Host "ERROR! Console not installed or found" + Write-Host "Script will exit" + Exit 1 +} + +### Get Site-Code and Site-Provider-Machine from WMI if possible + +Try +{ + $SMS = gwmi -Namespace 'root\sms' -query "SELECT SiteCode,Machine FROM SMS_ProviderLocation" + $SiteCode = $SMS.SiteCode + $SccmServer = $SMS.Machine + Write-Log "SiteCode: $SiteCode" + Write-Log "SiteServer: $SccmServer" +} +Catch +{ + Write-Log "Exception Type: $($_.Exception.GetType().FullName)" + Write-Log "Exception Message: $($_.Exception.Message)" + Write-Log "Unable to find in WMI SMS_ProviderLocation. This Script has to run on a SiteServer!" + Exit 1 +} + +### Change to CM-Powershell-Drive +  +Write-Log "Prepare Environment for Boot Image operations. Create PS-Drive if not found." +$CMDrive = Get-PSProvider -PSProvider CMSite +If ($CMDrive.Drives.Count -eq 0) +{ + Write-Log "CMSite-Provider does not have a Drive! Try to create it." + Try + { + New-PSDrive -Name $SiteCode -PSProvider CMSite -Root $SiteProvider + Write-Log "CMSite-Provider-Drive created!" + } + Catch + { + Write-Log "Exception Type: $($_.Exception.GetType().FullName)" + Write-Log "Exception Message: $($_.Exception.Message)" + } +} + +### ReCreate BootImage Function + +Function funCreateBootImage +{ +[CmdLetBinding()] +Param +( + [Parameter(Mandatory = $True)] + [ValidateSet("x86","x64")] + [string]$Architecture +) + +Switch ($Architecture) +{ + "x86" {$ArchitecturePath = "i386"; Break} + "x64" {$ArchitecturePath = "x64"; Break} +} + + Write-Log "Connecting to WMI Namespace: \\$SccmServer\root\sms\site_$SiteCode`:SMS_BootImagePackage" + $BootImageWMIClass = [wmiclass]"\\$SccmServer\root\sms\site_$SiteCode`:SMS_BootImagePackage" + [String]$BootImageSourcePath = "\\$SccmServer\SMS_$SiteCode`\OSD\boot\$ArchitecturePath\$BootImageName" + + If($(Get-Location) -match $SiteCode) + { + Write-Log "Switching Drive to File System" + Set-Location "C:" + } + + If (Test-Path -Path $BootImageSourcePath -PathType Leaf) + { + If(!$OverwriteExistingImage) + { + Write-Log "Error: $BootImageSourcePath found and OverwriteExistingImage is set to `$False" + # Critical Error occured exit function + break + } + Write-Log "$BootImageSourcePath found need to backup first" + Copy-Item $BootImageSourcePath $BootImageSourcePath".bak" -Force + [boolean]$BootImageFound = $True + } + Else + { + Write-Log "$BootImageSourcePath not found no need to backup" + } + + Try + { + Write-Log "Generating $Architecture Boot Image. This will take a few minutes... " + $BootImageWMIClass.ExportDefaultBootImage($Architecture , 1, $BootImageSourcePath) | Out-Null + Write-Log "New $Architecture Boot Image created continue with post tasks " + $NewBootImageName = "$BootImageConsoleName ($Architecture)" + + If(-not($BootImageFound)) + { + # Actions to perform if Boot Image file did not exist + Write-Log "Performing actions section Boot Image not exist" + If(-not($(Get-Location) -match $SiteCode)) + { + Write-Log "Switching Drive for ConfigMgr-CmdLets" + Set-Location $SiteCode":" + } + + Try + { + Write-Log "Import Boot Image into SCCM" + If($BootImageConsoleDescription.Length -eq 0) + { + New-CMBootImage -Path $BootImageSourcePath -Index 1 -Name $NewBootImageName -Version $BootImageConsoleVersion | Out-Null + Write-Log "Successfully imported $BootImageSourcePath" + } + Else + { + New-CMBootImage -Path $BootImageSourcePath -Index 1 -Name $NewBootImageName -Version $BootImageConsoleVersion -Description $BootImageConsoleDescription | Out-Null + Write-Log "Successfully imported $BootImageSourcePath" + } + } + Catch + { + Write-Log "Error: Failed to import $BootImageSourcePath" + # Critical Error occured exit function + break + } + + Try + { + If($BootImageConsoleVersion.Length -eq 0) + { + Write-Log "Get Boot Image Property ImageOSVersion" + $BootImageConsoleVersion = (Get-CMBootImage -Name $NewBootImageName).ImageOSVersion + } + Write-Log "Apply Boot Image Properties EnableCommandSupport with Value $EnableDebugShell and DeployFromPxeDistributionPoint with Value $PxeEnabled" + Set-CMBootImage -Name $NewBootImageName -EnableCommandSupport $EnableDebugShell -DeployFromPxeDistributionPoint $PxeEnabled -Version $BootImageConsoleVersion + Write-Log "Successfully applied Boot image properties" + } + Catch + { + Write-Log "Failed to apply Boot image properties" + } + + } + Else + { + # Actions to perform if Boot Image file did exist + Write-Log "Performing actions section Boot Image did exist" + $BootImageQuery = Get-WmiObject -Class SMS_BootImagePackage -Namespace root\sms\site_$($SiteCode) -ComputerName $SccmServer | where-object{$_.ImagePath -like "*$ArchitecturePath*" -and $_.ImagePath -like "*$BootImageName*"} + + ForEach($BootImagexIndex in $BootImageQuery) + { + $BootImageLogName = $BootImagexIndex.Name + Write-Log "Working on Boot Image: $BootImageLogName" + # Verify if the current Site is owner of this Boot Image (Unneeded in single Primary Site environments) + If($BootImagexIndex.SourceSite -ne $SiteCode) + { + Write-Log "Error: Site is not owner of this Boot Image $BootImageLogName will stop post actions" + } + Else + { + If($BootImageConsoleVersion.Length -eq 0) + { + $BootImageConsoleVersion = $BootImagexIndex.ImageOSVersion + } + + $BootImagexIndexVersion = $BootImagexIndex.Version + Write-Log "Will use version: $BootImageConsoleVersion as Version value" + } + + $BootImage = Get-WmiObject -Class SMS_BootImagePackage -Namespace root\sms\site_$SiteCode -ComputerName $SccmServer | where-object{$_.Name -like "*$BootImageLogName*"} + Try + { + Write-Log "Reload Image Properties to update console with new information" + $BootImage.ReloadImageProperties() | Out-Null + } + Catch + { + Write-Log "Error: Failed to Reload Image Properties to update console with new information" + } + + If($UpdateDistributionPoints) + { + Try + { + Write-Log "Trigger update Distribution Points" + $BootImage.UpdateImage | Out-Null + } + Catch + { + Write-Log "Error: Failed to Trigger update Distribution Points" + } + } + + If(-not($(Get-Location) -match $SiteCode)) + { + Write-Log "Switching Drive for ConfigMgr-CmdLets" + Set-Location $SiteCode":" + } + + Try + { + Write-Log "Apply Boot Image Properties for Version with Value $BootImageConsoleVersion" + Set-CMBootImage -Name $BootImageLogName -Version $BootImageConsoleVersion + Write-Log "Successfully applied Boot image properties" + } + Catch + { + Write-Log "Failed to apply Boot image properties" + } + } + } + } + Catch + { + Write-Log "Error: Failed to create $Architecture Boot Image. Exit $Architecture Boot Image post taks " + # Critical Error occured exit function + break + } + $BootImageFound = $False +} + +Write-Log "Trying to generate Boot images" + +Switch ($OSArchitecture) +{ + "x86" {funCreateBootImage -Architecture x86;Break} + "x64" {funCreateBootImage -Architecture x64;Break} + "Both" { + funCreateBootImage -Architecture x86 + funCreateBootImage -Architecture x64 + ;Break + } +} + +