Public/Complete-UserWritebackOperation.ps1

function Complete-UserWritebackOperation {
    [CmdletBinding()]

    Param(
        [Parameter(Mandatory = $false, ValueFromPipeline = $true)]
        $Operation
    )

    Process {
        if ($Operation.Action -eq "New-ADUser") {
            $Operation | Show-UserWritebackOperation -Single
            $Password = ConvertTo-SecureString -String (New-Guid).ToString() -AsPlainText -Force
            $Parameters = $Operation.Parameters
            $CreatedUser = New-ADUser -AccountPassword $Password @Parameters -Passthru

            if ($CreatedUser.DistinguishedName) {
                Write-Verbose "Created new AD user '$($CreatedUser.SamAccountName)' with distinguished name '$($CreatedUser.DistinguishedName)'."
                
                $CreatedUser = $CreatedUser | Get-ADUser -Properties DistinguishedName,SamAccountName,UserPrincipalName,ObjectSID
                $Body = @{
                    onPremisesDistinguishedName  = $CreatedUser.DistinguishedName
                    onPremisesSamAccountName     = $CreatedUser.SamAccountName
                    onPremisesUserPrincipalName  = $CreatedUser.UserPrincipalName
                    onPremisesSecurityIdentifier = $CreatedUser.ObjectSID.ToString()
                    onPremisesDomainName         = ($CreatedUser.DistinguishedName.Split(",") | Where-Object { $_ -like "DC=*" } | ForEach-Object { $_.Substring(3) }) -join "."
                } | ConvertTo-Json -Depth 10

                Write-Verbose "Upating Entra ID user '$($Operation.EntraIDUser.id)' with on-premises attributes from the created user."
                Invoke-RestMethod -Uri "https://graph.microsoft.com/beta/users/$($Operation.EntraIDUser.id)" -Method Patch -Headers (Get-EntraIDAccessTokenHeader -Profile $Script:AccessTokenProfile) -Body $Body -ContentType "application/json"
            }
            else {
                Write-Warning "Failed to create new AD user with parameters: $($Parameters | Out-String)"
            }
        }
        elseif ($Operation.Action -eq "Set-ADUser") {
            $Operation | Show-UserWritebackOperation -Single
            $Parameters = $Operation.Parameters
            Set-ADUser -Identity $Operation.Identity @Parameters

            Write-Verbose "Updated AD user '$($Operation.Identity)'."
        }
        elseif ($Operation.Action -eq "Remove-ADUser") {
            $Operation | Show-UserWritebackOperation -Single
            Remove-ADUser -Identity $Operation.Identity -Confirm:$false

            Write-Verbose "Removed AD user '$($Operation.Identity)'."
        }
        elseif ($Operation.Action -eq "Rename-ADObject") {
            $Operation | Show-UserWritebackOperation -Single
            $Parameters = $Operation.Parameters
            Rename-ADObject -Identity $Operation.Identity @Parameters -Confirm:$false

            Write-Verbose "Renamed AD object '$($Operation.Identity)' to '$($Operation.Parameters.NewName)'."
        }
        elseif ($Operation.Action -eq "Move-ADObject") {
            $Operation | Show-UserWritebackOperation -Single
            $Parameters = $Operation.Parameters
            Move-ADObject -Identity $Operation.Identity @Parameters -Confirm:$false

            Write-Verbose "Moved AD object '$($Operation.Identity)' to '$($Operation.Parameters.TargetPath)'."
        }
        elseif ($Operation.Action -eq "Patch Entra ID User") {
            $Operation | Show-UserWritebackOperation -Single
            $Parameters = $Operation.Parameters

            $Body = $Parameters | ConvertTo-Json -Depth 10

            Invoke-RestMethod -Uri "https://graph.microsoft.com/beta/users/$($Operation.Identity)" -Method Patch -Headers (Get-EntraIDAccessTokenHeader -Profile $Script:AccessTokenProfile) -Body $Body -ContentType "application/json"

            Write-Verbose "Patched Entra ID user '$($Operation.Identity)'."
        }
        else {
            Write-Error "Unknown operation action '$($Operation.Action)'."
        }
    }
}