I want to share a script that came about after i wanted to get hold of all the WMI-queries that’s been created and used for populating different device collections without need to go in to every single one of them and extract the query manually. Especially if you are dealing with larger environments who might have hundreds of device collections and first of all figuring out which one actually uses WMI-queries and who doesn’t.

What do we want to achieve

Extracts all the WMI-queries used in SCCM and outputs them in to a .txt files for each Device Collection.

The Script

<# .NOTES =========================================================================== Created on: 3/30/2017 Created by: Timmy Andersson Contact: @Timmyitdotcom =========================================================================== .DESCRIPTION Extracts all the WMI-queries used in SCCM and outputs them in to a .txt files for each Device Collection. #> [CmdletBinding(DefaultParameterSetName = 'DestinationPath')] param ( [Parameter(Mandatory = $true, Position = 1)] $DestinationPath ) BEGIN { [String]$Filepath = $DestinationPath $SiteCodeObjs = Get-WmiObject -Namespace "root\SMS" -Class SMS_ProviderLocation -ComputerName $env:COMPUTERNAME -ErrorAction Stop foreach ($SiteCodeObj in $SiteCodeObjs) { if ($SiteCodeObj.ProviderForLocalSite -eq $true) { $SiteCode = $SiteCodeObj.SiteCode } } $SitePath = $SiteCode + ":" Import-module ($Env:SMS_ADMIN_UI_PATH.Substring(0, $Env:SMS_ADMIN_UI_PATH.Length - 5) + '\ConfigurationManager.psd1') } PROCESS { if (-not (Test-Path $DestinationPath)) { new-item -Path $DestinationPath -ItemType Directory -Force } Set-location $SitePath $AllDC = (Get-CMDeviceCollection).Name Foreach ($Devicecollection in $AllDc) { $CollectionMR = Get-CMDeviceCollectionQueryMembershipRule -CollectionName "$Devicecollection" if ($CollectionMR -ne $null) { $Query = $CollectionMR.QueryExpression Out-File -FilePath "$DestinationPath$($Devicecollection).txt" -InputObject $Query } } } END { }

Example

Run this script from your Site server, only variable you need to pass through to the script is the destination path you want the source files to be output to

Note: If the folder doesn’t exist the script will create it for you

Get-DeviceCollectionsQueries.ps1 -DestinationPath "C:\Temp\Queries\"

When the script is finished go to your destination folder and you will find the all the different device collections and their WMI queries.





Until next time, cheers !

You can find me over at

[twitter-follow screen_name=’Timmyitdotcom’]