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.
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:
- Open Server Manager on your RD Connection Broker or Session Host.
- Navigate to Remote Desktop Services → Collections → [Your Collection].
- Click Tasks → Edit Properties, then go to the User Profile Disks tab.
- 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 CustomRdpPropertyThe 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>.
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 30GBResize-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-PowerShellStep 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> exitReplace <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| Property | Meaning |
|---|---|
Size | Maximum disk size (what the user sees as total space) |
FileSize | Actual bytes consumed on the network share |
VhdType | Dynamic or Fixed — most UPDs are Dynamic |
FragmentationPercentage | How 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 -AutoSizeAfter 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
chkdskbefore attempting again.