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
This commit is contained in:
parent
fa2a06a5fa
commit
01e78a7c61
368
SCCM/RegenerateBootImageWinPE10-v7.ps1
Normal file
368
SCCM/RegenerateBootImageWinPE10-v7.ps1
Normal file
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user