Show a Detailed Task Sequence Summary Screen with MECM

Configuration Manager (SCCM) Operating System (OSD) Summary Screen

Configuration Manager (SCCM) | Operating System Deployment (OSD) | Summary Screen | Advanced

If you are familiar with Operating System Deploment, MDT and Configuration Manager (SCCM) integrated with MDT, then you are likely to have seen the Summary Screen that can be configured to show at the end of the deployment to confirm the deployment is complete 

This is great, it gives a clear indication that the deployment has been completed.

But….what if you are using Configuration Manager (SCCM) Deployment Task Sequences without MDT Integration.

You could display a Message at the end of the Task Sequence to say it’s complete. This is effective and works, but it also keeps the Deployment Status as In Progress, until the message has been closed. Which in some cases could be a few hours after the deployment is completed, or possibly over a weekend. Meaning any analytics looking at Run Times of Deployment Task Sequence is not going to be reflective of the ‘actual’ deployment time.

Another option could be to use the Configuration Manager (SCCM) variable ‘SMSTSPostAction’, to shut the device down after the deployment is complete ‘shutdown.exe /s /f’. The is keeping it simple and effective, Run Times will not be affected and can implement in seconds.

We wanted to go one step further and provide feedback that the Deployment was complete, not affecting Run Times and providing some information to the engineer.

Building on the MDT methodology with OSDResults and OSDSetupHook, we can present another option for you.

The below implementation informs Configuration Manager (SCCM) that the Deployment is complete, so run times are not affected and displays the Summary Screen until closed, giving peace and mind that the device is completed.

There are a few little extras, such as reporting any missing, corrupt, disabled device drivers and an HTML Report.

Check out the concept video below. With the satisfaction of knowing that the tired look of the summary screen has been updated, with a modern, fresh look and feel.

And now the latest fresh-looking summary screen.

The steps and scripts below will get you up and running in no time.

At the end of the task sequence create the following steps

Configuration Manager OSD Summary Report

Step 1 – Create Folder = OSDReport

Type : Command Line
Command Line: cmd.exe /c md “%windir%\Temp\OSDReport”

Step 2 – Copy Files

Type : Command Line
Command Line: xcopy.exe “.\*.*” “%windir%\Temp\OSDReport” /Q  /I /E  /H /Y
Package: ‘The contents of the below link’

CommunityHelper/OSDReport/V2 at master · Drakey2000/CommunityHelper (github.com)

Bootstrapper.vbs

Dim oWS
Set oWS = CreateObject("Wscript.Shell")

Call oWS.Run("%windir%\system32\osdsetuphook.exe /execute", 0 , true)
Call oWS.Run("powershell.exe -ExecutionPolicy Bypass -File %windir%\Temp\OSDReport\Start-Report.ps1", 0 , true)

Wscript.Quit(0)


Show-Report.ps1

##################################################################       Comments        ##################################################################
<#
.SYNOPSIS
    A graphical and html Operating System Deployment Build Report

.DESCRIPTION
    Used with Configuration Manager Deployment Task Sequence to provide an end user summary report. Providing details of
    Computer info, Bios, Network, Task Sequence Variables, Application, Drivers, Hotfixes, Driver Warnings.

.EXAMPLE

.NOTES
    Author     : STEVEN DRAKE - https://ourcommunityhelper.com/2020/11/27/operating-system-deployment-summary-screen/
    Version    : 12 Feb  2021 - Updated Try Catch BitLocker Get-BitLockerVolume
    Version    : 04 May  2023 - Updated Computer Info to work for Windows 10 and Windows 11
#>
##################################################################  Set Startup Parameters  ##################################################################

    # Set Script Source Folder
    $Source = $PSScriptRoot

    # Add Assembly
    Add-Type -AssemblyName PresentationFramework,PresentationCore,WindowsBase,System.Windows.Forms,System.Drawing,System.DirectoryServices.AccountManagement

    # Add MahApps Framework - https://mahapps.com/
    Add-Type -Path "$Source\bin\MahApps.Metro.dll"
    Add-Type -Path "$Source\bin\System.Windows.Interactivity.dll"

    # Get Primary Monitor
    $PrimaryMonitor = [System.Windows.Forms.SystemInformation]::PrimaryMonitorSize

    # Set Log Folder
    $LogFolder = "$env:SystemRoot\Logs\CommunityHelper"

    # Create Log Folder
    New-Item -Path $LogFolder -ItemType Directory -Force

    # Get Report Date
    $ReportDate = Get-Date

    # Set Report File Path
    $LogFile = "$LogFolder\DeploymentReport.log"

    # Create Report Folder if it does not exist
    if (-not (Test-Path -Path (Split-Path -Path $LogFile))){New-Item -ItemType "directory" -Path (Split-Path -Path $LogFile)}

    # Set HTML File Path
    $HTMLPath =  "$LogFolder\DeploymentReport.html"

    # Create HTML folder if it does not exist
    if (-not (Test-Path -Path (Split-Path -Path $HTMLPath))){New-Item -ItemType "directory" -Path (Split-Path -Path $HTMLPath)}

    # Set Default (Reapplied on restart) : Enable Cursor Suppression:  0 = Disabled: Mouse cursor is not suppressed 1 = Enabled: Mouse cursor is suppressed (default) - https://support.microsoft.com/en-us/help/4494800/no-mouse-cursor-during-configuration-manager-osd-task-sequence
    reg.exe add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v EnableCursorSuppression /t REG_DWORD /d 1 /f


    ##################################################################  Gather Reporting Information  ##################################################################

    try{

    # Clear error logs: Used in testing
    $Error.Clear()

    # Get Computer Information
    $ComputerInfo = Get-ComputerInfo

    # Get Current Version Information
    $CurrentVersionInfo = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion"

    # Create System Info
    $SystemInfo = [PSCustomObject]@{
        'Product'       = $ComputerInfo.OsName
        'Version'       = $CurrentVersionInfo.DisplayVersion
        'Architecture'  = $ComputerInfo.OsArchitecture
        'MemoryGB'      = $ComputerInfo.CsPhyicallyInstalledMemory /1024 /1024
    }

    # Get Fixed Disk Volumes
    $SystemVolumes = Get-Volume | Select-Object DriveLetter,FileSystemLabel,FileSystemType,DriveType,HealthStatus,OperationalStatus,@{Name = "SizeGB"; Expression = {[math]::round($_.size/1GB, 1)}} |  Where-Object {($_.DriveType -eq 'Fixed') -and ($_.DriveLetter -ne $Null)} | Sort-Object DriveLetter

    # Get Environment Info
    $SystemEnv = $ComputerInfo | Select-Object `
        @{Name = "Local Language"; Expression = {$_.OsLocale}},
        @{Name = "Mui Languages"; Expression = {$_.OsMuiLanguages -join ", "}},
        @{Name = "TimeZone"; Expression = {$_.TimeZone}},
        @{Name = "System Root"; Expression = {$_.WindowsSystemRoot}},
        @{Name = "Registered Owner"; Expression = {$_.WindowsRegisteredOwner}},
        @{Name = "Registered Organization"; Expression = {$_.WindowsRegisteredOrganization}}

    # Import SMS Environment Variables
    If ((Test-Path -Path "$env:SystemRoot\Temp\OSDReport\TSEnv.xml") -eq $True) {$SMSEnv = Import-Clixml -Path "$env:SystemRoot\Temp\OSDReport\TSEnv.xml" }

    # Get BitLocker Info
    Try{

        $SystemBitLocker = Get-BitLockerVolume | Select-Object MountPoint,VolumeType,VolumeStatus,EncryptionMethod,EncryptionPercentage,@{Name = "KeyProtector"; Expression = {$_.KeyProtector -join ", "}},AutoUnlockKeyStored,AutoUnlockEnabled,ProtectionStatus | Sort-Object MountPoint
    
    }Catch{Add-Content $LogFile -Value $_.Exception.Message}

    # Get Hardware Info
    $SystemHardware = $ComputerInfo | Select-Object `
        @{Name = "Manufacturer"; Expression = {$_.CsManufacturer}},
        @{Name = "Model"; Expression = {$_.CsModel}},
        @{Name = "System SKU"; Expression = {$_.CsSystemSKUNumber}}

    # Get Bios Info
    $SystemBios = $ComputerInfo  | Select-Object `
        @{Name = "Bios Version"; Expression = {$_.BiosSMBIOSBIOSVersion}},
        @{Name = "Bios Release Date"; Expression = {$_.BiosReleaseDate}},
        @{Name = "Bios Serial Number"; Expression = {$_.BiosSeralNumber}}


    # Get Network Info
    $SystemNetwork = $ComputerInfo  | Select-Object `
        @{Name = "Hostname"; Expression = {$_.CsDNSHostName}},
        @{Name = "Domain"; Expression = {$_.CsDomain}}

    # Get AD Info
    Try{
        $ADSystemInfo = New-Object -ComObject ADSystemInfo
        $type = $ADSystemInfo.GetType()

        $SystemADInfo = @{
        "Computer Distinguished Name" = $type.InvokeMember('ComputerName','GetProperty',$null,$ADSystemInfo,$null)
        "Site Name" = $type.InvokeMember('SiteName','GetProperty',$null,$ADSystemInfo,$null)}

    }Catch{$RunAD = $False}

    # Get Network Adapter
    $NetworkAdpaters = Get-NetAdapter | Select-Object Name, MediaConnectionState ,MacAddress, LinkSpeed, MediaType | Sort-Object MediaConnectionState, Name

    # Add information text
    $Info = "`r`n"

    # Add Information Details
    $Info += "Information`r`n`r`n`t`t"
    $Info += $SystemInfo.psobject.Properties | ForEach-Object {$_.Name, " : " ,$_.Value + "`r`n`t`t"}
    $Info += "`r`n"

    # Add Envionment Details
    $Info += "Environment`r`n`r`n`t`t"
    $Info += $SystemEnv.psobject.Properties | ForEach-Object {$_.Name, " : " ,$_.Value + "`r`n`t`t"}
    $Info += "`r`n"

    # Addd Partion Volumes Details
    $Info += "Volumes`r`n`r`n"

    $SystemVolumes | ForEach-Object {

    $Info += "`t`t" + "Drive Letter : " + $_.DriveLetter + "`r`n"
    $Info += "`t`t" + "File System Label  : " + $_.FileSystemLabel + "`r`n"
    $Info += "`t`t" + "File System Type : " + $_.FileSystemType + "`r`n"
    $Info += "`t`t" + "Drive Type : " + $_.DriveType + "`r`n"
    $Info += "`t`t" + "Health Status : " + $_.HealthStatus + "`r`n"
    $Info += "`t`t" + "Operational Status : " + $_.OperationalStatus + "`r`n"
    $Info += "`t`t" + "Size GB : " + $_.sizeGB + "`r`n"
    $Info += "`r`n"

    }

    # Add BitLocker Details
    $Info += "BitLocker`r`n`r`n"

    $SystemBitLocker | ForEach-Object {

    $Info += "`t`t" + "Mount Point : " + $_.MountPoint + "`r`n"
    $Info += "`t`t" + "Volume Type  : " + $_.VolumeType  + "`r`n"
    $Info += "`t`t" + "Volume Status : " + $_.VolumeStatus  + "`r`n"
    $Info += "`t`t" + "Encryption Method : " + $_.EncryptionMethod  + "`r`n"
    $Info += "`t`t" + "Encryption Percentages : " + $_.EncryptionPercentage  + "`r`n"
    $Info += "`t`t" + "Key Protector : " + $_.KeyProtector  + "`r`n"
    $Info += "`t`t" + "AutoUnlock Key Stored : " + $_.AutoUnlockKeyStored  + "`r`n"
    $Info += "`t`t" + "AutoUnlock Enabled : " + $_.AutoUnlockEnabled  + "`r`n"
    $Info += "`t`t" + "Protection Status : " + $_.ProtectionStatus  + "`r`n"
    $Info += "`r`n"

    }

    # Add Hardware Details
    $Info += "Hardware`r`n`r`n`t`t"
    $Info += $SystemHardware.psobject.Properties | ForEach-Object {$_.Name, " : " ,$_.Value + "`r`n`t`t"}
    $Info += "`r`n"

    # Add BIOS Details
    $Info += "Bios`r`n`r`n`t`t"
    $Info += $SystemBios.psobject.Properties | ForEach-Object {$_.Name, " : " ,$_.Value + "`r`n`t`t"}
    $Info += "`r`n"

    # Add Network Details
    $Info += "Network`r`n`r`n`t`t"
    $Info += $SystemNetwork.psobject.Properties | ForEach-Object {$_.Name, " : " ,$_.Value + "`r`n`t`t"}
    $Info += "`r`n"

    # Add AD Details
    if ($Null -ne $SystemADInfo) {

    $Info += "`t`t"
    $Info += $SystemADInfo.GetEnumerator() | ForEach-Object {$_.Name, " : " ,$_.Value + "`r`n`t`t"}
    $Info += "`r`n"

    }

    $NetworkAdpaters | ForEach-Object {

    $Info += "`t`t" + $_.Name + "`r`n"
    $Info += "`t`t" + "Status : " + $_.MediaConnectionState + "`r`n"
    $Info += "`t`t" + "Mac Address : " + $_.MacAddress + "`r`n"
    $Info += "`t`t" + "Link Speed : " + $_.LinkSpeed + "`r`n"
    $Info += "`t`t" + "Media Type : " + $_.MediaType  + "`r`n"
    $Info += "`r`n"

    }

    # Add CM Variables Details
    if ($Null -ne $SMSEnv) {

    $Info += "Task Sequence Variables`r`n`r`n`t"
    $Info += $SMSEnv.GetEnumerator() | Sort-Object Name | ForEach-Object {$_.Name, " : " ,$_.Value + "`r`n`t`t"}
    $Info += "`r`n"

    }

    # Gather Error Report : Failed Drivers
    $FailedDevices = Get-CimInstance -ClassName Win32_PNPEntity | Select-Object Name,Description,PNPClass,Manufacturer,@{Name = "HardwareID"; Expression = {$_.HardwareID -join ", "}},Status,ConfigManagerErrorCode | Where-Object {$_.ConfigManagerErrorCode -ne 0 }

    ##################################################################  Create WPF Window  ##################################################################

    # Load the main window XAML code
    [XML]$Xaml = [System.IO.File]::ReadAllLines("$Source\xaml\SplashScreen.xaml")

    # Create a synchronized hash table and add the WPF window and its named elements to it
    $UI = [System.Collections.Hashtable]::Synchronized(@{})
    $UI.Window = [Windows.Markup.XamlReader]::Load((New-Object -TypeName System.Xml.XmlNodeReader -ArgumentList $xaml))
    $xaml.SelectNodes("//*[@*[contains(translate(name(.),'n','N'),'Name')]]") |

        ForEach-Object -Process {
            $UI.$($_.Name) = $UI.Window.FindName($_.Name)
        }


    # Set Title Text Properties
    $UI.TitleTextBlock.MaxWidth = $PrimaryMonitor.Width
    $UI.TitleTextBlock.Text = "Deployment Complete - $($ComputerInfo.CsDNSHostName)"

    # Set Info Tab Properties
    $UI.InfoTextBlock.MaxWidth = $PrimaryMonitor.Width
    $UI.InfoTextBlock.Text = $Info

    # Create Applictaion Row List
    $Apps = Get-Package | Select-Object Name, Version | Sort-Object Name

    foreach ($App in $Apps){

    $row= New-Object PSObject
    Add-Member -inputObject $row -memberType NoteProperty -name “Name” -value $App.Name
    Add-Member -inputObject $row -memberType NoteProperty -name “Version” -value $App.Version

    $UI.AppDataGrid.AddChild($row)
    }

    # Create Drivers Row List
    $Drivers = Get-CimInstance -ClassName Win32_PnPSignedDriver | Select-Object  DeviceClass, DeviceName, FriendlyName,DriverVersion, DriverProviderName, HardwareID | Sort-Object DeviceClass, DeviceName, DriverProviderName, DriverVersion

     foreach ($Driver in $Drivers){

    $row= New-Object PSObject
    Add-Member -inputObject $row -memberType NoteProperty -name “DeviceClass” -value $Driver.DeviceClass
    Add-Member -inputObject $row -memberType NoteProperty -name “DeviceName” -value $Driver.DeviceName
    Add-Member -inputObject $row -memberType NoteProperty -name “FriendlyName” -value $Driver.FriendlyName
    Add-Member -inputObject $row -memberType NoteProperty -name “DriverVersion” -value $Driver.DriverVersion
    Add-Member -inputObject $row -memberType NoteProperty -name “DriverProviderName” -value $Driver.DriverProviderName
    Add-Member -inputObject $row -memberType NoteProperty -name “HardwareID” -value $Driver.HardwareID

    $UI.DriverDataGrid.AddChild($row)
    }


    # Create Hotfix Row List
    $Hotfixes = Get-HotFix | Select-Object HotFixID, Description, InstalledOn | Sort-Object InstalledOn, HotFixID -Descending

    foreach ($HotFix in $Hotfixes){

    $row= New-Object PSObject
    Add-Member -inputObject $row -memberType NoteProperty -name “Hotfix” -value $HotFix.HotFixID
    Add-Member -inputObject $row -memberType NoteProperty -name “Description” -value $Hotfix.Description
    Add-Member -inputObject $row -memberType NoteProperty -name “Installed” -value $Hotfix.InstalledOn

    $UI.HotfixDataGrid.AddChild($row)
    }

    # Build warning text
    $Warning = "`r`n"

    if ($null -ne $FailedDevices ) {
        $Warning +="Please check drivers are installed and working correctly"
        $Warning += $FailedDevices | Out-String

        $UI.TabControl.SelectedIndex = 4

        }else{$UI.WarningTab.Visibility = "Hidden"}


    $UI.WarningTextBlock.MaxWidth = $PrimaryMonitor.Width
    $UI.WarningTextBlock.Text = $Warning

    $UI.LogTextBlock.MaxWidth = $PrimaryMonitor.Width
    $UI.LogTextBlock.Text = $LogFile

    ##################################################################  Create HTML Report  ##################################################################

# Build HTML Header
    $Header = @"
    <style>
    TABLE {border-width: 1px; border-style: solid; border-color: black; border-collapse: collapse; margin-left: auto; margin-right: auto}
    TH {border-width: 1px; padding: 3px; border-style: solid; border-color: black; background-color: lightgrey}
    TD {border-width: 1px; padding: 3px; border-style: solid; border-color: black;}
    TR:nth-child(odd) {background-color: #F0F0F0}
    TR:hover {background-color: #ffff00}
    H1,H2 {text-align: center}
    </style>
"@


    # Write html header to disk
    $Header |  Out-File $HTMLPath

    # Write header
    "<H1 style='text-align:center;'>Build Report<br>$($ComputerInfo.CsDNSHostName)   -    $ReportDate</H1><br>" | Add-Content $HTMLPath

    # Write System Information
    "<H2>Info</H2>" | Add-Content $HTMLPath
    $SystemInfo | ConvertTo-Html -As Table -Fragment | Add-Content $HTMLPath

    # Write Environment Information
    "<H2>Environment</H2>" | Add-Content $HTMLPath
    $SystemEnv | ConvertTo-Html -As Table -Fragment | Add-Content $HTMLPath

    # Write Volume Information
    "<H2>Volumes</H2>" | Add-Content $HTMLPath
    $SystemVolumes | ConvertTo-Html -As Table -Fragment | Add-Content $HTMLPath

    # Write BitLocker Information
    "<H2>BitLocker</H2>" | Add-Content $HTMLPath
    $SystemBitLocker | ConvertTo-Html -Fragment | Add-Content $HTMLPath

    # Write Hardware Information
    "<H2>Hardware</H2>" | Add-Content $HTMLPath
    $SystemHardware | ConvertTo-Html -As Table -Fragment | Add-Content $HTMLPath

    # Write Bios Information
    "<H2>Bios</H2>" | Add-Content $HTMLPath
    $SystemBios | ConvertTo-Html -As Table -Fragment | Add-Content $HTMLPath

    # Write Network Information
    "<H2>Network</H2>" | Add-Content $HTMLPath
    $SystemNetwork | ConvertTo-Html -As Table -Fragment | Add-Content $HTMLPath

    '<br>' | Add-Content $HTMLPath

    # Write AD Information - ( If avaliable )
    if ($Null -ne $SystemADInfo){
        [PSCustomObject]$SystemADInfo | ConvertTo-Html -As Table -Fragment | Add-Content $HTMLPath
    }

    '<br>' | Add-Content $HTMLPath

    $NetworkAdpaters | ConvertTo-Html -As Table -Fragment | Add-Content $HTMLPath

    # Write Task Sequence Variables - ( If avaliable )
    if ($Null -ne $SMSEnv){
        "<H2>Task Sequence Variables</H2>" | Add-Content $HTMLPath
        $SMSEnv.GetEnumerator() | Select-Object Name, Value | Sort-Object Name | ConvertTo-Html -As Table -Fragment | Add-Content $HTMLPath
    }

    # Write Apps Information
    "<H2>Applictaions</H2>" | Add-Content $HTMLPath
    $Apps | ConvertTo-Html -Fragment | Add-Content $HTMLPath

    # Write Driver Information
    "<H2>Drivers</H2>" | Add-Content $HTMLPath
    $Drivers  |  ConvertTo-Html -Fragment| Add-Content $HTMLPath

    # Write Hotfix Information
    "<H2>Hotifx</H2>" | Add-Content $HTMLPath
    $Hotfixes  |  ConvertTo-Html -Fragment | Add-Content $HTMLPath

    # Write Warning Information   (How do I get rid a string Array ...arrrr)
    "<H2>Warnings</H2>" | Add-Content $HTMLPath
    $FailedDevices | ConvertTo-Html -Fragment | Add-Content $HTMLPath

    # Write Post Contents
    ConvertTo-Html -PostContent "$HTMLPATH" | Add-Content $HTMLPath


    ##################################################################  Load WPF Window  ##################################################################


    # Close Button Action : Cleanup tasks, remove OSDReport directory, Set EnableCursorSuppression and close Form
    $UI.Button1.Add_Click({$UI.Window.Close()})

    # Event: Window loaded
    $UI.Window.Add_Loaded({

    # Activate the window to bring it to the fore
    $UI.Window.Activate()

    $UI.Window.Height = $PrimaryMonitor.Height
    $UI.Window.Width = $PrimaryMonitor.Width
    $UI.Window.TopMost = $True

    })

    # Display the window
    $UI.Window.ShowDialog()

}catch{Add-Content $LogFile -Value $_.Exception.Message}

Step 3 – Create TSEnv.xml

Type: Run PowerShell Script
Enter PowerShell Script: Appendix A
PowerShell execution policy: bypass

Appendix A

# Load Microsoft.SMS.TSEnvironment
$TSEnv = New-Object -COMObject Microsoft.SMS.TSEnvironment
 
# Get Task Sequence variables - Ordered not being retained with Import-Clixml
$SMSEnv = [ordered]@{
           
            'Boot Image ID' = $TSEnv.Value('_SMSTSBootImageID')
            'Install Updates' = $TSEnv.Value('SMSInstallUpdateTarget')
            'Launch Mode' = $TSEnv.Value('_SMSTSLaunchMode')
            'Local Cache' = $TSEnv.Value('_SMSTSClientCache')
            'Managament Point' = $TSEnv.Value('_SMSTSMP')
            'Media Type' = $TSEnv.Value('_SMSTSMediaType')
            'Peer Mode Enabled' = $TSEnv.Value('SMSTSPeerDownload')
            'Run from DP' = $TSEnv.Value('_SMSTSRunFromDP')
            'Site Code' = $TSEnv.Value('_SMSTSSiteCode')
            'Task Sequence ID' = $TSEnv.Value('_SMSTSAdvertID')
            'Task Sequence Name' = $TSEnv.Value('_SMSTSPackageName')
             'UEFI Mode' = $TSEnv.Value('_SMSTSBootUEFI')
}

# Export-Clixml to read ouside of Microsoft.SMS.TSEnvironment
$SMSEnv | Export-Clixml -Path "$env:SystemRoot\Temp\OSDReport\TSEnv.xml" 

Step 4 – Set System Setup

Type : Command Line
Command Line: cmd.exe /c reg add HKLM\SYSTEM\Setup /v CmdLine /d “System32\\wscript.exe //B %windir%\\Temp\\OSDReport\\Bootstrapper.vbs” /f

Step 5 – Set System Setup Type = 2

Type : Command Line
Command Line: cmd.exe /c reg add HKLM\SYSTEM\Setup /v SetupType /d 2 /t REG_DWORD /f

Step 6 – Enable Mouse Cursor

Type : Command Line
Command Line: cmd.exe /c  reg.exe add “HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System” /v EnableCursorSuppression /t REG_DWORD /d 0 /f

Step 7 – Suspend BitLocker – Reboot Count = 1

Type: Run PowerShell Script
Enter PowerShell Script: Appendix B
PowerShell execution policy: bypass

Appendix B

Try{
# Get BitLocker Status
$BDEStatus = Get-BitLockerVolume -MountPoint $env:SystemDrive 

# If BitLocker Enabled - Suspend for Reboot Count of 1 
if ($BDEStatus.ProtectionStatus -eq 'ON'){Suspend-BitLocker -MountPoint $env:SystemDrive  -RebootCount 1} 
}Catch{Exit 1}

Step 7 – Restart Type:                            

Type : Restart Computer
Specify what to run after restart : The currently installed default operating system

After the OSD Summary Report has been executed, you can find the HTML report in C:\Windows\Logs\CommunityHelper\DeploymentReport.html

2 thoughts on “Show a Detailed Task Sequence Summary Screen with MECM

  1. First off, this is amazing! I love this summary screen, it has helped so much. The only issue I am running into is when the summary screen shows the Windows Version, it is showing 2009 even though I am running 22H2. It shows that on my Win 10 22H2 machine and my Win 11 22H2 machine. From what I found it is because Microsoft hasn’t updated the registry key that this pulls from. I tried updating the script from

    @{Name = “Version”; Expression = {$_.WindowsVersion}}

    to

    @{Name = “Version”; Expression = {$_.OSDisplayVersion}}

    Because OSDisplayVersion shows 22H2 correctly, but now the summary screen is blank. I can’t find anything else that I might need to change and this script is well beyond me, so I was hoping you might know what needs to be changed.

    Thank you in advance!

    Like

    1. Hi Matthew

      Thanks for the feedback and the work you have done to identify the problem, and yep looks like there are variations between Windows 10 , Windows 11 and the latest releases.

      Have made changes to the Show-Report.ps1, so if you want to take the latest copy and update your package hopefully all is good…..fingers crossed!!

      Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: