Configuration Manager PowerShell Tuesdays: Creating and Distributing a Package / Program:

I have long been a crusty old VBScript kind of guy, that just the way it is. I’ve been knocking out ‘short’ 300 line scripts for 10 plus years. In that time I have also gone through a few epic multi thousand line monstrosity scripts,,,, now that’s living. Many years ago at the Microsoft Management Summit (maybe 2008 or 2009) I was given a PowerShell book inside the attendee bag. Then and there I decided to take the leap from my precious wscript.exe to this new-fangled PowerShell thing…… It didn’t happen……. I fell back to the comforts of VBScript year after year. I am here to say now that I think I have crossed the threshold – PowerShell has found its way to the front of my scripting activities and has been paramount in the automation work that I have completed over the last twelve months.

With this blog post I hope to kick off an extended multi post look into some of the many PowerShell CMDLETS included with System Center 2012 Configuration Manager. In addition to examining the CMDLETS themselves, I will be punting in a few posts that should tie multiple pieces of Configuration Manager PowerShell automation into larger Runbook Automation solutions, so look out for those as well.

As reference, I have also completed two blog postings on running Configuration Manager PowerShell CMDLETS outside of a Configuration Manager console initiated PowerShell session, more specifically from System Center Orchestrator. These may be useful when approaching Configuration Manager automation.

In this particular posting, I will be taking a quick look at the following four CMDLETS

  • New-CMPackage
  • Set-CMPackage
  • New-CMProgram
  • Start-CMContentDistribution

There is not much to cover at any extreme depth with the execution of these four CMDLETS, they are fairly straight forward. Nevertheless this article will be a great kick off point and should set the rhythm for many more to follow.  

New-CMPackage:

This CMDLET quite simply creates a Configuration Manager Package. The Get-Help file for this CMDLET includes the following syntax.

New-CMPackage -Name <string> [-Description <string>] [-Manufacturer <string>] [-Language <string>] [-Version <string>] [-Path <string>] [-WhatIf] [-Confirm] [<CommonParameters>]

For my example I will be running

New-CMPackage –Name “7ZIP – PS Created” –Path “\\twocmsp1\c$\Packages\Software Distribution\7ZIP

As can be seen in the console, the results match the executed PowerShell cmd.

Ok Cool, but what about the other package configuration options such as distribution priority, I do not see a way to configure these using the New-CMPackage CMDLET? Correct, it does not appear all configurations of a package can be set when initially creating the package, however loping in the Set-CMPackage CMDLET extends the configuration capability.

Set-CMPackage:

This CMDLET configures an existing Configuration Manager Package. The Get Help file for this CMDLET includes the following syntax. I’ve trimmed this down to only one of the returned sets of syntax. There are three mostly identical, one each for Package ID, Package Name, and Package Input Object.

Set-CMPackage -Name <string> [-SecuredScopeNames <string>] [-NewName <string>] [-Version <string>] [-Manufacturer <string>] [-Language <string>] [-Description <string>] [-Path <string>] [-ForcedDisconnectDelay <int>] [-ForcedDisconnectEnabled <bool>] [-ForcedDisconnectNumberRetries <int>] [-MifFileName <string>] [-MifName <string>] [-MifPublisher <string>] [-MifVersion <string>] [-DistributionPriority <Priorities> {High | Normal | Low}] [-ShareName <string>] [-ShareType <ShareTypes> {ShareCommon | ShareSpecific}] [-WhatIf] [-Confirm] [<CommonParameters>]

For my example I will be running:

Set-CMPackage -Name "7ZIP - PS Created" -DistributionPriority High

Which results in the following changes made on the package:

New-CMProgram:

With a package created, we will need a Program. The Get-Help file for the New-CMProgram CMDLET includes the following syntax. This is for a standard program only, the help file also includes some syntax for a device program. Use Get-Help New-CMProgram to see all syntax.

New-CMProgram -PackageName <string> -StandardProgramName <string> -CommandLine <string> [-RunType <RunType> {Normal | Minimized | Maximized | Hidden}] [-ProgramRunType <ProgramRunType> {OnlyWhenUserIsLoggedOn | WhetherOrNotUserIsLoggedOn | OnlyWhenNoUserIsLoggedOn}] [-RunMode <RunModeType> {RunWithUserRights | RunWithAdministrativeRights}] [-UserInteraction <bool>] [-Reconnect <bool>] [-DriveMode <DriveModeType> {RenameWithUnc | RequiresDriveLetter | RequiresSpecificDriveLetter}] [-DiskSpaceUnit <DiskSpaceUnitType> {KB | MB | GB}] [-DriveLetter <string>] [-WorkingDirectory <string>] [-DiskSpaceRequirement <string>] [-Duration <int>] [-WhatIf] [-Confirm] [<CommonParameters>]

For my example I will be running:

New-CMProgram -PackageName "7ZIP - PS Created" -StandardProgramName "7ZIP - Program" -CommandLine "msiexec.exe /I 7z920.msi /quiet /norestart"

The results are much to be expected. 

Take note of the standard Environment settings when no options have been specified with the New-CMProgram CMDLET.

If desired, additional configuration can be made at creation time. For instance if adding the -ProgramRunType and -RunMode parameter when running the New-CMProgram CMDLET, such as

New-CMProgram -PackageName "7ZIP - PS Created" -StandardProgramName "7ZIP - Program: -CommandLine "msiexec.exe /I 7z920.msi /quiet /norestart" -ProgramRunType WhetherOrNotUserIsLoggedOn -RunMode RunWithAdministrativeRights"

The results are as follows:

Start-CMContentDistribution:

All right - we have a package and a program created. Next step is to distribute this bad boy to a single distribution point or distribution point group. No worries, we have an CMDLET for that. The Get-Help file for Stat-CMContentDistribution includes the following. NOTE: this is the output for only a standard package, there are unique commands for driver packages, operating system images, etc. however they are mostly similar to what is shown below. Run Get-Help Start-CMContentDistribution for a full listing.

Start-CMContentDistribution -DeploymentPackageName <string[]> [-CollectionName <string>] [-DistributionPointName <string>] [-DistributionPointGroupName <string>] [-WhatIf] [-Confirm] [<CommonParameters>]

For my example I will be executing

Start-CMContentDistribution -PackageName "7ZIP - PS Created" -DistributionPointGroupName TWOCMSP1

Once completed we can observe on the distribution point groups properties that the package has in deed been distributed.

Conclusion:

Very straight foreword stuff here. As seen, through a series of just a few Configuration Manager CMDLETS we can easily create a Package, Program, and distribute the package to a group of distribution points.