question

KalaimaniThirupathi-5306 avatar image
0 Votes"
KalaimaniThirupathi-5306 asked SadiqhAhmed-MSFT edited

Get Azure virtual machine backup reports using Powershell

Hi All,

I'm using the below script to get the Azure virtual machine backup reports using Powershell. It's working for one subscription, but I need to generate the information for the multiple subscriptions.

 [CmdletBinding(SupportsShouldProcess=$True,
     ConfirmImpact='Medium',
     HelpURI='http://vcloud-lab.com',
     DefaultParameterSetName = 'AllVirtualMachines'
 )]
 Param
 ( 
     [parameter(Position=0, ParameterSetName = 'AllVMs' )]
     [Switch]$AllVirtualMachines,
     [parameter(Position=0, ValueFromPipeline=$True, ValueFromPipelineByPropertyName=$True, ParameterSetName = 'VM' )]
     [alias('Name')]
     [String[]]$VirtualMachineList
 ) #Param
 Begin 
 {
     #Collecing Azure virtual machines Information
     Write-Host "Collecing Azure virtual machine Information" -BackgroundColor DarkGreen
     if (($PSBoundParameters.ContainsKey('AllVirtualMachines')) -or ($PSBoundParameters.Count -eq 0))
     {
         $vms = Get-AzVM
     } #if ($PSBoundParameters.ContainsKey('AllVirtualMachines'))
     elseif ($PSBoundParameters.ContainsKey('VirtualMachineList'))
     {
         $vms = @()
         foreach ($vmname in $VirtualMachineList)
         {
             $vms += Get-AzVM -Name $vmname 
         } #foreach ($vmname in $VirtualMachineList)
     } #elseif ($PSBoundParameters.ContainsKey('VirtualMachineList'))
     #Collecing All Azure backup recovery vaults Information
     Write-Host "Collecting all Backup Recovery Vault information" -BackgroundColor DarkGreen
     $backupVaults = Get-AzRecoveryServicesVault
 } #Begin 
 Process
 {
     $vmBackupReport = [System.Collections.ArrayList]::new()
     foreach ($vm in $vms) 
     {
         $recoveryVaultInfo = Get-AzRecoveryServicesBackupStatus -Name $vm.Name -ResourceGroupName $vm.ResourceGroupName -Type 'AzureVM'
         if ($recoveryVaultInfo.BackedUp -eq $true)
         {
             Write-Host "$($vm.Name) - BackedUp : Yes"
             #Backup Recovery Vault Information
             $vmBackupVault = $backupVaults | Where-Object {$_.ID -eq $recoveryVaultInfo.VaultId}
             #Backup recovery Vault policy Information
             $container = Get-AzRecoveryServicesBackupContainer -ContainerType AzureVM -VaultId $vmBackupVault.ID -FriendlyName $vm.Name #-Status "Registered" 
             $backupItem = Get-AzRecoveryServicesBackupItem -Container $container -WorkloadType AzureVM -VaultId $vmBackupVault.ID
         } #if ($recoveryVaultInfo.BackedUp -eq $true)
         else 
         {
             Write-Host "$($vm.Name) - BackedUp : No" -BackgroundColor DarkRed
             $vmBackupVault = $null
             $container =  $null
             $backupItem =  $null
         } #else if ($recoveryVaultInfo.BackedUp -eq $true)
            
         [void]$vmBackupReport.Add([PSCustomObject]@{
             VM_Name = $vm.Name
             VM_Location = $vm.Location
             VM_ResourceGroupName = $vm.ResourceGroupName
             VM_BackedUp = $recoveryVaultInfo.BackedUp
             VM_RecoveryVaultName =  $vmBackupVault.Name
             VM_RecoveryVaultPolicy = $backupItem.ProtectionPolicyName
             VM_BackupHealthStatus = $backupItem.HealthStatus
             VM_BackupProtectionStatus = $backupItem.ProtectionStatus
             VM_LastBackupStatus = $backupItem.LastBackupStatus
             VM_LastBackupTime = $backupItem.LastBackupTime
             VM_BackupDeleteState = $backupItem.DeleteState
             VM_BackupLatestRecoveryPoint = $backupItem.LatestRecoveryPoint
             VM_Id = $vm.Id
             RecoveryVault_ResourceGroupName = $vmBackupVault.ResourceGroupName
             RecoveryVault_Location = $vmBackupVault.Location
             RecoveryVault_SubscriptionId = $vmBackupVault.ID
         }) #[void]$vmBackupReport.Add([PSCustomObject]@{
     } #foreach ($vm in $vms) 
 } #Process
 end
 {
     $vmBackupReport
 } #end
azure-backup
5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

KalaimaniThirupathi-5306 avatar image
0 Votes"
KalaimaniThirupathi-5306 answered

Thanks, Sathyamoorthy. I have developed other ways to save all detail in one CSV file

5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

SathyamoorthyVijayakumar-MSFT avatar image
0 Votes"
SathyamoorthyVijayakumar-MSFT answered

You are experiencing the behavior - the reason being - commandlet takes the default Subscription that is set in the PS Environment.

You are executing the script as .\<SCRIPTNAME>.ps1 (or <PATH>\<SCRIPTNAME>.PS1) .

Where the <SCRIPTNAME>.ps1 is sourced with above code.

To run for all Subscription, You could try the below:

 Get-AzSubscription | % {  Set-AzContext -Subscription $_.Id  ; Write-Host "Connected to the Subscription : " $_.Name -ForegroundColor Yellow ;.\<SCRIPTNAME>.ps1 | Export-Csv -Path $($_.Name.TrimEnd()+ ".csv") } 

Explanation :

We get the list of all subscription your logged in account is part of.

  • Iterate through each subscription

    • For each subscription - we run the <SCRIPTNAME>.ps1 and store it in a file with Subscription Name.



Output

116186-image.png



image.png (70.9 KiB)
5 |1600 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.