internal/functions/Get-ADWmiFilter.ps1

function Get-ADWmiFilter {
    <#
    .SYNOPSIS
        Parses WMI filter objects from the active directory.
     
    .DESCRIPTION
        Parses WMI filter objects from the active directory.
     
    .PARAMETER Server
        The server / domain to work with.
         
    .PARAMETER Credential
        The credentials to use for this operation.
     
    .PARAMETER Name
        Name of the WMI filter to retrieve.
        Defaults to: *
     
    .EXAMPLE
        PS C:\> Get-ADWmiFilter
 
        Returns all WMI Filters in the current domain.
    #>

    [CmdletBinding()]
    param (
        [PSFComputer]
        $Server,
        
        [PSCredential]
        $Credential,

        [string]
        $Name = '*'
    )

    begin {
        #region Functions
        function ConvertFrom-WmiFilterQuery {
            [CmdletBinding()]
            param (
                [Parameter(ValueFromPipeline = $true)]
                [string]
                $Query
            )

            process {
                $segments = $Query.Trim(';') -split ";"
                $index = 1
                while ($index -lt $segments.Count) {
                    $item = [PSCustomObject]@{
                        Namespace = $segments[$index + 4]
                        Query     = $segments[$index + 5]
                    }
                    Add-Member -InputObject $item -MemberType ScriptMethod -Name ToString -Value { $this.Query } -Force
                    Add-Member -InputObject $item -MemberType ScriptMethod -Name ToQuery -Value {
                        '3;{0};{1};WQL;{2};{3};' -f $this.Namespace.Length, $this.Query.Length, $this.Namespace, $this.Query
                    }
                    $item
                    $index = $index + 6
                }
            }
        }
        
        function ConvertFrom-WmiFilterTime {
            [OutputType([DateTime])]
            [CmdletBinding()]
            param (
                [Parameter(ValueFromPipeline = $true)]
                [string]
                $Time
            )

            process {
                if ($Time -notmatch '000-000$') { return }
                [datetime]::ParseExact(($Time -replace '000-000$'), 'yyyyMMddHHmmss.fff', $null)
            }
        }
        #endregion Functions

        $parameters = $PSBoundParameters | ConvertTo-PSFHashtable -Include Server, Credential
        $parameters['Debug'] = $false
    }
    process {
        $wmiFilterObjects = Get-ADObject @parameters -LDAPFilter "(&(objectClass=msWMI-Som)(msWMI-Name=$Name))" -Properties msWMI-Name, msWMI-Author, msWMI-CreationDate, msWMI-ChangeDate, msWMI-Parm1, msWMI-Parm2, msWMI-ID

        foreach ($wmiFilterObject in $wmiFilterObjects) {
            [PSCustomObject]@{
                Name              = $wmiFilterObject.'msWMI-Name'
                Author            = $wmiFilterObject.'msWMI-Author'
                CreationDate      = $wmiFilterObject.'msWMI-CreationDate' | ConvertFrom-WmiFilterTime
                ChangeDate        = $wmiFilterObject.'msWMI-ChangeDate' | ConvertFrom-WmiFilterTime
                Description       = $wmiFilterObject.'msWMI-Parm1'
                Query             = $wmiFilterObject.'msWMI-Parm2' | ConvertFrom-WmiFilterQuery
                DistinguishedName = $wmiFilterObject.DistinguishedName
                ID                = $wmiFilterObject.'msWMI-ID'
            }
        }
    }
}