Trevor Sullivan's Tech Room

Minding the gap between administration and development

PowerShell: Disable ConfigMgr Task Sequence Countdown Notification

Posted by Trevor Sullivan on 2011/11/22


Introduction

If you are using Microsoft System Center Configuration Manager (SCCM / ConfigMgr) to deploy task sequences to ConfigMgr client systems, you may notice that by default, a countdown notification is shown as a balloon notification in the client’s system tray. In some cases, this functionality may be undesirable, and you may therefore wish to disable the balloon notification. Unfortunately, the task sequence properties GUI in the ConfigMgr console does not allow you to disable the notification, but you can do so via script.

The SMS_TaskSequencePackage class in the root\sms\site_lab (where “lab” is your three-digit ConfigMgr site code) WMI namespace represents each task sequence that has been created in a Configuration Manager hierarchy. The ProgramFlags property on this class contains a series of bitwise values (not sure if that’s the right term) which represent various options. In this case, we care about option 0x400 (1024 in base 10), which if enabled, disables the countdown timer.

image

PowerShell Code

The PowerShell code included below will allow you to specify a task sequence package ID that you would like to disable balloon notifications on. I suggest running the code inside of the PowerShell Integrated Scripting Editor (ISE).

Make sure you update your ConfigMgr server name (where the provider sits) and ConfigMgr site code before running it!

function Disable-ConfigMgrTaskSequenceNotification {
    param (
        [Parameter(Mandatory = $true)] $SccmServer
        , [Parameter(Mandatory = $true)] $SiteCode
        , [Parameter(Mandatory = $true)] $TaskSequenceID
    )
    
    try {
        # Retrieve the WMI instance that represents the intended task sequence package
        $TaskSequencePackage = [wmi]"\\$SccmServer\root\sms\site_$SiteCode`:SMS_TaskSequencePackage.PackageID='$TaskSequenceID'";
    }
    # If the WMI object does not exist, catch the error and deal with it ... somehow.
    catch [System.Management.Automation.RuntimeException] {
        Write-Host -Object ("A Windows Management Instrumentation error occurred.`n" + `
            "`n* Is the computer powered on?" + `
            "`n* Is a firewall blocking access to WMI?" + `
            "`n* Is the WMI service started on the remote system?");
    }
    
    # If the object handle was acquired from WMI, then go ahead and process it
    if ($TaskSequencePackage) {

        # Echo out the current ProgramFlags value
        Write-Verbose -Message ("Current program flags for {0} are {1}" `
                    -f $TaskSequencePackage.Name, $TaskSequencePackage.ProgramFlags);

        # If the notification disablement is not enabled (confusing, I know), then enable it.
        if (($TaskSequencePackage.ProgramFlags -band 0x400) -eq 0) {
            Write-Verbose -Message ("Disabling countdown for task sequence: {0}" -f $TaskSequencePackage.Name);
            
            # This is where the meat is: perform the binary XOR operation (same as adding 1024 in base 10) and set
            # the resulting value back to the ProgramFlags property. Remember that -bxor oscillates between on & off, so
            # that's why we have to perform the check in the if { ... } statement, prior to blindly switching it.
            $TaskSequencePackage.ProgramFlags = $TaskSequencePackage.ProgramFlags -bxor 0x400;
            
            # Commit the in-memory WMI instance back to the ConfigMgr provider
            $TaskSequencePackage.Put();
        }
    }
    # If a task sequence cannot be found with the appropriate ID, then notify the user.
    else {
        Write-Host `
            -Object ("Could not find task sequence with ID {0} in the {1} WMI namespace on {2}" `
            -f $TaskSequenceID, "root\sms\site_$SiteCode", $SccmServer)
    }
}

Clear-Host;
$SccmServer = 'sccm01.mydomain.com';
$SiteCode = 'LAB';
$TaskSequenceID = Read-Host -Prompt 'Please enter a task sequence ID to modify';

Disable-ConfigMgrTaskSequenceNotification `
    -SccmServer $SccmServer `
    -SiteCode $SiteCode `
    -TaskSequenceID $TaskSequenceID `
    -Verbose;

When you execute this script, you’ll be prompted for a task sequence ID, so make sure to have that handy.

image

Hope this helps!

Advertisements

One Response to “PowerShell: Disable ConfigMgr Task Sequence Countdown Notification”

  1. Neil Brooks said

    Thanks, I like the PS implementation better.
    One comment though: If you do not want them to appear at all in the Run Advertised Programs (can you reallly trust your users?), cheat by only allowing the Task Sequnce to run on an obscure OS such as x64 XP. All the clients will reject it but the task will still be available via PXe booting.

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 )

Twitter picture

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

Facebook photo

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

Google+ photo

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

Connecting to %s

 
%d bloggers like this: