При использовании дисков профилей User Profile Disk в ферме RD Connection Broker на базе Windows Server 2012 R2 рано или поздно может появиться задача расширения того или иного диска профилей. Выполнить эту задачу можно как с помощью графических средству управления, таких как, консоль Управление дисками (diskmgmt.msc) и Диспетчер Hyper-V (virtmgmt.msc), так и с помощью PowerShell для того, чтобы свести к минимуму пробег мыши. Для непосредственной процедуры расширения VHDX-диска воспользуемся командлетом Resize-VHD из PS-модуля Hyper-V. Для того, чтобы этот командлет отрабатывал без ошибок на рабочей станции с Windows 10, помимо Средств управления Hyper-V мне пришлось доустановить в систему Службы Hyper-V через оснастку Программы и компоненты (appwiz.cpl)
Чтобы сориентироваться в том, какой именно VHDX-файл нам нужно модифицировать в сетевой папке где расположены файлы дисков профилей, узнаем SID доменного пользователя запросившего расширение диска профиля:
Import-Module ActiveDirectory Get-ADUser petya | Select -Property SID
Зная SID, сформируем полный путь к VHDX-файлу (имя файла формируется как UVHD-<SID>.vhdx) и запишем его в переменную $VDiskPath
В переменную $VDiskNewSize запишем новый размер (увеличенный) виртуального диска в байтах. Перед запуском скрипта на всякий случай сделаем резервную копию модифицируемого VHDX-файла. В процессе расширения диска нам потребуется эксклюзивный доступ к VHDX-файлу, поэтому на время расширения лучше попросить пользователя закрыть сессию в ферме RDS, чтобы диск его профиля не был занят. Выполним скрипт расширения:
Import-Module Hyper-V # $VDiskPath = "\\MYDOM\DFSRoot\RDS-Profiles\UVHD-S-1-5-21-2988499774-3619934774-1776546648-108997.vhdx" $VDiskNewSize = 1347420160 [int]$VDiskBusy = 0 # Try { # # Check if vdisk busy # Mount-DiskImage -ImagePath $VDiskPath -ErrorAction Stop } Catch{ Write-Warning "Mount-DiskImage error:`n$_" $VDiskBusy = 1 BREAK } # If ($VDiskBusy -eq 0) { # Dismount-DiskImage -ImagePath $VDiskPath # # Resize vdisk # Resize-VHD -Path $VDiskPath -SizeBytes $VDiskNewSize # # Mount, extend partition and dismount vdisk # Mount-DiskImage -ImagePath $VDiskPath $VDiskVol = Get-DiskImage –ImagePath $VDiskPath | Get-Disk | Get-Partition | Get-Volume $PartSize = Get-PartitionSupportedSize -DriveLetter $VDiskVol.DriveLetter Resize-Partition -DriveLetter $VDiskVol.DriveLetter -size $PartSize.SizeMax Dismount-DiskImage -ImagePath $VDiskPath }
В процессе работы скрипта происходит следующее:
А) Выполняется попытка смонтировать диск профиля (соответствующий VHDX-файл), чтобы убедиться в том, что файл не занят другими процессами, например открытой сессией пользователя.
Б) Если попытка монтирования диска прошла без ошибок, диск отсоединяется и выполняется операция увеличения его размера.
В) Диск снова монтируется, выполнятся расширение тома до его максимально возможного размера с последующим отсоединением диска.
В процессе работы скрипта происходящие изменения с виртуальным диском профиля можно наглядно увидеть в графической оболочке – в консоли Управление дисками (diskmgmt.msc)
Обновлено 31.08.2015
Александр Никитин расширил предложенный скрипт:
<# .Synopsis This script extend size VHD\VHDX file and resize partition to maximum. .EXAMPLE .\Extend-VHD.ps1 -Path c:\somevhd.vhdx -Size 5GB #> #Requires -Version 3.0 #Requires -RunAsAdministrator #Requires -Modules Hyper-V Param( [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [alias("Path")] [string]$VHDPath, [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [alias("Size")] [int64]$VHDNewSize ) begin{ try { Mount-VHD -Path $VHDPath -ErrorAction Stop } catch { Write-Error "File $VHDPath is busy" Break } $vhd = Get-VHD -Path $VHDPath if ($vhd.Size -ge $VHDNewSize){ Write-Warning "File $VHDPath already have this size!" $vhd | Dismount-VHD Break } } process{ Dismount-VHD -Path $VHDPath Resize-VHD -Path $VHDPath -SizeBytes $VHDNewSize $partition = Mount-VHD -Path $VHDPath -NoDriveLetter -Passthru | Get-Disk | Get-Partition $partsize = $partition | Get-PartitionSupportedSize $partition | Resize-Partition -Size $partsize.SizeMax } end{ Dismount-VHD -Path $VHDPath }
Спасибо за скрипт.
Но мои юзеры замучали меня вопросом: как узнать сколько у меня осталось свободного места?
В правда - как ? :)
Get-ChildItem "UNC path to UPD" -Recurse |% {$_.FullName} | get-vhd -ErrorAction SilentlyContinue | select Path, @{Name="Size(Mbytes)";Expression={$_.Size / 1Mb}}, @{Name="FileSize(Mbytes)";Expression={$_.FileSize / 1Mb}}, @{Name="FreeSpace(Mbytes)";Expression={($_.Size / 1Mb)-($_.FileSize / 1Mb)}} | ft -AutoSize
мне как админу, узнать свободное место не проблема. Но хотелось бы что б юзеры могли сами следить на за ним в реалтайме. Вот в чем вопрос был ....
тогда как вариант немного дополнить (изменить) скрипт и вывести данные в формате HTML с дальнейшей публикацией на портале
%systemroot%\system32\subst h: %USERPROFILE% в автозагрузку
и пользователи сами увидят на диске H
+ (как вариант)
http://jeffwouters.nl/index.php/2012/06/scvmm-custom-inventory-about-vm-and-vhd-with-powershell/
А можно ли с помощью Powershell сжать диск профиля пользователя? По заданию руководства пользователи обработали большой объем информации, и профили приблизились к выставленному лимиту в 10 гб, а используется в повседневной работе меньше.
Get-ChildItem -Path \\AD\Files\UserProfileDisks\ | ForEach-Object -Process {.\Extend-VHD.ps1 -Path $PSItem.FullName -VHDNewSize 10Gb}