What Are User Profile Disks?

User Profile Disks (UPDs) are a feature of Windows Server Remote Desktop Services (RDS). Instead of roaming profiles or folder redirection, each user gets a dedicated virtual hard disk — a .vhdx file — stored on a network share. When the user logs in to an RDS session host, Windows mounts that VHDX and maps it to their profile path (C:\Users\username).

This approach keeps user data contained and portable across session hosts in a collection, but it does mean each disk has a fixed maximum size. When users fill their disk, they typically see errors like "There is not enough space on the disk" or their session behaves strangely on login.

ℹ️UPDs are configured per-RD Session Host Collection. The default size is often 10 GB or 20 GB. You can change the default for new users in the collection properties, but existing UPD files must be resized manually.

Finding Where UPD Files Are Stored

UPD files are stored on a UNC path you configured when setting up the RD Session Host Collection. To find the path:

  1. Open Server Manager on your RD Connection Broker or Session Host.
  2. Navigate to Remote Desktop Services → Collections → [Your Collection].
  3. Click Tasks → Edit Properties, then go to the User Profile Disks tab.
  4. The UPD storage location is shown (e.g., \\FileServer\UPDs\).

Alternatively, query it from PowerShell on the Connection Broker:

Get-RDSessionCollectionConfiguration -CollectionName "YourCollectionName" | Select-Object -ExpandProperty CustomRdpProperty

The VHDX files are named using the user's Security Identifier (SID), for example UVHD-S-1-5-21-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-1234.vhdx. To find a specific user's file, you need their SID — covered in our companion article on using the Registry to find UPD files.

Before You Resize: Log the User Off

A UPD file is mounted exclusively while the user is logged in. You cannot resize a VHDX that is in use. Before proceeding:

  • Ask the user to save their work and log off their RDS session.
  • Confirm the session has ended — check in Remote Desktop Services Manager or run query session /server:<SessionHostName>.
  • If the session is stuck, you can reset it: reset session <ID> /server:<SessionHostName>.
⚠️Do not attempt to resize a mounted VHDX. Windows will reject the operation and you risk corrupting the disk.

Step 1 — Resize the VHDX File with PowerShell

Run the following on the file server (or any server with Hyper-V PowerShell module installed) as a local Administrator or Domain Admin:

# Set the path to the user's UPD file $vhdPath = "\\FileServer\UPDs\UVHD-S-1-5-21-xxxxxxxxxx-1234.vhdx" # Check current size (SizeBytes = maximum size, FileSize = actual disk usage) Get-VHD -Path $vhdPath # Resize to 30 GB (specify in bytes) Resize-VHD -Path $vhdPath -SizeBytes 30GB

Resize-VHD is part of the Hyper-V PowerShell module. If it's not available on the file server, install the RSAT Hyper-V tools or run the command from a Hyper-V host or management machine that can reach the UNC path.

To install the module on Windows Server:

Install-WindowsFeature -Name Hyper-V-PowerShell

Step 2 — Extend the Volume Inside the VHDX

Resizing the VHDX container only increases the available space — the partition and volume inside it still need to be extended. You have two options: diskpart or PowerShell.

Option A: Using diskpart

Mount the VHDX, extend the partition, then detach it.

diskpart DISKPART> select vdisk file="\\FileServer\UPDs\UVHD-S-1-5-21-xxxxxxxxxx-1234.vhdx" DISKPART> attach vdisk readonly=no DISKPART> list volume DISKPART> select volume <N> DISKPART> extend DISKPART> detach vdisk DISKPART> exit

Replace <N> with the volume number shown after list volume. The extend command without parameters uses all available unallocated space.

Option B: Using PowerShell (Resize-Partition)

# Mount the VHD $vhd = Mount-VHD -Path "\\FileServer\UPDs\UVHD-S-1-5-21-xxxxxxxxxx-1234.vhdx" -Passthru # Get the disk number $diskNumber = $vhd.DiskNumber # Get the partition (usually partition 1 or 2 — check with Get-Partition) Get-Partition -DiskNumber $diskNumber # Extend the partition to maximum available size $partition = Get-Partition -DiskNumber $diskNumber -PartitionNumber 1 $maxSize = (Get-PartitionSupportedSize -DiskNumber $diskNumber -PartitionNumber 1).SizeMax Resize-Partition -DiskNumber $diskNumber -PartitionNumber 1 -Size $maxSize # Detach when done Dismount-VHD -Path "\\FileServer\UPDs\UVHD-S-1-5-21-xxxxxxxxxx-1234.vhdx"

Checking Current UPD Size and Usage

Before and after resizing, you can check the state of any UPD file with Get-VHD:

Get-VHD -Path "\\FileServer\UPDs\UVHD-S-1-5-21-xxxxxxxxxx-1234.vhdx" | Select-Object Path, VhdType, Size, FileSize, FragmentationPercentage
PropertyMeaning
SizeMaximum disk size (what the user sees as total space)
FileSizeActual bytes consumed on the network share
VhdTypeDynamic or Fixed — most UPDs are Dynamic
FragmentationPercentageHow fragmented the VHDX is on the host volume

To quickly audit all UPDs in a folder and flag ones over a threshold:

$udpFolder = "\\FileServer\UPDs" $threshold = 18GB # Warn if over 18 GB Get-ChildItem -Path $udpFolder -Filter "*.vhdx" | ForEach-Object { $vhd = Get-VHD -Path $_.FullName if ($vhd.FileSize -gt $threshold) { [PSCustomObject]{ File = $_.Name MaxGB = [math]::Round($vhd.Size / 1GB, 1) UsedGB = [math]::Round($vhd.FileSize / 1GB, 1) } } } | Format-Table -AutoSize

After Resizing — Verify the User's Experience

  • Have the user log back in to their RDS session.
  • Ask them to open File Explorer and check their drive free space.
  • Confirm the new size is reflected correctly (it should be near the new maximum).
  • If the volume did not extend, mount the VHDX and run chkdsk before attempting again.
ℹ️Consider setting a monitoring alert when UPD files exceed 80% of their maximum size, so you can resize proactively before users hit the wall. Melbits can help automate this for your RDS environment.