Manufacturer / Model Collections
You have probably created one or two collections that points to a specific Manufacturer and/or Model.
Well, this script will look in to your SCCM-database and create that kind of collections for you.

First you need my SCCM Module for PowerShell
Then I created a collection named “000 – Manufacturer – Model”
Copy and paste the code below to a file, save it as CreateMM-collections.ps1
Run with at least one param, -rootCollectionName
Example: .\CreateMM-collections.ps1 -rootCollectionName “000 – Manufacturer – Model”
The script support the -WhatIf and -Verbose parameters… might be good to have when testing.
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Rikard Ronnkvist / snowland.se
# Usage:
# Download and install https://snowland.se/sccm-posh/
# Save the file as CreateMM-collections.ps1
# PS:>.\CreateMM-collections.ps1 -rootCollectionName "Name Of Some Collection"
#
# 2010-03-23 Rikard Ronnkvist First snowland.se release
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PARAM (
[string] $rootCollectionName = $(throw "rootCollectionName required."),
[string] $hostName = (Get-Content env:computername),
[switch] $Verbose,
[Switch] $WhatIf
)
if ($verbose.IsPresent) {
$VerbosePreference = 'Continue'
} Else {
$VerbosePreference = 'SilentlyContinue'
}
Import-Module SCCM\SCCM-Functions -Force
Write-Verbose "Connect to SCCM-server $($hostName)"
$sccm = Connect-SCCMServer -HostName $hostName
Write-Host "Get root collection: ""$($rootCollectionName)"""
$rootCollection = Get-SCCMCollection -filter "Name='$($rootCollectionName)'" -sccmserver $sccm
if (!$rootCollection) {
throw "Cant find ""$($rootCollectionName)"""
}
Write-Host "Found collection: $($rootCollection.CollectionID)"
Write-Host "Lookup Manufacturer and Model"
$ManufacturerModel = Get-wmiobject -query "SELECT DISTINCT Manufacturer, Model FROM SMS_G_System_COMPUTER_SYSTEM" -computername $Sccm.Machine -namespace $Sccm.Namespace | Sort-Object Manufacturer, Model
$ManufacturerModel | ForEach-Object {
$mmCollectionName = "$($_.Manufacturer) - $($_.Model)"
Write-Host "Checking ""$($mmCollectionName)""" -ForegroundColor Cyan
$mmCollection = Get-SCCMCollection -filter "Name='$($mmCollectionName)'" -sccmserver $sccm
if (!$mmCollection) {
if (!$WhatIf.IsPresent) {
Write-Host "Creating collection: ""$($mmCollectionName)"""
$newMmCollection = New-SCCMCollection -name "$($mmCollectionName)" -SccmServer $sccm -parentCollectionID $rootCollection.CollectionID -refreshDays 1
} else {
Write-Host "What if: Creating collection: ""$($mmCollectionName)""" -ForegroundColor Red
}
$wql = "SELECT * FROM SMS_R_System inner join SMS_G_System_COMPUTER_SYSTEM on SMS_G_System_COMPUTER_SYSTEM.ResourceId = SMS_R_System.ResourceId where SMS_G_System_COMPUTER_SYSTEM.Manufacturer = '$($_.Manufacturer)' AND SMS_G_System_COMPUTER_SYSTEM.Model = '$($_.Model)'"
if (!$WhatIf.IsPresent) {
Write-Verbose "Adding rule with WQL: $wql"
Add-SCCMCollectionRule -queryExpression $wql -Server $sccm -collectionID $newMmCollection.CollectionId -queryRuleName $mmCollectionName
} else {
Write-Host "What if: Adding collection rule to new collection with wql: $($wql)" -ForegroundColor Red
}
} else {
Write-Host "Found collection"
}
}



2010-03-26 13:07
[...] last post made a flat structure of collections with “Manufacturer – Model”, in this post [...]
2010-07-19 11:10
This is great, how can it be altered to create collections based on IP subnets