public/Set-Admin.ps1

function Set-Admin {
    [CmdletBinding(DefaultParameterSetName = "ByObject")]
    param(
        [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true, ParameterSetName = "Inline")]
        [string]$Id,
        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [string]$Name,
        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [string]$Email,
        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [Alias("orgAccess")]
        [string]$OrganizationAccess,
        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [PSCustomObject[]]$Tags,
        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [PSCustomObject[]]$Networks,
        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [string]$OrganizationId = $env:MerakiOrganizationId
    )
    Begin {
        try {
            if (!$OrganizationId) {
                Write-Error -Exception ([System.Management.Automation.PSArgumentNullException]::new()) `
                    -Message "Parameter OrganizationId was not specified, and attempt to infer from env:MerakiOrganizationId failed." `
                    -ErrorAction Stop
            }
            [string]$baseUri = "$endpoint/organizations/$OrganizationId/admins"
            $queryUriRedirect = Invoke-WebRequest -Method GET -Uri $baseUri -MaximumRedirection 0 -Headers $headers -ErrorAction SilentlyContinue
            $baseUri = $queryUriRedirect.Headers.Location
        }
        catch {$PSCmdlet.ThrowTerminatingError($PSitem)}
    }
    Process {
        try {
            if ($PSCmdlet.ParameterSetName -eq "ByObject" -and !$Id) {
                Write-Error -Exception ([System.Management.Automation.PSArgumentNullException]::new()) `
                    -Message "Parameter Id was not specified nor provided by input object. Id is required to update an admin" `
                    -ErrorAction Stop
            }

            [string]$uri = "$baseUri/$Id"
            [PSCustomObject]$newAdmin = Get-MerakiAdmin -OrganizationId $OrganizationId | Where-Object {$_.id -eq $Id}

            if ($Name) {$newAdmin.name = $Name}
            if ($Email) {$newAdmin.email = $Email}
            if ($OrganizationAccess) {$newAdmin.orgAccess = $OrganizationAccess}
            if ($Tags) {$newAdmin.tags = $Tags}
            if ($Networks) {$newAdmin.networks = $Networks}

            $body = $newAdmin | ConvertTo-Json

            Invoke-RestMethod -Method Put -Uri $uri -Headers $headers -Body $body -ContentType 'application/json'
        }
        catch {
            $PSCmdlet.ThrowTerminatingError($PSitem)
        }
    }
}