Scripts/Create-AzApiManagementUserAccount.ps1

param(
    [string][Parameter(Mandatory = $true)] $ResourceGroupName = $(throw "Resource group name is required"),
    [string][parameter(Mandatory = $true)] $ServiceName = $(throw "API management service name is required"),
    [string][parameter(Mandatory = $true)] $FirstName = $(throw "The first name of the user is required"),
    [string][parameter(Mandatory = $true)] $LastName = $(throw "The last name of the user is required"),
    [string][parameter(Mandatory = $true)] $MailAddress = $(throw "The mail-address of the user is required"),
    [string][parameter(Mandatory = $false)] $UserId = $($MailAddress -replace '\W', '-'),
    [string][parameter(Mandatory = $false)] $Password,
    [string][parameter(Mandatory = $false)] $Note,
    [switch][parameter(Mandatory = $false)] $SendNotification = $false,
    [string][parameter(Mandatory = $false)][ValidateSet('invite', 'signup')] $ConfirmationType = "invite",
    [string][parameter(Mandatory = $false)] $ApiVersion = "2022-08-01",
    [string][parameter(Mandatory = $false)] $SubscriptionId,
    [string][parameter(Mandatory = $false)] $AccessToken
)

$apim = Get-AzApiManagement -ResourceGroupName $ResourceGroupName -Name $ServiceName
if ($apim -eq $null) {
    throw "Unable to find the Azure API Management instance '$ServiceName' in resource group '$ResourceGroupName'"
}

if ($SubscriptionId -eq "" -or $AccessToken -eq "") {
    # Request accessToken in case the script contains no records
    $token = Get-AzCachedAccessToken

    $AccessToken = $token.AccessToken
    $SubscriptionId = $token.SubscriptionId
}

$apimMgmtEndpoint = "https://management.azure.com/subscriptions/$SubscriptionId/resourceGroups/$ResourceGroupName/providers/Microsoft.ApiManagement/service/$ServiceName/users/$($UserId)?notify=$SendNotification&api-version=$ApiVersion"
$fullUrl = $apimMgmtEndpoint.Replace('{subscriptionId}', $SubscriptionId)

try {
    if ($ConfirmationType -eq 'invite') {
        Write-Verbose "Attempting to invite $FirstName $LastName ($mailAddress) for Azure API Management instance '$ServiceName' in resource group '$ResourceGroupName'"
    } else {
        Write-Verbose "Attempting to create account for $FirstName $LastName ($mailAddress) for Azure API Management instance '$ServiceName' in resource group '$ResourceGroupName'"
    }

    $jsonRequest = ConvertTo-Json -Depth 3 @{
        'properties' = @{
            'firstName'    = $FirstName
            'lastName'     = $LastName
            'email'        = $MailAddress
            'confirmation' = $ConfirmationType
            'password'     = $Password
            'note'         = $Note
        }
    }

    $params = @{
        Method      = 'Put'
        Headers     = @{ 
            'authorization' = "Bearer $AccessToken"
        }
        URI         = $fullUrl
        Body        = $jsonRequest
        ContentType = 'application/json'
    }

    $web = Invoke-WebRequest @params -ErrorAction Stop
   
    Write-Verbose $web

    if ($ConfirmationType -eq 'invite') {
        Write-Host "Invitation has been sent to $FirstName $LastName ($mailAddress) for Azure API Management instance '$ServiceName' in resource group '$ResourceGroupName'" -ForegroundColor Green
    } else {
        Write-Host "Account has been created for $FirstName $LastName ($mailAddress) for Azure API Management instance '$ServiceName' in resource group '$ResourceGroupName'" -ForegroundColor Green
        if ($Password -eq $null -or $Password -eq "") {
            Write-Warning "Since no password was provided, one has been generated. Please advise the user to change this password the first time logging in for the Azure API Management instance '$($ServiceName)' in resource group '$($ResourceGroupName)'"
        }
    }

    return $UserId
} catch {
    throw "Failed to create an account for $FirstName $LastName ($MailAddress) for Azure API Management instance '$ServiceName' in resource group '$ResourceGroupName'. Details: $($_.Exception.Message)"
}