Public/Add-GroupMember.ps1

function Add-GroupMember {
  <#
  .SYNOPSIS
    Adds one or more users or groups to a local group.
  .DESCRIPTION
    The Add-GroupMember cmdlet adds one or more users or groups to 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
    One or more users or groups to add to this local group.
  .EXAMPLE
    Add-GroupMember -Name "Administrators" -Member "John"
    Adds the user John to the Administrators group.
  #>

  [CmdletBinding(SupportsShouldProcess = $true)]
  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(Mandatory = $true, Position = 1, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
    [ValidateNotNullOrEmpty()]
    [LocalPrincipalMember[]]$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 }

    foreach ($m in $Member) {
      if ($null -eq $m) { continue }

      if ($PSCmdlet.ShouldProcess($group.ToString(), "Add member $($m.Name)")) {
        try {
          [LocalAccountHelper]::AddUserGroupMember($group, $m)
        } catch [System.DirectoryServices.AccountManagement.PrincipalExistsException] {
          $ex = [LocalAccountsException]::new("Member $($m.Name) already exists in group $($group.Name)", $m, [LocalAccountsErrorCategory]::ResourceExists)
          Write-Error -Message $ex.Message -ErrorId 'MemberExists' -Category ResourceExists -TargetObject $m
        } catch [System.UnauthorizedAccessException] {
          $ex = [AccessDeniedException]::new($m)
          Write-Error -Message $ex.Message -ErrorId 'AccessDenied' -Category PermissionDenied -TargetObject $m
        } catch [PrincipalNotFoundException] {
          $ex = [PrincipalNotFoundException]::new($m.Name, $m)
          Write-Error -Message $ex.Message -ErrorId 'PrincipalNotFound' -Category ObjectNotFound -TargetObject $m
        } catch {
          Write-Error -Message $_.Exception.Message -ErrorId 'InvalidUserGroupMemberOperation' -Category InvalidOperation -TargetObject $m
        }
      }
    }
  }
}