UpdateAz.ps1


<#PSScriptInfo
 
.VERSION 3.1
 
.GUID 9eb5ce4f-04cf-4fec-a2b8-f424812bb556
 
.AUTHOR rustedwizard@outlook.com
 
.COMPANYNAME
 
.COPYRIGHT
 
.TAGS
 
.LICENSEURI
 
.PROJECTURI
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
 
 
.PRIVATEDATA
 
#>


<#
 
.DESCRIPTION
 Uninstall and install latest version of Azure Powershell and Azure Cli
 
#>
 

param(

    [Parameter(Mandatory=$false)]
    [bool]$AllUsers=$true,
    [Parameter(Mandatory=$false)]
    [bool]$SkipAzureCli=$false
)
Write-Host -ForegroundColor Yellow "*********************************************************************" 
Write-Host -ForegroundColor Yellow "** Update Az **" 
Write-Host -ForegroundColor Yellow "** This script will perform following operation: **" 
Write-Host -ForegroundColor Yellow "** 1. Uninstall all versions of Az PowerShell. **" 
Write-Host -ForegroundColor Yellow "** 2. Install the latest version of Az PowerShell available. **" 
Write-Host -ForegroundColor Yellow "** 3. Upgrade/install the latest version of Azure Cli. **" 
Write-Host -ForegroundColor Yellow "*********************************************************************" 
Write-Host ""
Write-Host ""
Write-Host "Checking for elevated permissions..."
if (($AllUsers -OR !$SkipAzureCli) -AND
    (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))) 
{
    Write-Warning "Insufficient permissions to run this script. Open the PowerShell console as an administrator and run this script again."
    Write-Host -ForegroundColor Red "By default, this script install Az PowerShell in scope of AllUsers, and install Azure Cli require Admin permission."
    Write-Host -ForegroundColor Red 'You may specify prameter -AllUsers $false -SkipAzureCli=$true in order to run this script in regular user.'
    Return
}
Write-Host -ForegroundColor Yellow "Remove all versions of Az PowerShell currently installed" 
$AzVersions = Get-InstalledModule -Name Az -AllVersions -ErrorAction SilentlyContinue
if ($null -ne $AzVersions) {
    Foreach ($v in $AzVersions) {
        $version = $v.Version
        Write-Host -ForegroundColor Yellow "Removing Az PowerShell version $version"
        $temp += (Import-Clixml -Path (Join-Path -Path $v.InstalledLocation -ChildPath PSGetModuleInfo.xml)).Dependencies.Name
        $total = $temp.Count
        $count = 0
        Foreach ($e in $temp) {
            $count += 1
            if ($null -ne $e) {
                if (Get-Module -ListAvailable -Name $e) {
                    $prog = $count / $total * 100
                    Write-Progress -Activity "Removing Depedency Module..." -Status "Dependency module found: $e" -PercentComplete $prog
                    Remove-Module -Name $e -ErrorAction SilentlyContinue
                    Write-Progress -Activity "Removing Depedency Module..." -Status "Attempting to uninstall module: $e" -PercentComplete $prog
                    Uninstall-Module -Name $e -AllVersions
                } 
                else {
                    Write-Host "Dependency Module $e not installed, skipping..." -ForegroundColor Yellow
                }
            }
        }
        Write-Progress -Activity "Removing Depedency Module..." -Status "Ready" -Completed
    }
    Write-Host ""
    Write-Host "Remove Az PowerShell..." -ForegroundColor Yellow
    Remove-Module -Name Az -ErrorAction SilentlyContinue
    Uninstall-Module -Name Az -AllVersions
    Write-Host -ForegroundColor Green "Successfully removed Az PowerShell version $version"
}else{
    Write-Host "No Az PowerShell install has been found, skip uninstallation..." -ForegroundColor Yellow
}
Write-Host "Install latest Az PowerShell..." -ForegroundColor Yellow
if($AllUsers){
    Install-Module -Name Az -Scope AllUsers -Repository PSGallery -Force
}else{
    Install-Module -Name Az -Scope CurrentUser -Repository PSGallery -Force
}
Write-Host "Upgrade operation has completed successfully." -ForegroundColor Green
if(!$SkipAzureCli){
    Write-Host ""
    Write-Host "Upgrade/Install Azure Cli" -ForegroundColor Yellow
    Write-Host ""
    Write-Host "Downloading latest version of Azure Cli..." -ForegroundColor Blue
    Invoke-WebRequest -Uri https://aka.ms/installazurecliwindows -OutFile .\AzureCLI.msi
    Write-Host "`Installer downloaded, start unattended install..." -ForegroundColor Yellow
    Start-Process msiexec.exe -Wait -ArgumentList '/I AzureCLI.msi /quiet'
    Write-Host "`rInstallation process end, clean up..." -ForegroundColor Green 
    Write-Host "Installation of Azure Cli completed successfully." -ForegroundColor Green
    Remove-Item .\AzureCLI.msi
    Write-Host "`Clean up completed, Upgrade installed Azure Cli Extensions." -ForegroundColor Yellow
    $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") 
    Az Upgrade
}
Write-Host "Script Execution Finished successfully." -ForegroundColor Green


# SIG # Begin signature block
# MIIQGQYJKoZIhvcNAQcCoIIQCjCCEAYCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUVQlvVAXjKJ6InIlsL5sfbeRV
# iBegggzVMIIGWzCCBEOgAwIBAgIQV156WorWyKgnVBrnbADy+TANBgkqhkiG9w0B
# AQsFADB4MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv
# dXN0b24xETAPBgNVBAoMCFNTTCBDb3JwMTQwMgYDVQQDDCtTU0wuY29tIENvZGUg
# U2lnbmluZyBJbnRlcm1lZGlhdGUgQ0EgUlNBIFIxMB4XDTIyMDcwOTE3MzEwN1oX
# DTI1MDcwODE3MzEwN1owZDELMAkGA1UEBhMCQ0ExGTAXBgNVBAgMEEJyaXRpc2gg
# Q29sdW1iaWExEDAOBgNVBAcMB0J1cm5hYnkxEzARBgNVBAoMClNoaWtlIENoZW4x
# EzARBgNVBAMMClNoaWtlIENoZW4wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGK
# AoIBgQC2KsqxstUq33DhMCd4NE3QmFI/ffLA3g1k0FRuwkuJJ0SdwT14OFJf221x
# mGnF4Y0ibGvD21/FeyVZxlA4unJlajZJF/WMMspZeriwWWGE84rE+z56lAhZnTLu
# M8Id2lDsuVv6C9vxNrerRRV9UErxqrk0OLdvdT8OFh9X0PNFE+Q4YFQQsrkT9dBN
# +bxe/n9cZgdlAgtGRN/ZdYE6Xs6Dc4DMaHLl0g+C8iN80DnVm6kRkg/4eW6Le9wD
# A7sn0BwuxxgUpttmCdZGAj8Y+M/I+G9AAHpB3Gdq9ptx+mB4S7pVIcBG5wkkmcG6
# R3aiWVfM/Rsil7/heXfcN4RNIYmwPnWB4ILwdEpCrx8NZqbt894MjI0Oh6rGkEsb
# KCklDKBf95AFei1FL5NVIeBFDbJpf5Ag+dZdSzCRQvqTBznYZRjP1n6FB7RpU+7k
# 9ONjtsWykoeUwdBoEKiLpavxXGuP5a6WX3q3XHoIsEcbaz3SRzxyUl2djpYzvHx/
# IMN6ggMCAwEAAaOCAXMwggFvMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUVML+
# EJUAk81q9efA19myS7iPDOMwWAYIKwYBBQUHAQEETDBKMEgGCCsGAQUFBzAChjxo
# dHRwOi8vY2VydC5zc2wuY29tL1NTTGNvbS1TdWJDQS1Db2RlU2lnbmluZy1SU0Et
# NDA5Ni1SMS5jZXIwUQYDVR0gBEowSDAIBgZngQwBBAEwPAYMKwYBBAGCqTABAwMB
# MCwwKgYIKwYBBQUHAgEWHmh0dHBzOi8vd3d3LnNzbC5jb20vcmVwb3NpdG9yeTAT
# BgNVHSUEDDAKBggrBgEFBQcDAzBNBgNVHR8ERjBEMEKgQKA+hjxodHRwOi8vY3Js
# cy5zc2wuY29tL1NTTGNvbS1TdWJDQS1Db2RlU2lnbmluZy1SU0EtNDA5Ni1SMS5j
# cmwwHQYDVR0OBBYEFDf3renyUjaxIiWGHDyaNg9qLVNPMA4GA1UdDwEB/wQEAwIH
# gDANBgkqhkiG9w0BAQsFAAOCAgEAatpx4vhhKY3FbIF4tycYGOlZP1fb7D+nhYyu
# LtG2fCLE3HUH5uUOXqwJ3cn9dJTyJ3U98q0GSo+dWwai9J7vf29jQNkVrPaA9qYO
# ZJFvqd2zwfD/OjIuDziu/fR8BZXBL/rDQmQHXy1V1pL69CanKIL2k9nZ2lJtHIAd
# SkbAcdkNaWMllupsNYrna2gzF4sznukX0vLbRDN4SPxFKreDVGkDSP58I3IMcqE8
# VNQcELHYeI7Baf6D+98MTVk1Rz1BkACai3mC/0zn6n5mvpnYpKb83Fd2YqHMPSRL
# d2u9PvEd/NU4UzbegYnqmxAC9JElGkSOALKJ9Vp3EsbAIHwHxem2/SS3HlfnjHg5
# kGkm8AXir0F+JPp8afsxaWji+l56kw4MbFlBoCtd0aBfeOPoCs65ehcmnphpnU0U
# oLW1Ec72etnKzsFiT3xRDVScfqojiM92yTyIt0/Fhlj9kcZgg6EGA4TEJYNmDltB
# 1MO6ZtDYW9vyYxu9Kc4n9CTDmeahzgf95bD7tKzSctwPaTwZHZ0GCGs4EeE/pdGJ
# wjUXwV8HsZ8VkTMY3o3pWQrzmTSZWzYhqryO2l5rsnfixiudjz2SmjX1umwrAFNb
# HB5/AH7k/fHpAxWfehnUyIqYn8txgUDLaQKEZMTECDkEdRVtVwruJdIF/LuBo1To
# LL87DZAwggZyMIIEWqADAgECAghkM1HTxzifCDANBgkqhkiG9w0BAQsFADB8MQsw
# CQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0b24xGDAW
# BgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBSb290IENl
# cnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTAeFw0xNjA2MjQyMDQ0MzBaFw0zMTA2
# MjQyMDQ0MzBaMHgxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UE
# BwwHSG91c3RvbjERMA8GA1UECgwIU1NMIENvcnAxNDAyBgNVBAMMK1NTTC5jb20g
# Q29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBDQSBSU0EgUjEwggIiMA0GCSqGSIb3
# DQEBAQUAA4ICDwAwggIKAoICAQCfgxNzqrDGbSHL24t6h3TQcdyOl3Ka5LuINLTd
# gAPGL0WkdJq/Hg9Q6p5tePOf+lEmqT2d0bKUVz77OYkbkStW72fL5gvjDjmMxjX0
# jD3dJekBrBdCfVgWQNz51ShEHZVkMGE6ZPKX13NMfXsjAm3zdetVPW+qLcSvvnSs
# Xf5qtvzqXHnpD0OctVIFD+8+sbGP0EmtpuNCGVQ/8y8Ooct8/hP5IznaJRy4PgBK
# Om8yMDdkHseudQfYVdIYyQ6KvKNc8HwKp4WBwg6vj5lc02AlvINaaRwlE81y9euc
# gJvcLGfE3ckJmNVz68Qho+Uyjj4vUpjGYDdkjLJvSlRyGMwnh/rNdaJjIUy1PWT9
# K6abVa8mTGC0uVz+q0O9rdATZlAfC9KJpv/XgAbxwxECMzNhF/dWH44vO2jnFfF3
# VkopngPawismYTJboFblSSmNNqf1x1KiVgMgLzh4gL32Bq5BNMuURb2bx4kYHwu6
# /6muakCZE93vUN8BuvIE1tAx3zQ4XldbyDgeVtSsSKbt//m4wTvtwiS+RGCnd83V
# PZhZtEPqqmB9zcLlL/Hr9dQg1Zc0bl0EawUR0tOSjAknRO1PNTFGfnQZBWLsiePq
# I3CY5NEv1IoTGEaTZeVYc9NMPSd6Ij/D+KNVt/nmh4LsRR7Fbjp8sU65q2j3m2PV
# kUG8qQIDAQABo4H7MIH4MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU3QQJ
# B6L1en1SUxKSle44gCUNplkwMAYIKwYBBQUHAQEEJDAiMCAGCCsGAQUFBzABhhRo
# dHRwOi8vb2NzcHMuc3NsLmNvbTARBgNVHSAECjAIMAYGBFUdIAAwEwYDVR0lBAww
# CgYIKwYBBQUHAwMwOwYDVR0fBDQwMjAwoC6gLIYqaHR0cDovL2NybHMuc3NsLmNv
# bS9zc2wuY29tLXJzYS1Sb290Q0EuY3JsMB0GA1UdDgQWBBRUwv4QlQCTzWr158DX
# 2bJLuI8M4zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBAPUPJodw
# r5miyvXWyfCNZj05gtOII9iCv49UhCe204MH154niU2EjlTRIO5gQ9tXQjzHsJX2
# vszqoz2OTwbGK1mGf+tzG8rlQCbgPW/M9r1xxs19DiBAOdYF0q+UCL9/wlG3K7V7
# gyHwY9rlnOFpLnUdTsthHvWlM98CnRXZ7WmTV7pGRS6AvGW+5xI+3kf/kJwQrfZW
# sqTU+tb8LryXIbN2g9KR+gZQ0bGAKID+260PZ+34fdzZcFt6umi1s0pmF4/n8OdX
# 3Wn+vF7h1YyfE7uVmhX7eSuF1W0+Z0duGwdc+1RFDxYRLhHDsLy1bhwzV5Qe/kI0
# Ro4xUE7bM1eV+jjk5hLbq1guRbfZIsr0WkdJLCjoT4xCPGRo6eZDrBmRqccTgl/8
# cQo3t51Qezxd96JSgjXktefTCm9r/o35pNfVHUvnfWII+NnXrJlJ27WEQRQu9i5g
# l1NLmv7xiHp0up516eDap8nMLDt7TAp4z5T3NmC2gzyKVMtODWgqlBF1JhTqIDfM
# 63kXdlV4cW3iSTgzN9vkbFnHI2LmvM4uVEv9XgMqyN0eS3FE0HU+MWJliymm7STh
# eh2ENH+kF3y0rH0/NVjLw78a3Z9UVm1F5VPziIorMaPKPlDRADTsJwjDZ8Zc6Gi/
# zy4WZbg8Zv87spWrmo2dzJTw7XhQf+xkR6OdMYICrjCCAqoCAQEwgYwweDELMAkG
# A1UEBhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMREwDwYD
# VQQKDAhTU0wgQ29ycDE0MDIGA1UEAwwrU1NMLmNvbSBDb2RlIFNpZ25pbmcgSW50
# ZXJtZWRpYXRlIENBIFJTQSBSMQIQV156WorWyKgnVBrnbADy+TAJBgUrDgMCGgUA
# oHgwGAYKKwYBBAGCNwIBDDEKMAigAoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYB
# BAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0B
# CQQxFgQUCPEH7LvJ5wwh/6mhZNT8xQsH6PgwDQYJKoZIhvcNAQEBBQAEggGAVw7s
# gFUVoclAvCVvAuMdIl6SmS0uir8vgV692iUj/BWaPWaA0/mvWnuGcKd2FL92qZ3Q
# QFEzbvqYoA1rWGmcNN+mc/HSmsIj64R2vMLHSPl95NyaAdkHoQ0RIwMA87X8sXme
# Ee3VMvqqZL60XahVAySgndsQNDvYC2xgB2UllhNGj+pLro8InYDSlET1DvQhX3Q9
# vsW+Vn/8VelFTRXkXwvdzItRJwqWt8xrGUMGhm4Byn5b/RR8YFFL+TsiR9OLSoR6
# eoT4m8dEl/VHudXj7xyyW962NdbO7M5/C3LIOBOGC2RSQF7E51Ue5LxdedWw45pK
# +acOZUnyhXVS1ddpKoaDtQ31/875kXnHP7XkeqlsspeZeyU7yN/R/BpKsFwivaNK
# ZIi5m1g/KMgpjVUeG1ap7//jSUaEsr1R9YnNgKnTIaZVF9FMUHDlwfnyXZ/A7Ro/
# ctgEsj0/YEeUJToP+82hNEpL8TRSrXpXae0GfbYoZjpm4s3mc6fwGi0DEJCq
# SIG # End signature block