I’ve been working with the ConfigMgr (and previously, the SMS) provider for years, using the underlying WMI classes to completely automate the administration of ConfigMgr. So I have existing scripts, C# code, and Visual Basic code to do things like creating a collection. See http://myitforum.com/articles/8/view.asp?id=1309 for an old example I created almost four years ago.
I didn’t expect it to be particularly difficult to convert this logic into PowerShell, but I have to say it wasn’t nearly as easy as I expected. But after some swearing at the computer (and knowing that there is no way it can hear me or understand my level of frustration), I did get it to work.
So here’s my next example, continuing on what was in the previous blog posting ( http://blogs.technet.com/mniehaus/archive/2009/04/07/fun-with-configmgr-2007-and-powershell.asp... ). Add the following text (hopefully the line wrapping doesn’t cause problems) to the bottom of the file you created previously:
function New-SCCMCollection
{
[CmdletBinding()]
PARAM
(
[Parameter(Position=1)] $name,
[Parameter(Position=2)] $comment,
[Parameter(Position=3)] [ValidateRange(0, 59)] [int] $refreshMinutes,
[Parameter(Position=4)] [ValidateRange(0, 23)] [int] $refreshHours,
[Parameter(Position=5)] [ValidateRange(0, 31)] [int] $refreshDays,
[Parameter(Position=6)] $parentCollectionID
)# Build the parameters for creating the collection
$arguments = @{Name = $name; Comment = $comment; OwnedByThisSite = $true}
$newColl = set-wmiinstance -class SMS_Collection -arguments $arguments -computername $sccmServer -namespace $sccmNamespace
# Hack - for some reason without this we don't get the CollectionID value
$hack = $newColl.PSBase | select * | out-null
# It's really hard to set the refresh schedule via set-wmiinstance, so we'll set it later if necessary
if ($refreshMinutes -gt 0 -or $refreshHours -gt 0 -or $refreshDays -gt 0)
{
# Create the recur interval object
$intervalClass = [wmiclass]"\\$sccmServer\$($sccmNamespace):SMS_ST_RecurInterval"
$interval = $intervalClass.CreateInstance()
if ($refreshMinutes -gt 0)
{
$interval.MinuteSpan = $refreshMinutes
}
if ($refreshHours -gt 0)
{
$interval.HourSpan = $refreshHours
}
if ($refreshDays -gt 0)
{
$interval.DaySpan = $refreshDays
}
# Set the refresh schedule
$newColl.RefreshSchedule = $interval
$newColl.RefreshType=2
$path = $newColl.Put()
}
# Build the parameters for the collection to subcollection link
$subArguments = @{SubCollectionID = $newColl.CollectionID}
if ($parentCollectionID -eq $null)
{
$subArguments += @{ParentCollectionID = "COLLROOT"}
}
else
{
$subArguments += @{ParentCollectionID = $parentCollectionID}
}
# Add the link
$newRelation = set-wmiinstance -class SMS_CollectToSubCollect -arguments $subArguments -computername $sccmServer -namespace $sccmNamespace
# Return the collection
$newColl
}
So what does this do? Simple, it creates a new collection. You can use it in various ways:
import-module C:\SCCM.psm1
Connect-SCCMServer MTN-SERVER
new-SCCMCollection -name "Test 1"
new-SCCMCollection -name "Test 2" -comment "Test comment"
new-SCCMCollection -name "Test 3" -refreshMinutes 30
new-SCCMCollection -name "Test 4" -refreshHours 1
new-SCCMCollection -name "Test 5" -refreshDays 1
new-SCCMCollection -name "Test 6" -parentCollectionID CEN0001C
Now, for some explanation of the wackiness above:
Of course now you’ll want to know how to add membership rules to that collection. That’s up next, but I need to get some “real work” done first…
*** Updated to fix two issues (lack of testing, sorry):