Overview
You may wish to use PowerShell Modules in Pia when creating a PowerShell activity in your pia tenant. Pia does not currently install any PowerShell modules by default (although this may change in the future). The below script provided allows you to set this up yourself.
This script consists of a single inline powershell activity which will check if the desired module(s) are installed or not. If not installed, the modules will be installed for you. The script below has been configured to run once per day as your Pia tenant may be occasionally refreshed, causing the modules to be lost.
The Scriptβ
# Orchestrator package
conditions:
- name: 'schedule'
cron: '0 0 2 * * *' # Run once per day at 2am
steps:
- task: inline_powershell
inputs:
script: |
$PSGallery = Set-PackageSource -Name PSGallery -Trusted:$true -Force -Confirm:$false
[string]$PSGet = $(Get-InstalledModule -Name 'PowerShellGet' -AllVersions -ea SilentlyContinue | Sort -Property PublishedDate -Descending | Select -First 1).Version
Write-Host "PSGallery Version: $PSGet"
if($null -ne $PSGet -or $PSGet -lt '2.2.5'){
Write-Host "Installing PowerShellGet Version 2.2.5"
$InstallPSGet = Install-Module -Name 'PowerShellGet' -MinimumVersion '2.2.5' -Scope AllUsers -AllowClobber -Force -Confirm:$false
}
Write-Host "PSGallery Source is trusted: $($PSGallery.IsTrusted)"
$modules = @()
$modules += [pscustomobject]@{Name = 'MicrosoftTeams'; RequiredVersion= '5.1.0'}
$modules += [pscustomobject]@{Name = 'Microsoft.Graph'; RequiredVersion= '1.25.0'}
$modules += [pscustomobject]@{Name = 'ExchangeOnlineManagement'; RequiredVersion= '3.1.0'}
$modules += [pscustomobject]@{Name = 'PnP.PowerShell'; RequiredVersion= '1.12.0'}
$modules += [pscustomobject]@{Name = "Az.Accounts"; RequiredVersion= "2.12.1"} # To mitigate issue with AccessToken Auth we need this version
$modules += [pscustomobject]@{Name = "Az.Advisor"; RequiredVersion= "2.0.0"}
$modules += [pscustomobject]@{Name = "Az.Aks"; RequiredVersion= "5.5.1"}
$modules += [pscustomobject]@{Name = "Az.AnalysisServices"; RequiredVersion= "1.1.4"}
$modules += [pscustomobject]@{Name = "Az.ApiManagement"; RequiredVersion= "4.0.2"}
$modules += [pscustomobject]@{Name = "Az.AppConfiguration"; RequiredVersion= "1.2.0"}
$modules += [pscustomobject]@{Name = "Az.ApplicationInsights"; RequiredVersion= "2.2.2"}
$modules += [pscustomobject]@{Name = "Az.Attestation"; RequiredVersion= "2.0.0"}
$modules += [pscustomobject]@{Name = "Az.Automanage"; RequiredVersion= "1.0.0"}
$modules += [pscustomobject]@{Name = "Az.Automation"; RequiredVersion= "1.9.1"}
$modules += [pscustomobject]@{Name = "Az.Batch"; RequiredVersion= "3.4.0"}
$modules += [pscustomobject]@{Name = "Az.Billing"; RequiredVersion= "2.0.3"}
$modules += [pscustomobject]@{Name = "Az.Cdn"; RequiredVersion= "3.1.0"}
$modules += [pscustomobject]@{Name = "Az.CloudService"; RequiredVersion= "1.2.0"}
$modules += [pscustomobject]@{Name = "Az.CognitiveServices"; RequiredVersion= "1.14.0"}
$modules += [pscustomobject]@{Name = "Az.Compute"; RequiredVersion= "6.1.0"}
$modules += [pscustomobject]@{Name = "Az.ConfidentialLedger"; RequiredVersion= "1.0.0"}
$modules += [pscustomobject]@{Name = "Az.ContainerInstance"; RequiredVersion= "3.2.0"}
$modules += [pscustomobject]@{Name = "Az.ContainerRegistry"; RequiredVersion= "4.0.0"}
$modules += [pscustomobject]@{Name = "Az.CosmosDB"; RequiredVersion= "1.11.1"}
$modules += [pscustomobject]@{Name = "Az.DataBoxEdge"; RequiredVersion= "1.1.0"}
$modules += [pscustomobject]@{Name = "Az.Databricks"; RequiredVersion= "1.6.0"}
$modules += [pscustomobject]@{Name = "Az.DataFactory"; RequiredVersion= "1.16.13"}
$modules += [pscustomobject]@{Name = "Az.DataLakeAnalytics"; RequiredVersion= "1.0.2"}
$modules += [pscustomobject]@{Name = "Az.DataLakeStore"; RequiredVersion= "1.3.0"}
$modules += [pscustomobject]@{Name = "Az.DataProtection"; RequiredVersion= "2.0.0"}
$modules += [pscustomobject]@{Name = "Az.DataShare"; RequiredVersion= "1.0.1"}
$modules += [pscustomobject]@{Name = "Az.DeploymentManager"; RequiredVersion= "1.1.0"}
$modules += [pscustomobject]@{Name = "Az.DesktopVirtualization"; RequiredVersion= "4.0.0"}
$modules += [pscustomobject]@{Name = "Az.DevTestLabs"; RequiredVersion= "1.0.2"}
$modules += [pscustomobject]@{Name = "Az.Dns"; RequiredVersion= "1.1.2"}
$modules += [pscustomobject]@{Name = "Az.EventGrid"; RequiredVersion= "1.6.0"}
$modules += [pscustomobject]@{Name = "Az.EventHub"; RequiredVersion= "4.0.0"}
$modules += [pscustomobject]@{Name = "Az.FrontDoor"; RequiredVersion= "1.10.0"}
$modules += [pscustomobject]@{Name = "Az.Functions"; RequiredVersion= "4.0.6"}
$modules += [pscustomobject]@{Name = "Az.HDInsight"; RequiredVersion= "6.0.0"}
$modules += [pscustomobject]@{Name = "Az.HealthcareApis"; RequiredVersion= "2.0.0"}
$modules += [pscustomobject]@{Name = "Az.IotHub"; RequiredVersion= "2.7.5"}
$modules += [pscustomobject]@{Name = "Az.KeyVault"; RequiredVersion= "4.10.0"}
$modules += [pscustomobject]@{Name = "Az.Kusto"; RequiredVersion= "2.2.0"}
$modules += [pscustomobject]@{Name = "Az.LoadTesting"; RequiredVersion= "1.0.0"}
$modules += [pscustomobject]@{Name = "Az.LogicApp"; RequiredVersion= "1.5.0"}
$modules += [pscustomobject]@{Name = "Az.MachineLearning"; RequiredVersion= "1.1.3"}
$modules += [pscustomobject]@{Name = "Az.MachineLearningServices"; RequiredVersion= "1.0.0"}
$modules += [pscustomobject]@{Name = "Az.Maintenance"; RequiredVersion= "1.2.1"}
$modules += [pscustomobject]@{Name = "Az.ManagedServiceIdentity"; RequiredVersion= "1.1.1"}
$modules += [pscustomobject]@{Name = "Az.ManagedServices"; RequiredVersion= "3.0.0"}
$modules += [pscustomobject]@{Name = "Az.MarketplaceOrdering"; RequiredVersion= "2.0.0"}
$modules += [pscustomobject]@{Name = "Az.Media"; RequiredVersion= "1.1.1"}
$modules += [pscustomobject]@{Name = "Az.Migrate"; RequiredVersion= "2.2.0"}
$modules += [pscustomobject]@{Name = "Az.Monitor"; RequiredVersion= "4.5.0"}
$modules += [pscustomobject]@{Name = "Az.MySql"; RequiredVersion= "1.1.1"}
$modules += [pscustomobject]@{Name = "Az.Network"; RequiredVersion= "6.1.0"}
$modules += [pscustomobject]@{Name = "Az.NotificationHubs"; RequiredVersion= "1.1.1"}
$modules += [pscustomobject]@{Name = "Az.OperationalInsights"; RequiredVersion= "3.2.0"}
$modules += [pscustomobject]@{Name = "Az.PolicyInsights"; RequiredVersion= "1.6.1"}
$modules += [pscustomobject]@{Name = "Az.PostgreSql"; RequiredVersion= "1.1.0"}
$modules += [pscustomobject]@{Name = "Az.PowerBIEmbedded"; RequiredVersion= "1.2.1"}
$modules += [pscustomobject]@{Name = "Az.PrivateDns"; RequiredVersion= "1.0.3"}
$modules += [pscustomobject]@{Name = "Az.RecoveryServices"; RequiredVersion= "6.5.0"}
$modules += [pscustomobject]@{Name = "Az.RedisCache"; RequiredVersion= "1.8.0"}
$modules += [pscustomobject]@{Name = "Az.RedisEnterpriseCache"; RequiredVersion= "1.2.0"}
$modules += [pscustomobject]@{Name = "Az.Relay"; RequiredVersion= "2.0.0"}
$modules += [pscustomobject]@{Name = "Az.ResourceMover"; RequiredVersion= "1.1.0"}
$modules += [pscustomobject]@{Name = "Az.Resources"; RequiredVersion= "6.8.0"}
$modules += [pscustomobject]@{Name = "Az.Security"; RequiredVersion= "1.4.0"}
$modules += [pscustomobject]@{Name = "Az.SecurityInsights"; RequiredVersion= "3.0.1"}
$modules += [pscustomobject]@{Name = "Az.ServiceBus"; RequiredVersion= "3.0.0"}
$modules += [pscustomobject]@{Name = "Az.ServiceFabric"; RequiredVersion= "3.2.0"}
$modules += [pscustomobject]@{Name = "Az.SignalR"; RequiredVersion= "2.0.0"}
$modules += [pscustomobject]@{Name = "Az.Sql"; RequiredVersion= "4.8.0"}
$modules += [pscustomobject]@{Name = "Az.SqlVirtualMachine"; RequiredVersion= "2.0.0"}
$modules += [pscustomobject]@{Name = "Az.StackHCI"; RequiredVersion= "2.0.0"}
$modules += [pscustomobject]@{Name = "Az.Storage"; RequiredVersion= "5.8.0"}
$modules += [pscustomobject]@{Name = "Az.StorageMover"; RequiredVersion= "1.0.1"}
$modules += [pscustomobject]@{Name = "Az.StorageSync"; RequiredVersion= "2.0.0"}
$modules += [pscustomobject]@{Name = "Az.StreamAnalytics"; RequiredVersion= "2.0.0"}
$modules += [pscustomobject]@{Name = "Az.Support"; RequiredVersion= "1.0.0"}
$modules += [pscustomobject]@{Name = "Az.Synapse"; RequiredVersion= "3.0.1"}
$modules += [pscustomobject]@{Name = "Az.TrafficManager"; RequiredVersion= "1.2.1"}
$modules += [pscustomobject]@{Name = "Az.Websites"; RequiredVersion= "3.0.1"}
## Filter out Modules that are already installed with RequiredVersion
$toBeInstalled = @()
[Array]$InstalledModules = Get-InstalledModule
$modules.ForEach({
$mod = $_
$insMod = $InstalledModules | Where {$_.Name -eq $mod.Name}
if($null -eq $insMod){
$toBeInstalled += $mod
}
elseif("$($mod.RequiredVersion)" -ne "$($insMod.Version)" -and $null -ne $insMod){
$mod | Add-Member -Name CurrentVersion -MemberType NoteProperty -Value "$($insMod.Version)"
$toBeInstalled += $mod
}
})
if($toBeInstalled.Count -gt 0){
Write-Host "The following Modules will be modified"
Write-Host $(ConvertTo-Json $toBeInstalled)
foreach($mod in $toBeInstalled){
$Version = (Get-InstalledModule -Name $mod.Name -ea SilentlyContinue | Sort-Object -Property Version | Select -First 1).Version
if($null -ne $Version -and $Version -eq $mod.RequiredVersion){
Write-Host "$($mod.Name) is installed with version $($Version)"
}
elseif($Version -ne $null -and $Version -ne $mod.RequiredVersion){
Write-Host "Module $($mod.Name) Version $($Version) does not meet Required version of $($mod.RequiredVersion). Uninstalling..."
$Remove = Uninstall-Module -Name $mod.Name -AllVersions -Force -Confirm:$false
Start-Sleep -Seconds 5
Write-Host "Installing $($mod.Name) Version $($mod.RequiredVersion)"
Install-Module -Name $mod.Name -RequiredVersion $mod.RequiredVersion -Scope AllUsers -AllowClobber -Force -Confirm:$false
}
else{
Write-Host "Module $($mod.Name) Version $($mod.RequiredVersion) is being installed"
Install-Module -Name $mod.Name -RequiredVersion $mod.RequiredVersion -Scope AllUsers -AllowClobber -Force -Confirm:$false
}
}
}
Write-Host "Done."
## Screenshots!
1. The screenshot below shows the script as created in a test sandbox. When you copy the script into your tenant, you can use the "execute" button to run the script as a once off. Publish it to live if you want the schedule to run (schedules to not run for packages which are in a sandbox).

2. The screenshot below shows the package output in live packages view. This means the desired modules have been installed and are ready to go!
