Private/Get-RequiredTIModules.ps1

function Get-RequiredTIModules {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [string]$LogFileName
    )

    $requiredModules = @(
        @{Name = 'Az.Accounts'; Version = '2.2.3'},
        @{Name = 'Az.OperationalInsights'; Version = '2.3.0'}
    )

    foreach ($module in $requiredModules) {
        try {
            $installedModule = Get-InstalledModule -Name $module.Name -MinimumVersion $module.Version -ErrorAction SilentlyContinue
            
            if (-not $installedModule) {
                Write-Log -Message "Installing $($module.Name) module version $($module.Version)" -LogFileName $LogFileName -Severity Information
                
                # Check for admin privileges
                $isAdmin = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
                $scope = $isAdmin ? 'AllUsers' : 'CurrentUser'
                
                Install-Module -Name $module.Name -MinimumVersion $module.Version -Scope $scope -Force -AllowClobber
            }
            
            Import-Module -Name $module.Name -MinimumVersion $module.Version -Force
            Write-Log -Message "Successfully loaded $($module.Name) module version $($module.Version)" -LogFileName $LogFileName -Severity Information
        }
        catch {
            Write-Log -Message "Failed to install/import $($module.Name): $_" -LogFileName $LogFileName -Severity Error
            throw
        }
    }
}