Powershell_Scripts/SCCM/RegenerateBootImageWinPE10-v7.ps1
andre 01e78a7c61 Ajout d'un script Technet pour regénerer les images de boot sur SCCM
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
2018-02-08 15:14:19 +01:00

369 lines
14 KiB
PowerShell
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# //****************************************************************************
# // ***** 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
}
}