UPD: Это устаревшая версия скрипта. Актуальный скрипт лежит здесь.
Сначала в общих чертах…
На базе функционала User Profile Disks, RDS ферма формирует рабочее пространство пользователей на виртуальных дисках профилей vhdx с заданной квотой. Для жёстких дисков формируется имя файла, содержащее идентификатор пользователя, по которому и происходит сцепка пользователя и диска с его профилем. Во время входа пользователя — диск монтируется, а во время выхода — отключается.
На этапе настройки RDS фермы в указанном хранилище дисков профилей, создаётся шаблонный файл UVHD-template.vhdx. Во время подключения пользователя этот файл берётся за основу профиля «по умолчанию» и создаётся диск с именем — UVHD-SID.vhdx.
Теперь перейдём непосредственно к теме поста…
Интересная ситуация складывается, когда пользователь домена отключен, все необходимые данные перенесены, а вот диск профиля всё ещё пылится в хранилище и занимает драгоценное место. В какой-то момент, таких дисков может накопиться столько, что для размещения других дисков просто не останется места. Кроме того, нехватка места может отрицательно сказаться и на процессе монтирования уже существующих дисков профилей.
Столкнувшись с такой ситуацией, я написал вот такой скрипт:
## Шапка скрипта ##
[System.Console]::Title = "Перемещение *.vhdx профилей RDS фермы"
### Директории ###
$diskpath = "\\RDS\c$\Profiles\"
$backpath = "\\RDS\c$\Profiles\VHDXDISABLE"
### Логирование ###
$log = "log.txt"
function Logger
{
Param ([string]$logstring)
$stamp = (Get-Date).toString("yyyy/MM/dd HH:mm:ss")
$logmessage = "$stamp $logstring"
Add-content $log -value $logmessage
}
### Создание папки для перемещения ###
New-Item -Path $backpath -ItemType Directory -ErrorAction Ignore | Out-Null
### Получение списка отключенных пользователей и их SID ###
$load = Get-AdUser -Filter * | where 'Enabled' -eq $False | Sort-Object -Property Name | ft SID -HideTableHeaders | Out-String -Stream | Where { $_.Trim().Length -gt 0 }
### Добавление префикса и суффикса ###
$files = $load | foreach {$diskpath + "UVHD-" + $_ + ".vhdx"}
### Цикл перемещения дисков отключенных пользователей ###
ForEach ($file in $files) {
$testfile = Test-Path -Path $file
if ($testfile) {
Logger("Перемещается файл $file")
Write-Host "Перемещается файл" $file -ForegroundColor Green
Move-Item -Path $file -Destination $backpath -ErrorAction Ignore
if ($testfile) {
Write-Host "Не удалось переместить файл" $file -ForegroundColor Red
Logger("Не удалось переместить файл $file")
}
else {
Write-Host "Файл успешно перемещён!" -ForegroundColor Green
Logger("Файл $file успешно перемещён!")
}
Write-Host }
}
### Ожидание действий ###
Write-Host
Read-Host "Нажмите Enter для выхода..."
Скрипт перемещает диски отключенных пользователей в папку VHDXDISABLE, которая создается в хранилище виртуальных дисков. Удаление содержимого папки проводится в ручном режиме.
Разумеется, скрипт нужно будет адаптировать под актуальное расположение хранилища виртуальных дисков профилей. Достаточно только заменить пути в переменных $diskpath и $backpath. В случае с $backpath важно оставить конструкцию с папкой VHDXDISABLE () или задать свой путь, но в таком случае перемещение займёт куда больше времени.
В процессе работы, скрипт пишет простенький log.txt и выводит информацию в консоль.
Вместо P.S.: любые манипуляции с виртуальными дисками надо проводить только если они отмонтированы.