Remote Desktop Services: Jak zjistit volné místo v profilu využívající User Profile Disks (UPD) v PowerShellu
Na terminálových serverech (servery s rolí Remote Desktop Services) je možnost používat User Profile Disks (UPD). Jedná se o scénář, kdy každý uživatel má svůj dedikovaný virtuální disk VHDX kde má všechna svoje data. Tento scénář má mnoho výhod a také pár nevýhod. Jedna z nevýhod je, že není možné skrze PowerShell zjistit volné místo na disku uživatele.
Když jsem začal nasazovat masovější scénáře využívání terminálových serverů kde již byly desítky uživatelů, řešil jsem opakovaně situace kde někteří uživatelé si rádi uzurpovali kapacitu disku pro sebe a nerespektovali přidělené volné místo na disku. Je sice možné používat funkci Disk Quota, ale s touto funkcí mám jisté „specifické“ zkušenosti, takže jsem se chtěl vyhnout jejímu používání. Proto jsem se pak rozhodl pro User Profile Disks (UPD), které nabízí poměrně hodně výhod a nevýhody jsem tehdy moc neviděl.
Nevýhoda User Profile Disks (UPD) – zjišťování využití profilu uživateli
Až časem jsem přišel na jednu nevýhodu. Tou je zjišťování využívání profilu a zejména kolik má uživatel volného místa na profilu. Mnoho uživatelů bylo zvyklých že se podívali kolik má volného místa na disku disk C: a s touto informací operovali. Tím však docházelo ke zmatení i když jsem jim připomínal že jejich profil je jinde a nesouvisí s diskem C:. Náročné však bylo zejména poskytnutí jednoduchého nástroje pro zjištění jak je profil využíván a kolik zbývá volného místa na (virtuálním) disku kde profil je uložen.
Následně jsem pak pocítil negativa tohoto řešení i já, protože po opakovaném hledání na internetu a později i konzultacích s AI jsem zjistil, že běžnými metodami v PowerShellu toto zjistit nejde.
PowerShell nepodporuje zjišťování volného místa na Mounted Folder
V prostředí s Remote Desktop Services (RDS) se mohou uživatelské profily ukládají do připojených virtuálních disků (VHDX) skrze User Profile Disks (UPD), či FSlogix. Tyto disky se dynamicky připojují při přihlášení uživatele a nemají přiřazeno písmeno jednotky. Na první pohled tak uživatel i systém vidí běžnou cestu jako C:\Users\USERNAME
, ale technicky se obsah této složky nachází na zcela jiném úložišti – na připojeném VHDX disku.
PowerShell nabízí několik způsobů, jak zjistit volné místo na disku. Mezi nejčastější patří:
Get-PSDrive
Get-Volume
Win32_LogicalDisk
přes WMIScripting.FileSystemObject
přes COM
Všechny tyto metody ale mají jedno společné omezení – pracují pouze se svazky, které mají přiřazené písmeno jednotky (např. C:
, D:
). Jakmile je disk připojen jiným způsobem jako Mounted Folder, tyto metody vrátí nesprávné údaje. Typicky vrací informace o disku C:
, ačkoli data reálně leží jinde.
V praxi to znamená, že pokud použijeme například Get-PSDrive -Name C
, získáme informaci o fyzickém disku C:
, nikoli o volném místě v připojeném uživatelském profilu.
Jediná spolehlivá metoda, která vrátí skutečné volné místo podle reálného umístění dané cesty (a tedy i pro připojený VHDX disk), je využití funkce GetDiskFreeSpaceEx
z Windows API. Tato funkce umožňuje předat libovolnou validní cestu v systému – a Windows sám interně rozhodne, na jakém fyzickém nebo virtuálním úložišti tato cesta leží. Díky tomu vrátí správné hodnoty i v případě, že jde o připojený profil na VHDX nebo mountovaný adresář bez písmena disku.
V PowerShellu lze tuto funkci volat pomocí integrovaného C# kódu, který se načte přes Add-Type
. Výsledkem je robustní a spolehlivé řešení, které funguje i v prostředí s připojenými profily, bez ohledu na způsob jejich připojení.
Pokud tedy potřebujete zjistit reálné volné místo v rámci uživatelského profilu, který je připojen jako VHD na RDS serveru, nativní PowerShell metody nestačí. Řešením je přímé volání Windows API funkcí přes C#.
Get User Profile Disks Free Space
Dle předchozí kapitoly jsem tedy vytvořil PowerShell skript, který umí zjistit u aktuálně přihlášeného uživatele volné místo na disku a i v případě že profil uživatele využívá User Profile Disks (UPD), či FSLogix.
Odkazy
- Get User Profile Disks Free Space na GitHub (anglicky)