Upload a generalized Windows VHD and use it to create new VMs in Azure

Applies to: ✔️ Windows VMs ✔️ Flexible scale sets

This article walks you through using PowerShell to upload a VHD of a generalized VM to Azure, create an image from the VHD, and create a new VM from that image. You can upload a VHD exported from an on-premises virtualization tool or from another cloud. Using Managed Disks for the new VM simplifies the VM management and provides better availability when the VM is placed in an availability set.

For a sample script, see Sample script to upload a VHD to Azure and create a new VM.

Before you begin

Generalize the source VM by using Sysprep

If you haven't already, you need to Sysprep the VM before uploading the VHD to Azure. Sysprep removes all your personal account information, among other things, and prepares the machine to be used as an image. For details about Sysprep, see the Sysprep Overview.

Make sure the server roles running on the machine are supported by Sysprep. For more information, see Sysprep Support for Server Roles.


If you plan to run Sysprep before uploading your VHD to Azure for the first time, make sure you have prepared your VM.

  1. Sign in to the Windows virtual machine.

  2. Open the Command Prompt window as an administrator.

  3. Delete the panther directory (C:\Windows\Panther).

  4. Change the directory to %windir%\system32\sysprep, and then run sysprep.exe.

  5. In the System Preparation Tool dialog box, select Enter System Out-of-Box Experience (OOBE), and make sure that the Generalize check box is enabled.

  6. For Shutdown Options, select Shutdown.

  7. Select OK.

    Start Sysprep

  8. When Sysprep finishes, it shuts down the virtual machine. Do not restart the VM.

Upload the VHD

You can now upload a VHD straight into a managed disk. For instructions, see Upload a VHD to Azure using Azure PowerShell.

Once the VHD is uploaded to the managed disk, you need to use Get-AzDisk to get the managed disk.

$disk = Get-AzDisk -ResourceGroupName 'myResourceGroup' -DiskName 'myDiskName'

Create the image

Create a managed image from your generalized OS managed disk. Replace the following values with your own information.

First, set some variables:

$location = 'East US'
$imageName = 'myImage'
$rgName = 'myResourceGroup'

Create the image using your managed disk.

$imageConfig = New-AzImageConfig `
   -Location $location
$imageConfig = Set-AzImageOsDisk `
   -Image $imageConfig `
   -OsState Generalized `
   -OsType Windows `
   -ManagedDiskId $disk.Id

Create the image.

$image = New-AzImage `
   -ImageName $imageName `
   -ResourceGroupName $rgName `
   -Image $imageConfig

Create the VM

Now that you have an image, you can create one or more new VMs from the image. This example creates a VM named myVM from myImage, in myResourceGroup.

New-AzVm `
    -ResourceGroupName $rgName `
    -Name "myVM" `
    -Image $image.Id `
    -Location $location `
    -VirtualNetworkName "myVnet" `
    -SubnetName "mySubnet" `
    -SecurityGroupName "myNSG" `
    -PublicIpAddressName "myPIP" 

Next steps

Sign in to your new virtual machine. For more information, see How to connect and log on to an Azure virtual machine running Windows.