How to take VM snapshot

Rising Flight 6,116 Reputation points
2025-12-14T16:20:42.52+00:00

Hi All,

I have one Windows VM and one Linux VM. Both VMs have two disks each. I want to take snapshots of these VMs, and the required snapshot type is Full.

Details:

VM Name: WinAppVM01 OS: Windows Snapshot Type: Full

VM Name: LinuxAppVM01 OS: Linux Snapshot Type: Full

I have a PowerShell script to take VM snapshots.

  • Can I use the same script for both Windows and Linux VMs?
  • How do I explicitly specify Windows and Linux VMs in the script?
  • How can I ensure that the snapshot type is set to Full in the script?
$VmName = "WinAppVM01"
$VmResourceGroup = "Windows-ResourceGroup"
$vm = Get-AzVM -Name $VmName -ResourceGroupName $VmResourceGroup
$loc = $vm.Location
#VM Snapshot
Write-Output "VM $($vm.name) OS Disk Snapshot Begin"
$snapshotdisk = $vm.StorageProfile
$OSDiskSnapshotConfig = New-AzSnapshotConfig -SourceUri $snapshotdisk.OsDisk.ManagedDisk.id -CreateOption Copy -Location $loc -OsType Windows
$snapshotNameOS = "$($snapshotdisk.OsDisk.Name)_snapshot_$(Get-Date -Format MMddyyyy)"

# OS Disk Snapshot

try {
    New-AzSnapshot -ResourceGroupName $VmResourceGroup -SnapshotName $snapshotNameOS -Snapshot $OSDiskSnapshotConfig -ErrorAction Stop
} catch {
    $_
}
     
Write-Output "VM $($vm.name) OS Disk Snapshot End"

# Data Disk Snapshots 
 
Write-Output "VM $($vm.name) Data Disk Snapshots Begin"

$dataDisks = ($snapshotdisk.DataDisks).name

foreach ($datadisk in $datadisks) 
    {

    $dataDisk = Get-AzDisk -ResourceGroupName $vm.ResourceGroupName -DiskName $datadisk
    Write-Output "VM $($vm.name) data Disk $($datadisk.Name) Snapshot Begin"
    $DataDiskSnapshotConfig = New-AzSnapshotConfig -SourceUri $dataDisk.Id -CreateOption Copy -Location $loc
    $snapshotNameData = "$($datadisk.name)_snapshot_$(Get-Date -Format MMddyyyy)"

    New-AzSnapshot -ResourceGroupName $VmResourceGroup -SnapshotName $snapshotNameData -Snapshot $DataDiskSnapshotConfig -ErrorAction Stop
    Write-Output "VM $($vm.name) data Disk $($datadisk.Name) Snapshot End"   
    }

Write-Output "VM $($vm.name) Data Disk Snapshots End"  

Azure Virtual Machines
Azure Virtual Machines
An Azure service that is used to provision Windows and Linux virtual machines.
{count} votes

4 answers

Sort by: Most helpful
  1. Q&A Assist
    2025-12-14T16:20:58.59+00:00
    AI generated content. This question contains an answer created with AI from Q&A Assist. Learn more

    You can use the same PowerShell script to take snapshots of both Windows and Linux VMs, but you will need to make some modifications to explicitly specify the OS type and ensure the snapshot type is set to Full.

    Modifications Needed:

    1. Specify OS Type: You can determine the OS type of the VM and set the -OsType parameter accordingly when creating the snapshot configuration. You can do this by checking the OS type of the VM before taking the snapshot.
    2. Ensure Full Snapshot: The -CreateOption parameter in the New-AzSnapshotConfig cmdlet should be set to Copy, which you are already doing. This will create a full snapshot of the disk.

    Example Script Modification:

    Here’s how you might modify your script to handle both types of VMs:

    # Define VM details
    $VmNames = @(
        @{ Name = "WinAppVM01"; ResourceGroup = "Windows-ResourceGroup"; OsType = "Windows" },
        @{ Name = "LinuxAppVM01"; ResourceGroup = "Linux-ResourceGroup"; OsType = "Linux" }
    )
    
    foreach ($vmDetails in $VmNames) {
        $vm = Get-AzVM -Name $vmDetails.Name -ResourceGroupName $vmDetails.ResourceGroup
        $loc = $vm.Location
        Write-Output "VM $($vm.name) OS Disk Snapshot Begin"
        $snapshotdisk = $vm.StorageProfile
        $OSDiskSnapshotConfig = New-AzSnapshotConfig -SourceUri $snapshotdisk.OsDisk.ManagedDisk.id -CreateOption Copy -Location $loc -OsType $vmDetails.OsType
        $snapshotNameOS = "$($snapshotdisk.OsDisk.Name)_snapshot_$(Get-Date -Format MMddyyyy)"
    
        # OS Disk Snapshot
        try {
            New-AzSnapshot -ResourceGroupName $vmDetails.ResourceGroup -SnapshotName $snapshotNameOS -Snapshot $OSDiskSnapshotConfig -ErrorAction Stop
        } catch {
            $_
        }
        Write-Output "VM $($vm.name) OS Disk Snapshot End"
    
        # Data Disk Snapshots
        Write-Output "VM $($vm.name) Data Disk Snapshots Begin"
        $dataDisks = ($snapshotdisk.DataDisks).name
    
        foreach ($datadisk in $dataDisks) {
            $dataDisk = Get-AzDisk -ResourceGroupName $vm.ResourceGroupName -DiskName $datadisk
            Write-Output "VM $($vm.name) data Disk $($datadisk.Name) Snapshot Begin"
            $DataDiskSnapshotConfig = New-AzSnapshotConfig -SourceUri $dataDisk.Id -CreateOption Copy -Location $loc
            $snapshotNameData = "$($datadisk.name)_snapshot_$(Get-Date -Format MMddyyyy)"
    
            New-AzSnapshot -ResourceGroupName $vmDetails.ResourceGroup -SnapshotName $snapshotNameData -Snapshot $DataDiskSnapshotConfig -ErrorAction Stop
            Write-Output "VM $($vm.name) data Disk $($datadisk.Name) Snapshot End"
        }
        Write-Output "VM $($vm.name) Data Disk Snapshots End"
    }
    

    In this modified script, you loop through an array of VM details, allowing you to handle both Windows and Linux VMs accordingly. The -OsType parameter is set based on the VM's OS type, ensuring the correct configuration for each VM.


    References:

    0 comments No comments

  2. Rising Flight 6,116 Reputation points
    2025-12-14T16:45:58.11+00:00

    can anyone validate this, based on AI assist i have modified.

    Windows VM
    
    $VMName        = "WinAppVM01"
    $ResourceGroup = "Windows-ResourceGroup"
    
    $vm = Get-AzVM -Name $VMName -ResourceGroupName $ResourceGroup
    $location = $vm.Location
    $storageProfile = $vm.StorageProfile
    
    Write-Output "Starting FULL snapshot for Windows VM: $VMName"
    
    # -------- OS Disk Snapshot --------
    $osSnapshotConfig = New-AzSnapshotConfig `
        -SourceUri $storageProfile.OsDisk.ManagedDisk.Id `
        -CreateOption Copy `
        -Location $location `
        -OsType Windows
    
    $osSnapshotName = "$($storageProfile.OsDisk.Name)_FullSnapshot_$(Get-Date -Format 'MMMddyyyy')"
    
    New-AzSnapshot `
        -ResourceGroupName $ResourceGroup `
        -SnapshotName $osSnapshotName `
        -Snapshot $osSnapshotConfig
    
    Write-Output "OS disk snapshot completed"
    
    # -------- Data Disk Snapshots --------
    foreach ($dataDisk in $storageProfile.DataDisks) {
    
        Write-Output "Taking snapshot of data disk: $($dataDisk.Name)"
    
        $disk = Get-AzDisk -ResourceGroupName $ResourceGroup -DiskName $dataDisk.Name
    
        $dataSnapshotConfig = New-AzSnapshotConfig `
            -SourceUri $disk.Id `
            -CreateOption Copy `
            -Location $location
    
        $dataSnapshotName = "$($dataDisk.Name)_FullSnapshot_$(Get-Date -Format 'MMMddyyyy')"
    
        New-AzSnapshot `
            -ResourceGroupName $ResourceGroup `
            -SnapshotName $dataSnapshotName `
            -Snapshot $dataSnapshotConfig
    }
    
    Write-Output "FULL snapshot completed for Windows VM: $VMName"
    
    
    
    Linux VM
    
    $VMName        = "LinuxAppVM01"
    $ResourceGroup = "Linux-ResourceGroup"
    
    $vm = Get-AzVM -Name $VMName -ResourceGroupName $ResourceGroup
    $location = $vm.Location
    $storageProfile = $vm.StorageProfile
    
    Write-Output "Starting FULL snapshot for Linux VM: $VMName"
    
    # -------- OS Disk Snapshot --------
    $osSnapshotConfig = New-AzSnapshotConfig `
        -SourceUri $storageProfile.OsDisk.ManagedDisk.Id `
        -CreateOption Copy `
        -Location $location `
        -OsType Linux
    
    $osSnapshotName = "$($storageProfile.OsDisk.Name)_FullSnapshot_$(Get-Date -Format 'MMMddyyyy')"
    
    New-AzSnapshot `
        -ResourceGroupName $ResourceGroup `
        -SnapshotName $osSnapshotName `
        -Snapshot $osSnapshotConfig
    
    Write-Output "OS disk snapshot completed"
    
    # -------- Data Disk Snapshots --------
    foreach ($dataDisk in $storageProfile.DataDisks) {
    
        Write-Output "Taking snapshot of data disk: $($dataDisk.Name)"
    
        $disk = Get-AzDisk -ResourceGroupName $ResourceGroup -DiskName $dataDisk.Name
    
        $dataSnapshotConfig = New-AzSnapshotConfig `
            -SourceUri $disk.Id `
            -CreateOption Copy `
            -Location $location
    
        $dataSnapshotName = "$($dataDisk.Name)_FullSnapshot_$(Get-Date -Format 'MMMddyyyy')"
    
        New-AzSnapshot `
            -ResourceGroupName $ResourceGroup `
            -SnapshotName $dataSnapshotName `
            -Snapshot $dataSnapshotConfig
    }
    
    Write-Output "FULL snapshot completed for Linux VM: $VMName"
    
    
    0 comments No comments

  3. Manish Deshpande 1,330 Reputation points Microsoft External Staff Moderator
    2025-12-14T17:57:00.9766667+00:00

    Hello @Rising Flight

    It sounds like you’re looking to take snapshots of both your Windows and Linux VMs using PowerShell and want to know if the same script can be used for both, as well as how to ensure the snapshot type is set to Full. Here’s how you can go about it.

    Windows VM Script

    
    # ===========================
    # FULL snapshots for Windows VM (OS + Data Disks)
    # VM: WinAppVM01 | RG: Windows-ResourceGroup
    # ===========================
    
    param(
        [string]$VMName        = "WinAppVM01",
        [string]$ResourceGroup = "Windows-ResourceGroup",
        [string]$SnapshotSku   = "Standard_LRS"   # Standard_LRS | Premium_LRS | Standard_ZRS
    )
    
    function Get-Stamp { Get-Date -Format 'yyyyMMdd-HHmm' }
    
    try {
        $vm = Get-AzVM -Name $VMName -ResourceGroupName $ResourceGroup -ErrorAction Stop
    } catch {
        Write-Error "Failed to retrieve VM '$VMName' in RG '$ResourceGroup'. $_"
        return
    }
    
    $location = $vm.Location
    Write-Output "Starting FULL snapshot for Windows VM: $VMName ($location)"
    
    # -------- OS Disk (FULL) --------
    try {
        $osDiskName = $vm.StorageProfile.OsDisk.Name
        $osDiskObj  = Get-AzDisk -ResourceGroupName $ResourceGroup -DiskName $osDiskName -ErrorAction Stop
    
        $osSnapConfig = New-AzSnapshotConfig `
            -SourceUri   $vm.StorageProfile.OsDisk.ManagedDisk.Id `
            -CreateOption Copy `
            -Location    $location `
            -OsType      Windows `
            -SkuName     $SnapshotSku
    
        $osSnapName = "{0}_FullSnapshot_{1}" -f $osDiskName, (Get-Stamp)
    
        Write-Output "OS disk snapshot begin: $osSnapName"
        New-AzSnapshot -ResourceGroupName $osDiskObj.ResourceGroupName -SnapshotName $osSnapName -Snapshot $osSnapConfig -ErrorAction Stop
        Write-Output "OS disk snapshot end:   $osSnapName"
    } catch {
        Write-Error "OS disk snapshot failed for VM '$VMName'. $_"
    }
    
    # -------- Data Disks (FULL) --------
    if ($vm.StorageProfile.DataDisks.Count -gt 0) {
        Write-Output "Data disk snapshots begin"
        foreach ($data in $vm.StorageProfile.DataDisks) {
            try {
                $dataDiskObj = Get-AzDisk -ResourceGroupName $ResourceGroup -DiskName $data.Name -ErrorAction Stop
    
                $dataSnapConfig = New-AzSnapshotConfig `
                    -SourceUri   $dataDiskObj.Id `
                    -CreateOption Copy `
                    -Location    $location `
                    -SkuName     $SnapshotSku
    
                $dataSnapName = "{0}_FullSnapshot_{1}" -f $data.Name, (Get-Stamp)
    
                Write-Output "Data disk snapshot begin: $dataSnapName"
                New-AzSnapshot -ResourceGroupName $dataDiskObj.ResourceGroupName -SnapshotName $dataSnapName -Snapshot $dataSnapConfig -ErrorAction Stop
                Write-Output "Data disk snapshot end:   $dataSnapName"
            } catch {
                Write-Error "Data disk snapshot failed for disk '$($data.Name)'. $_"
            }
        }
        Write-Output "Data disk snapshots end"
    } else {
        Write-Output "No data disks attached to VM '$VMName'."
    }
    
    Write-Output "FULL snapshot completed for Windows VM
    
    

    Linux VM

    
    # ===========================
    # FULL snapshots for Linux VM (OS + Data Disks)
    # VM: LinuxAppVM01 | RG: Linux-ResourceGroup
    # ===========================
    
    param(
        [string]$VMName        = "LinuxAppVM01",
        [string]$ResourceGroup = "Linux-ResourceGroup",
        [string]$SnapshotSku   = "Standard_LRS"   # Standard_LRS | Premium_LRS | Standard_ZRS
    )
    
    function Get-Stamp { Get-Date -Format 'yyyyMMdd-HHmm' }
    
    try {
        $vm = Get-AzVM -Name $VMName -ResourceGroupName $ResourceGroup -ErrorAction Stop
    } catch {
        Write-Error "Failed to retrieve VM '$VMName' in RG '$ResourceGroup'. $_"
        return
    }
    
    $location = $vm.Location
    Write-Output "Starting FULL snapshot for Linux VM: $VMName ($location)"
    
    # -------- OS Disk (FULL) --------
    try {
        $osDiskName = $vm.StorageProfile.OsDisk.Name
        $osDiskObj  = Get-AzDisk -ResourceGroupName $ResourceGroup -DiskName $osDiskName -ErrorAction Stop
    
        $osSnapConfig = New-AzSnapshotConfig `
            -SourceUri   $vm.StorageProfile.OsDisk.ManagedDisk.Id `
            -CreateOption Copy `
            -Location    $location `
            -OsType      Linux `
            -SkuName     $SnapshotSku
    
        $osSnapName = "{0}_FullSnapshot_{1}" -f $osDiskName, (Get-Stamp)
    
        Write-Output "OS disk snapshot begin: $osSnapName"
        New-AzSnapshot -ResourceGroupName $osDiskObj.ResourceGroupName -SnapshotName $osSnapName -Snapshot $osSnapConfig -ErrorAction Stop
        Write-Output "OS disk snapshot end:   $osSnapName"
    } catch {
        Write-Error "OS disk snapshot failed for VM '$VMName'. $_"
    }
    
    # -------- Data Disks (FULL) --------
    if ($vm.StorageProfile.DataDisks.Count -gt 0) {
        Write-Output "Data disk snapshots begin"
        foreach ($data in $vm.StorageProfile.DataDisks) {
            try {
                $dataDiskObj = Get-AzDisk -ResourceGroupName $ResourceGroup -DiskName $data.Name -ErrorAction Stop
    
                $dataSnapConfig = New-AzSnapshotConfig `
                    -SourceUri   $dataDiskObj.Id `
                    -CreateOption Copy `
                    -Location    $location `
                    -SkuName     $SnapshotSku
    
                $dataSnapName = "{0}_FullSnapshot_{1}" -f $data.Name, (Get-Stamp)
    
                Write-Output "Data disk snapshot begin: $dataSnapName"
                New-AzSnapshot -ResourceGroupName $dataDiskObj.ResourceGroupName -SnapshotName $dataSnapName -Snapshot $dataSnapConfig -ErrorAction Stop
                Write-Output "Data disk snapshot end:   $dataSnapName"
            } catch {
                Write-Error "Data disk snapshot failed for disk '$($data.Name)'. $_"
            }
        }
        Write-Output "Data disk snapshots end"
    } else {
        Write-Output "No data disks attached to VM '$VMName'."
    }
    
    Write-Output "FULL snapshot completed for Linux VM:
    ```Thanks,  
    Manish Deshpande.
    
    
    0 comments No comments

  4. Rising Flight 6,116 Reputation points
    2025-12-15T13:38:33.84+00:00

    Can any one validate i have modified the scripts

    # ============================================================
    # FULL Snapshot Script – Windows VM (OS + Data Disks)
    # ============================================================
    
    param(
        [string]$VMName        = "WinAppVM01",
        [string]$ResourceGroup = "Windows-ResourceGroup",
        [string]$SnapshotSku   = "Premium_LRS"   # Standard_LRS | Premium_LRS | Standard_ZRS
    )
    
    # ----------------- Date Stamp (Date + Time) -----------------
    function Get-Stamp {
        (Get-Date).ToString("MMMddyyyy-HHmm",[System.Globalization.CultureInfo]::InvariantCulture)
    }
    
    # ----------------- Get VM -----------------
    try {
        $vm = Get-AzVM -Name $VMName -ResourceGroupName $ResourceGroup -ErrorAction Stop
    } catch {
        Write-Error "Unable to retrieve VM '$VMName' in RG '$ResourceGroup'. $_"
        return
    }
    
    $location  = $vm.Location
    $timeStamp = Get-Stamp
    
    Write-Output "==============================================="
    Write-Output "Starting FULL snapshot for Windows VM"
    Write-Output "VM Name   : $VMName"
    Write-Output "Location  : $location"
    Write-Output "Date Tag  : $timeStamp"
    Write-Output "==============================================="
    
    # ----------------- OS Disk Snapshot -----------------
    try {
        $osDiskId = $vm.StorageProfile.OsDisk.ManagedDisk.Id
    
        $osSnapConfig = New-AzSnapshotConfig `
            -SourceUri   $osDiskId `
            -CreateOption Copy `
            -Location    $location `
            -OsType      Windows `
            -SkuName     $SnapshotSku
    
        $osSnapName = "${VMName}_OS_Full_$timeStamp"
    
        Write-Output "OS disk snapshot started : $osSnapName"
        New-AzSnapshot -ResourceGroupName $ResourceGroup `
                       -SnapshotName $osSnapName `
                       -Snapshot $osSnapConfig `
                       -ErrorAction Stop
        Write-Output "OS disk snapshot completed: $osSnapName"
    } catch {
        Write-Error "OS disk snapshot failed for VM '$VMName'. $_"
    }
    
    # ----------------- Data Disk Snapshots -----------------
    $dataDisks = $vm.StorageProfile.DataDisks
    
    if ($null -ne $dataDisks -and $dataDisks.Count -gt 0) {
    
        Write-Output "Data disk snapshots started"
    
        foreach ($disk in $dataDisks) {
            try {
                $lun = $disk.Lun
    
                $dataSnapConfig = New-AzSnapshotConfig `
                    -SourceUri   $disk.ManagedDisk.Id `
                    -CreateOption Copy `
                    -Location    $location `
                    -SkuName     $SnapshotSku
    
                $dataSnapName = "${VMName}_DATA_LUN$lun`_Full_$timeStamp"
    
                Write-Output "Data disk snapshot started : $dataSnapName"
                New-AzSnapshot -ResourceGroupName $ResourceGroup `
                               -SnapshotName $dataSnapName `
                               -Snapshot $dataSnapConfig `
                               -ErrorAction Stop
                Write-Output "Data disk snapshot completed: $dataSnapName"
            } catch {
                Write-Warning "Skipping data disk '$($disk.Name)': $_"
            }
        }
    
        Write-Output "Data disk snapshots completed"
    }
    else {
        Write-Output "No data disks attached to VM '$VMName'. Skipping data disk snapshots."
    }
    
    Write-Output "==============================================="
    Write-Output "FULL snapshot completed successfully for VM: $VMName"
    Write-Output "==============================================="
    
    
    
    # ============================================================
    # FULL Snapshot Script – Linux VM (OS + Data Disks)
    # ============================================================
    
    param(
        [string]$VMName        = "LinuxAppVM01",
        [string]$ResourceGroup = "Linux-ResourceGroup",
        [string]$SnapshotSku   = "Premium_LRS"   # Standard_LRS | Premium_LRS | Standard_ZRS
    )
    
    # ----------------- Date Stamp (Date + Time) -----------------
    function Get-Stamp {
        (Get-Date).ToString("MMMddyyyy-HHmm",[System.Globalization.CultureInfo]::InvariantCulture)
    }
    
    # ----------------- Get VM -----------------
    try {
        $vm = Get-AzVM -Name $VMName -ResourceGroupName $ResourceGroup -ErrorAction Stop
    } catch {
        Write-Error "Unable to retrieve VM '$VMName' in RG '$ResourceGroup'. $_"
        return
    }
    
    $location  = $vm.Location
    $timeStamp = Get-Stamp
    
    Write-Output "==============================================="
    Write-Output "Starting FULL snapshot for Linux VM"
    Write-Output "VM Name   : $VMName"
    Write-Output "Location  : $location"
    Write-Output "Date Tag  : $timeStamp"
    Write-Output "==============================================="
    
    # ----------------- OS Disk Snapshot -----------------
    try {
        $osDiskId = $vm.StorageProfile.OsDisk.ManagedDisk.Id
    
        $osSnapConfig = New-AzSnapshotConfig `
            -SourceUri   $osDiskId `
            -CreateOption Copy `
            -Location    $location `
            -OsType      Linux `
            -SkuName     $SnapshotSku
    
        $osSnapName = "${VMName}_OS_Full_$timeStamp"
    
        Write-Output "OS disk snapshot started : $osSnapName"
        New-AzSnapshot -ResourceGroupName $ResourceGroup `
                       -SnapshotName $osSnapName `
                       -Snapshot $osSnapConfig `
                       -ErrorAction Stop
        Write-Output "OS disk snapshot completed: $osSnapName"
    } catch {
        Write-Error "OS disk snapshot failed for VM '$VMName'. $_"
    }
    
    # ----------------- Data Disk Snapshots -----------------
    $dataDisks = $vm.StorageProfile.DataDisks
    
    if ($null -ne $dataDisks -and $dataDisks.Count -gt 0) {
    
        Write-Output "Data disk snapshots started"
    
        foreach ($disk in $dataDisks) {
            try {
                # Explicit LUN capture to avoid name collision
                $lun = $disk.Lun
    
                $dataSnapConfig = New-AzSnapshotConfig `
                    -SourceUri   $disk.ManagedDisk.Id `
                    -CreateOption Copy `
                    -Location    $location `
                    -SkuName     $SnapshotSku
    
                $dataSnapName = "${VMName}_DATA_LUN$lun`_Full_$timeStamp"
    
                Write-Output "Data disk snapshot started : $dataSnapName"
                New-AzSnapshot -ResourceGroupName $ResourceGroup `
                               -SnapshotName $dataSnapName `
                               -Snapshot $dataSnapConfig `
                               -ErrorAction Stop
                Write-Output "Data disk snapshot completed: $dataSnapName"
            } catch {
                Write-Warning "Skipping data disk '$($disk.Name)': $_"
            }
        }
    
        Write-Output "Data disk snapshots completed"
    }
    else {
        Write-Output "No data disks attached to VM '$VMName'. Skipping data disk snapshots."
    }
    
    Write-Output "==============================================="
    Write-Output "FULL snapshot completed successfully for Linux VM: $VMName"
    Write-Output "==============================================="
    
    
    0 comments No comments

Your answer

Answers can be marked as 'Accepted' by the question author and 'Recommended' by moderators, which helps users know the answer solved the author's problem.