Private/Write-LocalGroups.ps1

function Write-LocalGroups {
    param (
        [parameter(Mandatory)][ValidateNotNullOrEmpty()][string] $Filename,
        [parameter(Mandatory)][ValidateNotNullOrEmpty()][string] $TableName,
        [parameter(Mandatory)][string] $SiteCode,
        [parameter(Mandatory)][ValidateNotNullOrEmpty()][string] $ServerName,
        [parameter()][string] $LogFile,
        [parameter()][bool] $ContinueOnError
    )
    Write-Log -Message "(Write-LocalGroups)" -LogFile $logfile
    $ServerShortName = ($ServerName -split '\.')[0]
    try {
        $GroupsList = Get-CimInstance -ClassName "Win32_Group" -ComputerName $ServerName -Filter "Domain='$ServerShortName'" -ErrorAction Stop
    }
    catch {
        Write-Log -Category 'Error' -Message 'cannot connect to $ServerName to enumerate local security groups'
        return
    }
    if ($null -eq $GroupsList) { return }
    $Fields = @("Name","Description","Members")
    $GroupDetails = New-CmDataTable -TableName $tableName -Fields $Fields
    foreach ($group in $GroupsList) {
        $gn = $group.Name
        $gd = $group.Description
        Write-Log -Message "group name... $gn" -LogFile $LogFile
        # get netbios (short) server name
        $SSname = ($ServerName.Split('\.'))[0]
        Write-Log -Message "getting members..." -LogFile $LogFile
        $wmiquery = "select * from Win32_GroupUser where GroupComponent=`"Win32_Group.Domain='$SSName',Name='$gn'`""
        Write-Log -Message "wmi query.... $wmiquery" -LogFile $LogFile
        try {
            $acct = Get-CimInstance -ComputerName $ServerName -Query $wmiquery -ErrorAction Stop
            $arr = @()
            if ($null -ne $acct) {
                foreach ($item in $acct) {
                    $data   = $item.PartComponent -split "\,"
                    $domain = ($data[0] -split "=")[1]
                    $name   = ($data[1] -split "=")[1]
                    $arr   += ("$domain\$name").Replace("""","")
                    [Array]::Sort($arr)
                }
                if ($arr.Count -gt 0) {
                    Write-Log -Message "member count... $($arr.Count)" -LogFile $LogFile
                    [string]$members = ($arr -join ", ")
                }
                else {
                    $members = '(no members)'
                }
            }
        }
        catch {
            if ($ContinueOnError -eq $True) {
                Write-Log -Category 'Error' -Message $_.Exception.Message -Severity 2 -LogFile $logfile
            }
            else {
                Write-Log -Category 'Error' -Message "Terminating Error: $($_.Exception.Message)" -Severity 3 -LogFile $logfile
                return
            }          
            $members = '(no members - failed to enumerate)'
        }
        Write-Log -Message "members...... $members" -LogFile $LogFile
        $row             = $GroupDetails.NewRow()
        $row.Name        = $gn
        $row.Description = $gd
        $row.Members     = $members
        $GroupDetails.Rows.Add($row)
    } # foreach group
    Write-Log -Message "enumerated $($GroupsList.Count) groups" -LogFile $LogFile
    , $GroupDetails | Export-CliXml -Path ($filename)
}