How to Transfer Files to an Offline Windows 11 VM on Proxmox

How I Transferred Files to an Offline Windows 11 VM on Proxmox (Without Network or USBs)

I recently ran into a frustrating loop trying to get application files (like CrystalDiskMark) onto a completely isolated, offline Windows 11 VM running on my Proxmox VE (PVE) server. Because the VM had no network connection, standard network shares (SMB) or Remote Desktop drag-and-drop were out of the question. I also didn’t have any physical USB sticks lying around to use hardware passthrough.
I initially tried to natively generate an ISO using PowerShell scripts on my Windows 11 management PC, but I quickly discovered that modern PowerShell lacks a native, out-of-the-box one-liner to build ISOs without throwing corrupt pipeline errors or requiring Microsoft Store utilities (which were blocked by my firewall).
To bypass all of this, I found a clever workaround using a native Virtual Hard Disk (VHDX) file and a simple file extension trick to fool the Proxmox GUI. Here is exactly how I did it:

Step 1: I Created a VHDX in PowerShell

Instead of fighting with broken ISO streams, I opened PowerShell as an Administrator on my management PC and ran a quick script to build a virtual disk, format it, and pack it with my files.
powershell
# I defined my folder source and output path
$SourceFolder = "D:\Apps\CrystalDiskMark"
$VHDXPath     = "C:\temp\Transfer.vhdx"

# I created, mounted, and formatted a fresh 1GB virtual drive
$VHDX = New-VHD -Path $VHDXPath -SizeBytes 1GB -Dynamic | Mount-VHD -Passthru | Initialize-Disk -PartitionStyle GPT -Passthru | New-Partition -AssignDriveLetter -UseMaximumSize
Format-Volume -Partition $VHDX -FileSystem NTFS -Confirm:$false

# I grabbed the temporary drive letter and copied my files over
$DriveLetter = $VHDX.DriveLetter
Copy-Item -Path "$SourceFolder\*" -Destination "${DriveLetter}:\" -Recurse

# I safely unmounted the virtual disk from my host machine
Dismount-VHD -Path $VHDXPath

Step 2: I tricked the PVE UI

Proxmox’s web upload utility is hardcoded to only accept certain file formats inside the ISO template container, so it threw an “extension error” when I tried to upload my raw .vhdx file.
To trick the system, I simply renamed the file extension on my Windows PC from Transfer.vhdx to Transfer.iso. Changing the label doesn’t hurt the data inside, and it completely bypassed the Proxmox GUI gate. I hit upload, and it went right through.

Step 3: I Imported the Disk via Proxmox Shell

Once the file finished uploading to my local storage, I jumped into the main Proxmox Node Shell and ran the built-in storage manager tool (qm) to natively import the disk into my target VM layout. Proxmox’s backend engine automatically identified the actual internal disk layout regardless of my fake .iso file extension:
bash
qm importdisk 100 /var/lib/vz/template/iso/Transfer.iso local-lvm

(Note: I replaced 100 with my specific VM ID and local-lvm with my target storage environment).

Step 4: I Attached the Unused Hardware and Brought it Online

After running the shell command, I went back to the Proxmox Web UI, clicked on my Windows 11 VM, and opened the Hardware tab. The imported disk was sitting there at the bottom, safely detached as an “Unused Disk 0”.
I double-clicked the unused disk line and selected SATA as the bus type for maximum compatibility, then clicked Add.
Finally, I hopped into my offline Windows 11 VM console, opened Disk Management, right-clicked the new 1GB disk block, and toggled it to Online. It mounted immediately in File Explorer with all of my folders intact!
Hope this helps someone.

Leave a Reply

Your email address will not be published. Required fields are marked *