public/Add-EntraIdUser.ps1

<#
.SYNOPSIS
Adds a new user to Entra ID (Azure AD).

.DESCRIPTION
This function creates a new user in Entra ID (Azure AD) with the specified display name and user principal name. A random GUID is used as the password. Additional properties can be provided as a hashtable.

.PARAMETER DisplayName
The display name of the user to add.

.PARAMETER UserPrincipalName
The user principal name (UPN) of the user to add.

.PARAMETER AdditionalProperties
Additional properties for the user as a hashtable.

.EXAMPLE
Add-EntraIdUser -DisplayName "John Doe" -UserPrincipalName "johndoe@contoso.com"

.EXAMPLE
Add-EntraIdUser -DisplayName "Jane Smith" -UserPrincipalName "janesmith@contoso.com" -AdditionalProperties @{ JobTitle = "Manager"; Department = "HR" }

.NOTES
Author: AzureStackNerd
Date: 11 September 2025
#>


function Add-EntraIdUser {
    [CmdletBinding(SupportsShouldProcess)]
    param (
        # The display name of the user to add
        [Parameter(Mandatory, Position = 0)]
        [string]$DisplayName,

        # The user principal name (UPN) of the user to add
        [Parameter(Mandatory, Position = 1)]
        [string]$UserPrincipalName,

        # Additional properties for the user
        [Parameter()]
        [hashtable]$AdditionalProperties
    )

    # Validate the UserPrincipalName format
    if (-not (Test-UserPrincipalName -UserPrincipalName $UserPrincipalName)) {
        Write-Error -Message "The UserPrincipalName '$UserPrincipalName' is not in a valid format." -ErrorAction Stop
    }

    if ($PSCmdlet.ShouldProcess("UserPrincipalName: $UserPrincipalName", "Add user to Entra ID")) {
        try {

            # Ensure Graph authentication is valid
            Test-GraphAuth

            # Generate a random GUID as the password
            $randomPassword = [Guid]::NewGuid().ToString()

            # Construct the user object
            $userObject = @{
                DisplayName       = $DisplayName
                UserPrincipalName = $UserPrincipalName
                AccountEnabled    = $false
                PasswordProfile   = @{ Password = $randomPassword; ForceChangePasswordNextSignIn = $true }
            }

            if ($AdditionalProperties) {
                $userObject += $AdditionalProperties
            }

            # Call Microsoft Graph to create the user
            $newUser = New-MgUser -BodyParameter $userObject

            Write-Output "User '$DisplayName' with UPN '$UserPrincipalName' created successfully."
        } catch {
            Write-Error -Message $_.Exception.Message -ErrorAction Stop
        }
    }
}