PowerShell · 13.07.2022

Остались только диски

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.: любые манипуляции с виртуальными дисками надо проводить только если они отмонтированы.