I accidentally blew up my dev lab and now I need to build a new one but luckily we have PowerShell :).
In this picture we have 8 Queries and I would like to create Device Collections based on these Queries. These Queries are built with Servicing Extension.
Here are some of the commands that we can use in Configuration Manager 2012 R2 CU4. These commands allows us easily export/import Queries from one system to another and much more.
#Import Module Import-Module $env:SMS_ADMIN_UI_PATH.Replace("\bin\i386","\bin\configurationmanager.psd1") $SiteCode = Get-PSDrive -PSProvider CMSITE Set-Location "$($SiteCode.Name):\" #Get all CM Queries $Queries = Get-CMQuery #Total Queries $Queries.Count #Export Queries to a CSV file $Queries | Export-Csv -Path 'D:\Scripts\CMQueries.csv' -NoTypeInformation #Get only specific CM Queries keyword $Queries = Get-CMQuery -Name "*ConfigMgr clients *" -ForceWildcardHandling -Verbose #Total Queries with 'ConfigMgr clients' keyword - 9 in this case $Queries.Count #Create new Device Collection folder New-Item -Path "$($SiteCode.Name):\DeviceCollection" -Name 'System' #Build Device Collections based on these Queries foreach($Query in $Queries){ #Exclude built-in Queries If($Query.QueryID.Contains($SiteCode.Name)){ #Create Device Collection $Collection = New-CMDeviceCollection -Name $Query.Name -LimitingCollectionName 'All Systems' #Add Device Collection Query Membership Rule Add-CMDeviceCollectionQueryMembershipRule -Collection $Collection -QueryExpression $Query.Expression -RuleName $Query.Name #Move the Collections to correct folder Move-CMObject -InputObject $Collection -FolderPath "$($SiteCode.Name):\DeviceCollection\System" } } #Print out these new Device Collections $Collections = Get-CMDeviceCollection -Name "*ConfigMgr clients *" $Collections #Export out new Device Collections to a CSV file $OutPut = @() foreach($Col in $Collections){ $Object = New-Object -TypeName PSObject -Property @{ CollectionName = $Col.Name QueryName = $Col.CollectionRules.RuleName QueryExperssion = $Col.CollectionRules.QueryExpression } $OutPut += $Object } $OutPut | Export-Csv -Path 'D:\Scripts\CMCollectionsWithQueries.csv' -NoTypeInformation #Import Device Collections in a new environment $NewCollections = Import-Csv -Path 'D:\Scripts\CMCollectionsWithQueries.csv' foreach($COl in $NewCollections){ #Create Device Collection $Collection = New-CMDeviceCollection -Name $COl.CollectionName -LimitingCollectionName 'All Systems' #Add Device Collection Query Membership Rule Add-CMDeviceCollectionQueryMembershipRule -Collection $Collection -QueryExpression $COl.QueryExperssion -RuleName $COl.QueryName } #If you dont want to create Collections, then just create Queries $Queries = Import-Csv -Path 'D:\Scripts\CMCollectionsWithQueries.csv' foreach($Query in $Queries){ #Create new Query New-CMQuery -Expression $Query.QueryExperssion -Name $Query.QueryName -TargetClassName 'SMS_R_System' } #Print out the Collections member count $Collections = Get-CMDeviceCollection -Name "*ConfigMgr clients *" $Collections | Select-Object -Property Name,LocalMemberCount | Sort-Object -Property LocalMemberCount | Out-GridView #Invoke Query to get the Devices Invoke-CMQuery -Name 'ConfigMgr clients at or above version 5.00.7958.1401 (Cumulative Update 3 for System Center 2012 R2 Configuration Manager)'
Little bit later we have nice Device Collections in System folder
Using the PowerShell GridView output we can easily explore the Collection membership count
PS – My next Configuration Manager 2012 R2 Automation with PowerShell is in June @LabCenter
Happy Scripting
Line 75 of the script: ‘QueryExpression’ is misspelt
Do you have a script that will export all queries to a CSV and which can then be used to import to a new site?