forcing a task sequence to rerun … from powershell

well, kind of.  steve rachui wrote this genius little gem about how to manage the instances of the configmgr agent scheduler to manipulate a task sequence to rerun.  as you’ll note in the post, he didn’t indicate a method to automate it.  this is actually rather easy to accomplish from powershell.

first of all, our example … we’ll use steve’s screenshots as reference.  here’s the id that we want to get rid of: CEN20018-CEN00027-DBBBC9D6.

to be quite veracious and unerring, we should use the exact task sequence id in question.  we can set that to a variable just for kicks.

$tsid = “CEN20018”
 
alright, now that we have that, let’s examine the command we’re going to use.  to get information out of wmi, we have to use the get-wmiobject cmdlet.  ordinarily, you could just provide the class name you want to look at, but as steve noted in his post, you need to connect to a different namespace: root\ccm\scheduler.  let’s retrieve all the classes of this namespace using –list.
 
get-wmiobject –namespace “root\ccm\scheduler” –list
 
 
here’s a snippet of the expected output:
...
__Win32Provider {} __SystemSecurity {GetSD, GetSecuri.. CCM_Scheduler_History {} __NotifyStatus {} __ExtendedStatus {} __SecurityRelatedClass {}
...
 

ah, there we go.  the class we’re looking for is ccm_scheduler_history.  next thing we’ll do is pull the instances of this class.  if we just pull the class, it’ll be quite a nasty output, so let’s concentrate on what’s important for now: the schedule id.

Get-WmiObject -Namespace "root\ccm\scheduler" -Class ccm_scheduler_history | ft scheduleid


now we get a succinct output of just the schedule ids.  there’s the schedule id we’re looking for!

{00000000-0000-0000-0000-000000000027}
{00000000-0000-0000-0000-000000000061}
{00000000-0000-0000-0000-000000000011}
{00000000-0000-0000-0000-000000000022}
CEN20018-CEN00027-DBBBC9D6
{00000000-0000-0000-0000-000000000023}
{00000000-0000-0000-0000-000000000031}
{00000000-0000-0000-0000-000000000021}


let’s pull it all together and see how it looks.

Get-WmiObject -Namespace "root\ccm\scheduler" -Class ccm_scheduler_history | where { $_.scheduleid -like "$tsid*" }


perfect.  now we got back the right instance of the class.  i’m going to set this to a new variable called $tsinstance because i’m just that creative.

$tsinstance = Get-WmiObject -Namespace "root\ccm\scheduler" -Class ccm_scheduler_history | where { $_.scheduleid -like "*$tsid*" }
 

now, finally, we’re to the point where we can get rid of the thing.  so … how?  well… as it turns out, there’s a cmdlet for that.  all we need to do is pass the object to remove-wmiobject.  that just rocks.  here’s the finished command.

$instance | Remove-WmiObject


and if you just want one long command, here’s that as well:

Get-WmiObject -Namespace "root\ccm\scheduler" -Class ccm_scheduler_history | where { $_.scheduleid -like '*CEN20018*' } | Remove-WmiObject

Comments

  1. Perfect! I found Steve's post and was trying to make it work through VBS but Powershell is even better. Thanks!

    ReplyDelete

Post a Comment