How to unlock objects in ConfigMgr 2012 with Powershell

Unlocking packages or apps in ConfigMgr 2012

locked object in SCCM

Crap! Do you know this message? Most probably your console just crashed a minute ago while you were editing this application and you’re trying to open up this application again. Well, too bad, please wait for 30 minutes and then come back please.
This is because your lock on that object has not been released the moment your console crashed.

For more information on this, use the search engine of your choice (google *g*) and look for SEDO (Serialized Editing of Distributed Objects) or try this site: http://blogs.technet.com/b/sudheesn/archive/2012/10/28/sedo-serialized-editing-of-distributed-objects-configmgr-2012.aspx

Unlocking objects (before Powershell)

At least I hate waiting, even more if it’s 30 minutes because of a stupid lock I don’t want to have anymore. So what could be done? Wait… or go to your database and delete the lock. Not the best solution!!! Microsoft hates admins who directly touch and alter the database. But for a very long time this was the only solution to this problem: http://myitforum.com/myitforumwp/2013/02/22/unlocking-configmgr-2012-objects/

 select * from SEDO_LockState where LockStateID <> 0
 DELETE from SEDO_LockState where LockID = ‘<LockID of the record identified in the previous query>’

Unlocking objects (with Powershell)

So what can be done now that we don’t want to touch the database directly?

Powershell to the rescue! Since ConfigMgr 2012 SP1 we have the following cmdlet:

PS PRI:\> get-help Unlock-CMObject -Full

NAME
Unlock-CMObject

SYNTAX
Unlock-CMObject [-InputObject] <IResultObject[]> [-WhatIf] [-Confirm]  [<CommonParameters>]

PARAMETERS
-Confirm

Required?                    false
Position?                    Named
Accept pipeline input?       false
Parameter set name           (All)
Aliases                      cf
Dynamic?                     false

-InputObject <IResultObject[]>

Required?                    true
Position?                    0
Accept pipeline input?       true (ByPropertyName)
Parameter set name           ByValue
Aliases                      None
Dynamic?                     false

-WhatIf

Required?                    false
Position?                    Named
Accept pipeline input?       false
Parameter set name           (All)
Aliases                      wi
Dynamic?                     false

<CommonParameters>
This cmdlet supports the common parameters: Verbose, Debug,
ErrorAction, ErrorVariable, WarningAction, WarningVariable,
OutBuffer, PipelineVariable, and OutVariable. For more information, see
about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).

INPUTS
Microsoft.ConfigurationManagement.ManagementProvider.IResultObject[]

OUTPUTS
System.Object

ALIASES
None

Usage is pretty easy. Our Application named “7-zip” is locked, so this is our commandline:

 Unlock-CMObject -InputObject $(Get-CMApplication -Name 7-zip)

Of course the cmdlet won’t give us any feedback, but well, what did I expect? But now we are able to work on that application again.

Lock objects with Powershell

What can be done can also be undone, or something like that.

 Lock-CMObject -InputObject $(Get-CMApplication -Name 7-zip)

This command will lock the application, just like before.

Locking and unlocking works for applications, packages, driver packages, operating system images, boot images and task sequences.

Use these cmdlets to get the InputObjects:

 Get-CMApplication
 Get-CMPackage
 Get-CMDriverPackage
 Get-CMOperatingSystemImage
 Get-CMBootImage
 Get-CMTaskSequence