Manufacturer / Model Collections with hierarchy
The last post made a flat structure of collections with “Manufacturer – Model”, in this post the script creates a hierarchy with (almost) the same collections.
The Model-collections queries are limited to the parent Manufacturer-collection.
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Rikard Ronnkvist / snowland.se # Usage: # Download and install https://snowland.se/sccm-posh/ # Save the file as CreateMM-collections-Hierarchy.ps1 # PS:>.\CreateMM-collections-Hierarchy.ps1 -rootCollectionName "Name Of Some Collection" # # 2010-03-24 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)" Function checkAndCreate ($CollectionName, $ParentCollectionID, $wql, $limit = $null) { Write-Host "Checking ""$($CollectionName)""" -ForegroundColor Cyan $newCollection = Get-SCCMCollection -filter "Name='$($CollectionName)'" -sccmserver $sccm if (!$newCollection) { if (!$WhatIf.IsPresent) { Write-Host "Creating collection: ""$($CollectionName)""" $newCollection = New-SCCMCollection -name "$($CollectionName)" -SccmServer $sccm -parentCollectionID $ParentCollectionID -refreshDays 1 -Verbose } else { Write-Host "What if: Creating collection: ""$($CollectionName)""" -ForegroundColor Red } if (!$WhatIf.IsPresent) { Write-Verbose "Adding rule with WQL: $wql" Add-SCCMCollectionRule -queryExpression $wql -Server $sccm -collectionID $newCollection.CollectionId -queryRuleName $CollectionName -limitToCollectionId $limit } else { Write-Host "What if: Adding collection rule to new collection with wql: $($wql)" -ForegroundColor Red } } else { Write-Host "Found collection ""$($CollectionName)""" } return $newCollection } Write-Host "Lookup Manufacturer and Model" $Manufacturer = Get-wmiobject -query "SELECT DISTINCT Manufacturer FROM SMS_G_System_COMPUTER_SYSTEM" -computername $Sccm.Machine -namespace $Sccm.Namespace | Sort-Object Manufacturer, Model $Manufacturer | ForEach-Object { $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)'" $ManufacturerCollection = checkAndCreate -collectionName $_.Manufacturer -ParentCollectionID $rootCollection.CollectionId -wql $wql -limit $null $Model = Get-wmiobject -query "SELECT DISTINCT Model FROM SMS_G_System_COMPUTER_SYSTEM WHERE Manufacturer = '$($ManufacturerCollection.Name)'" -computername $Sccm.Machine -namespace $Sccm.Namespace | Sort-Object Manufacturer, Model $Model | ForEach-Object { $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.Model = '$($_.Model)'" $ModelCollection = checkAndCreate -collectionName $_.Model -ParentCollectionID $ManufacturerCollection.CollectionId -wql $wql -limit $ManufacturerCollection.CollectionId } }