Public/Get-UserGroupMember.ps1

function Get-UserGroupMember {
  <#
  .SYNOPSIS
    Gets the members of a local group.
  .DESCRIPTION
    The Get-UserGroupMember cmdlet gets the members of a local group.
  .PARAMETER Group
    The security group from the local Security Accounts Manager.
  .PARAMETER Name
    The security group from the local Security Accounts Manager.
  .PARAMETER SID
    The security group from the local Security Accounts Manager by SecurityIdentifier.
  .PARAMETER Member
    The name of the user or group that is a member of this group.
  .EXAMPLE
    Get-UserGroupMember -Name "Administrators"
    Gets all members of the Administrators group.
  #>

  [CmdletBinding(DefaultParameterSetName = 'Default')]
  param(
    [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true, ParameterSetName = 'Group')]
    [UserGroup]$Group,

    [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true, ParameterSetName = 'Default')]
    [string]$Name,

    [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true, ParameterSetName = 'SecurityIdentifier')]
    [System.Security.Principal.SecurityIdentifier]$SID,

    [Parameter(Position = 1)]
    [ValidateNotNullOrEmpty()]
    [string]$Member
  )

  process {
    $group = $null

    if ($null -ne $Group) {
      $group = $Group
    } elseif ($null -ne $Name) {
      $group = [UserGroup]::new($Name)
    } elseif ($null -ne $SID) {
      $group = [UserGroup]::new()
      $group.SID = $SID
    }

    if ($null -eq $group) { return }

    try {
      $members = [LocalAccountHelper]::GetUserGroupMembers($group)

      # Filter by Member if specified
      if ($null -ne $Member) {
        if ($Member -match '\*|\?') {
          $pattern = [System.Management.Automation.WildcardPattern]::new($Member, [System.Management.Automation.WildcardOptions]::Compiled -bor [System.Management.Automation.WildcardOptions]::IgnoreCase)
          $members = $members | Where-Object { $pattern.IsMatch($_.Name) }
        } else {
          $sid = [LocalAccountHelper]::TryParseSid($Member)
          if ($null -ne $sid) {
            $members = $members | Where-Object { $_.SID -eq $sid }
          } else {
            $members = $members | Where-Object { $_.Name -and $_.Name.EndsWith($Member, [StringComparison]::CurrentCultureIgnoreCase) }
          }
        }
      }

      # Sort by name
      $members = $members | Sort-Object { $_.Name }

      $members
    } catch {
      Write-Error -Message $_.Exception.Message -ErrorId 'InvalidUserGroupMemberOperation' -Category InvalidOperation -TargetObject $group
    }
  }
}