Common/CSE/Get-GPOCSE.ps1

function Get-GPOCSE {
    Param (
        [Parameter(Mandatory)]
        [guid]$Id
    )

    $GPO = Get-GPOObject -Id $Id
    $AttributeString = $GPO.gPCMachineExtensionNames[0]

    $ListsRegExFilter = '\[\{00000000-0000-0000-0000-000000000000\}(?<Tools>(?:\{[0-9A-f]{8}-[0-9A-f]{4}-[0-9A-f]{4}-[0-9A-f]{4}-[0-9A-f]{12}\})*)\](?<CseSets>(?:\[(?:\{[0-9A-f]{8}-[0-9A-f]{4}-[0-9A-f]{4}-[0-9A-f]{4}-[0-9A-f]{12}\})(?:\{[0-9A-f]{8}-[0-9A-f]{4}-[0-9A-f]{4}-[0-9A-f]{4}-[0-9A-f]{12}\})*\])*)'
    $ListsRegEx = [regex]::new($ListsRegExFilter)
    $ListMatches = $ListsRegEx.Matches($AttributeString)

    # $ToolsList = ($ListMatches.Groups | Where-Object -FilterScript { $_.Name -eq 'Tools' }).Value
    # All tools are listed under respecstive

    $CseSetsList = ($ListMatches.Groups | Where-Object -FilterScript { $_.Name -eq 'CseSets' }).Value

    $CseSetsSplitRegExFilter = '(\[(?:\{[0-9A-f]{8}-[0-9A-f]{4}-[0-9A-f]{4}-[0-9A-f]{4}-[0-9A-f]{12}\})+\])'
    $CseSetsSplitRegEx = [regex]::new($CseSetsSplitRegExFilter)
    $CseSets = $CseSetsSplitRegEx.Matches($CseSetsList).Value

    foreach ($Set in $CseSets) {
        $CseSetSplitRegExFilter = '\[(?<CSE>\{[0-9A-f]{8}-[0-9A-f]{4}-[0-9A-f]{4}-[0-9A-f]{4}-[0-9A-f]{12}\})(?<Tools>(?:\{[0-9A-f]{8}-[0-9A-f]{4}-[0-9A-f]{4}-[0-9A-f]{4}-[0-9A-f]{12}\})*)\]'
        $CseSetSplitRegEx = [regex]::new($CseSetSplitRegExFilter)
        $CseSetSplitted = $CseSetSplitRegEx.Matches($Set)
        $CseId = ($CseSetSplitted.Groups | Where-Object -FilterScript { $_.Name -eq 'CSE' }).Value
        $CseToolsList = ($CseSetSplitted.Groups | Where-Object -FilterScript { $_.Name -eq 'Tools' }).Value

        $ToolsFilter = '\{[0-9A-f]{8}-[0-9A-f]{4}-[0-9A-f]{4}-[0-9A-f]{4}-[0-9A-f]{12}\}'
        $ToolsRegEx = [regex]::new($ToolsFilter)
        $ToolsId = $ToolsRegEx.Matches($CseToolsList).Value

        [GpoCseSet]::new($CseId, $ToolsId)
    }
}