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