Удаление устаревших профилей на RDS ферме

Обновлено 13.11.2020

RDS logo

Добрый день! Уважаемые читатели и гости одного из популярных блогов по системному администрированию Pyatilistnik.org. В прошлый раз мы с вами  научились ремонтировать кнопку пуск в Windows Server 2016 на одном из RDSH хостов. Сегодня я бы хотел еще поговорить на тему обслуживания терминальной фермы, а именно хочу вас научить производить автоматическую очистку ваших хостов от старых перемещаемых профилей, которые со временем могут накапливаться и занимать ощутимое количество дискового пространства. Думаю это будет полезно для тех, кто только знакомится с технологией RDS.

Постановка задачи

Задача ставиться таким образом, у вас есть ферма Remote Desktop Services High Availability на базе Windows Server 2019, которую используют 500 пользователей. У сотрудников перемещаемые профили (могут быть и локальные все зависит от задачи), это подразумевает, что сегодня они подключаются к одному серверу, а завтра к другому, тем самым оставляя дополнительный неиспользуемый объем на RDSH хостах. Именно эти уже не используемые профили я и хочу удалять по заданным критериям, например удалять все профили старше 3-5 дней.

Методы для автоматического удаления профилей пользователей

Я могу выделить три метода позволяющие нам удалить профиль пользователя по заданным критериям:

  • С помощью групповой политики
  • С помощью утилиты Delprof2: User Profile Deletion Tool
  • Через PowerShell

Удаление устаревших профилей через GPO

Первый метод, довольно таки топорный, хоть и централизованный. Суть метода заключается в том, что вы настраиваете определенную настройку в групповых политиках, которая при перезагрузке сервера будет смотреть как долго не обращались к профилю, и если эта дата больше заданной в настройках GPO, то профиль будет удаляться с сервера. Эта политика полезная, если у вас особо не большая RDS ферма и у вас хотя бы раз в месяц происходит обслуживание серверов, например для установки обновлений или обновления Vmware Tools. Если вы хотите настроить политику, то нужный вам раздел находится по пути:

Конфигурация компьютера - Политики - Административные шаблоны - Система - Профили пользователей - Удалять при перезагрузке системы профили пользователей по истечении указанного числа дней (Computer Configuration - Administrative Templates - System - User Profiles - Delete user profiles older than a specified number of days on system restart)

Далее производим обновление групповых политик и проверяем на тестовом сервере, либо можете перевести любой из RDSH хостов в режим стока и проверить на нем.

Удаление устаревших профилей через GPO

Удаление устаревших профилей через Delprof2: User Profile Deletion Tool

Второй метод, который подошел мне, это использование бесплатной утилиты Delprof2: User Profile Deletion Tool. Delprof2 удаляет неактивные профили пользователей. Если вы хотите освободить место на диске, просто запустите его без параметров, и он удалит все профили, кроме вашего собственного, и некоторые специальные профили, необходимые для операционной системы. Delprof2 имеет дополнительные параметры фильтрации: вы можете удалить только локально кэшированные копии перемещаемых профилей или удалить только те профили, которые не использовались в течение указанного количества дней. Delprof2 делает все как в локальной системе, так и удаленно.

Профили пользователей часто имеют разрешения, установленные для них таким образом, что даже администраторы не имеют доступа без предварительной обработки ACL. Delprof2 обходит это требование, используя права резервного копирования и восстановления для анализа и удаления даже самых надежно защищенных профилей.

Некоторые программы хранят файлы по пути, длина которого превышает 260 символов. Большинство инструментов не могут работать с такими путями, длина которых превышает значение MAX_PATH (260). Проводник Windows - яркий тому пример. Delprof2, с другой стороны, использует специальные API, чтобы иметь возможность удалять файлы в самых удаленных областях вашего жесткого диска.

Скачать Delprof2: User Profile Deletion Tool

Загрузить последнюю версию утилиты вы можете либо у меня с mail облака или же с официального сайта:

Скачать с официального сайта - https://helgeklein.com/free-tools/delprof2-user-profile-deletion-tool/

Скачать Delprof2: User Profile Deletion Tool  из облака mail

Далее вам необходимо разархивировать zip архив. На выходе у вас появится папка с двумя файлами:

  • Changelog - файл с описанием, что изменилось
  • DelProf2 - сам файл утилиты

Состав утилиты Delprof2: User Profile Deletion Tool

напоминаю, что если вы запустите DelProf2.exe, то без ввода параметров она удалит все профили, кроме вашего, так что пока не запускайте, а изучите доступные ключи

Откройте командную строку и перейдите в ней в папку с утилитой DelProf2.exe, далее выполните команду:

DelProf2 /?

В результате этих не хитрых действий у вас появится справка по утилите, со всеми доступными ключами.

Вызов справки Delprof2: User Profile Deletion Tool

  • /l - Перечисление профилей доступных для удаления, но удалено ничего не будет, это такой режим, что было бы (what-if mode)

Перечисление профилей доступных для удаления в Delprof2: User Profile Deletion Tool

  • /u - Данный ключ не будет требовать подтверждения при удалении и без просмотра
  • /q - Тихое удаление без вывода и подтверждения
  • /p - Запрашивать подтверждение перед удалением каждого профиля
  • /r - Удалить локальные кэши только перемещаемых профилей, но не локальных профилей
  • /c - Удалить на удаленном компьютере
  • /d - Удалить только профили, которые не использовались в течение x дней
  • /ntuserini - При определении возраста профиля для /d используйте файл NTUSER.INI вместо NTUSER.DAT для расчета возраста
  • /ed - Исключить каталоги профилей, имя которых соответствует определенному шаблону с помощью подстановочных знаков * и ?. Может использоваться более одного раза и может сочетаться с /id
  • /id - Включить только каталоги профилей, имя которых соответствует некому шаблону, можно использовать подстановочные знаки * и ?. Может использоваться более одного раза и может сочетаться с /ed
  • /i - Игнорировать ошибки, продолжить удаление

Примеры использования Delprof2: User Profile Deletion Tool

Чем хороша данная утилита, так это тем, что может вызываться и работать как удаленно, так и локально. В моей основной задаче мне необходимо именно удаленное удаление профилей.

  • Для начала я хочу посмотреть список профилей на удаленном сервере, сделать это можно через команду:

Delprof2 /c:svt2019s01 /l

тут мы вывели список профилей на сервере svt2019s01, к сожалению с русскими логинами утилита может показывать кракозябры. Тут так же видно, какие из профилей используются в данный момент, они имеют статус (reason: in use).

Просмотр профилей на удаленном компьютере

  • Посмотреть профили на удаленном сервере старше определенного количества дней, в моем примере это 5 дней.

Delprof2 /c:svt2019s01 /l /d:5

Как видим из списка был убран профиль sem.

Посмотреть профили на удаленном сервере старше определенного количества дней

  • Произведем удаление профилей старше 5 дней на удаленном сервере, добавим в команду ключ /u, не требующий подтверждения и убираем ключ /l.

Delprof2 /c:svt2019s01 /d:5 /u

Удаление профилей через DelProf2

Выведем список профилей и удостоверимся, что все было удалено.

Проверка удаления профилей на удаленном сервере

  • Если нужно удалить на сервере только перемещаемые профили, а локальные не трогать, то мы должны добавить ключ /r

Delprof2 /c:svt2019s01 /d:5 /u /r

Так как в моем примере нет перемещаемых профилей, то команда вернула пустой результат, но уведомила, что все профили локальные.

удалени перемещаемых парофилей

    • Чтобы логировать все действия по удалению, то вы можете добавить вот такую конструкцию в DelProf2.

Delprof2 /c:svt2019s01 /d:5 /u > svt2019s01log_%DATE%.txt

Если нужно сделать список серверов, то можно в файле написать так:

Delprof2 /c:svt2019s01 /d:5 /u > svt2019s01log_%DATE%.txt

Delprof2 /c:svt2019s02/d:5 /u > svt2019s01log_%DATE%.txt

Delprof2 /c:svt2019s03 /d:5 /u > svt2019s01log_%DATE%.txt

Настройка лога удаления в DelProf2

Как видите сами команды очень простые. Чтобы автоматизировать такой аудит профилей с последующим удалением, я вам рекомендую создать простой bat файл с нужной командой

Создание bat файла с запуском Delprof2

и запускать его из планировщика Windows по расписанию. Лично я произвожу запуск каждый день в 23-00, выглядит это вот так.

задание по удалению профиля в планировщике Windows

Удаление профилей через PowerShell

Существует уже ряд готовых скриптов PowerShell, которые могут вам помочь в удалении старых профилей пользователей. Первый скрипт от Microsoft, я так же брал его за основу своего.

Ссылка га первый скрипт - https://gallery.technet.microsoft.com/scriptcenter/How-to-delete-user-d86ffd3c/ или у меня

Для запуска скрипта откройте оболочку PowerShell. Далее загрузите скрипт по ссылке выше или ниже скачайте мой архив с двумя скриптами, распакуйте zip-архив. Давайте для начала выведем справку, выполните команду:

Get-Help ./RemoveLocalUserProfile.ps1

Если у вас выскакивает ошибка "так как выполнение скриптов запрещено для данной системы (Execution of scripts was prohibited)", то перейдите по ссылке (Set-ExecutionPolic) и разрешите данное действие.

Как видите тут есть ключи:

  • -ListUnusedDay - показывает за какой срок нужно показывать неиспользуемые профили
  • -ListAll - показать все профили
  • -DelereUnuseDay - Удалить профили неиспользуемые определенное количество дней

Запуск Get-Help ./RemoveLocalUserProfile.ps1

Давайте для начала посмотрим профили которые старше 5 дней, для этого выполните:

./RemoveLocalUserProfile.ps1 -ListUnusedDay 5

Теперь посмотрим вообще все профили хранящиеся на данном сервере, через ключ -ListAll

./RemoveLocalUserProfile.ps1 -ListAll

Теперь удалим профили старше 5 дней, через ключ -DeleteUnusedDay, у вас выскочит подтверждение.

./RemoveLocalUserProfile.ps1 -DeleteUnusedDay 5

Удаление старых профилей через скрипт PowerShell

Все это замечательно если у вас один сервер, так же недостатком данного скрипта будет подтверждение удаления. Для более массовых работ есть второй скрипт, скачать его можно по ссылке ниже:

У данного скрипта такие же ключи:

  • -ListUnusedDay - показывает за какой срок нужно показывать неиспользуемые профили;
  • -ListAll - показать все профили;
  • -DelereUnuseDay - Удалить профили неиспользуемые определенное количество дней;

Откройте его с помощью PowerShell ISE. Тут есть два важных момента:

  1. Теперь при удалении у вас не будет спрашиваться подтверждение
  2. У вас есть возможность подсовывать список хостов, в виде перечисления или же через файл

Давайте подготовим файл с хостами, главное чтобы они резолвились через ваш DNS сервер.

Файл со списком серверов на которых будут удаляться профили пользователей

Далее вам нужно раскомментировать строку с Get-Content и указать путь до вашего текстового файла со списком серверов.

Загрузка списка серверов для очистки от старых профилей

Запустим скрипт через команду:

./RemoveLocalUserProfile_Batch.ps1 -ListAll

Ключ -ListAll выводит все профили пользователей попадающие под критерии удаления. Количество дней устаревания вы можете задать через параметр "$Computername -ListUnusedDay 10". Если на хосте из списка не будет профилей попадающих под ваши критерии, то вы получите желтое уведомление "Предупреждение: The item not found". Как видите я поигрался с количеством дней, поэтому и разные списки профилей.

Выгрузка списка пользователей с серверов, где необходимо удалять профили

так же добавим ключ для удаления:

./RemoveLocalUserProfile_Batch.ps1 -DelereUnuseDay 5

В результате удалим профили всех, у кого они старше 5 дней.

Вызов Pelprof через PowerShell

При запуске приведенного ниже сценария все, что вам нужно сделать, это ввести имя хоста рабочих станций и имя папки профиля, то есть имя пользователя учетной записи.


Param
(
[parameter(mandatory=$true,HelpMessage="Please type the Hostname of the workstation(s) Use wildcards for a collection")][ValidateNotNullOrEmpty()][String]$Hostname,
[parameter(mandatory=$true,HelpMessage="Please enter the user account (profile folder name)")][ValidateNotNullOrEmpty()][String]$UserProfile
)
If ($UserProfile -ne $null){
$Computers = Get-ADComputer -Filter {Name -like $Hostname}
ForEach ($computer in $computers) {
$ComputerN = $computer.Name
$runpath = "C:\Temp\DelProf2\DelProf2.exe"
$arguments = "/u /c:\\$ComputerN /id:$UserProfile"
Start-Process -filepath $runpath -Verb runAs -ArgumentList $arguments
}}

Не забываем поместить утилиту pelprof2 в нужное вам место, и поменять это в скрипте.

Запуск delprof2 через PowerShell

Дополнительные ссылки

  • https://gallery.technet.microsoft.com/scriptcenter/How-to-delete-user-d86ffd3c/
  • https://gist.github.com/mavericksevmont/8c3877cb7484fc80b309fb39f719926f

На этом у меня все, с вами был Иван Семин, автор и создатель IT портала Pyatilistnik.org.

Автор - Сёмин Иван

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *