Удаление устаревших профилей на RDS ферме
- Постановка задачи
- Методы для автоматического удаления профилей пользователей
- Удаление устаревших профилей через GPO
- Удаление устаревших профилей через Delprof2: User Profile Deletion Tool
- Скачать Delprof2: User Profile Deletion Tool
- Примеры использования Delprof2: User Profile Deletion Tool
- Удаление профилей через PowerShell
- Вызов Pelprof через PowerShell
- Дополнительные ссылки
Добрый день! Уважаемые читатели и гости одного из популярных блогов по системному администрированию 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. Если вы хотите настроить политику, то нужный вам раздел находится по пути:
Далее производим обновление групповых политик и проверяем на тестовом сервере, либо можете перевести любой из RDSH хостов в режим стока и проверить на нем.
Удаление устаревших профилей через 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 облака или же с официального сайта:
Далее вам необходимо разархивировать zip архив. На выходе у вас появится папка с двумя файлами:
- Changelog - файл с описанием, что изменилось
- DelProf2 - сам файл утилиты
Откройте командную строку и перейдите в ней в папку с утилитой DelProf2.exe, далее выполните команду:
В результате этих не хитрых действий у вас появится справка по утилите, со всеми доступными ключами.
- /l - Перечисление профилей доступных для удаления, но удалено ничего не будет, это такой режим, что было бы (what-if mode)
- /u - Данный ключ не будет требовать подтверждения при удалении и без просмотра
- /q - Тихое удаление без вывода и подтверждения
- /p - Запрашивать подтверждение перед удалением каждого профиля
- /r - Удалить локальные кэши только перемещаемых профилей, но не локальных профилей
- /c - Удалить на удаленном компьютере
- /d - Удалить только профили, которые не использовались в течение x дней
- /ntuserini - При определении возраста профиля для /d используйте файл NTUSER.INI вместо NTUSER.DAT для расчета возраста
- /ed - Исключить каталоги профилей, имя которых соответствует определенному шаблону с помощью подстановочных знаков * и ?. Может использоваться более одного раза и может сочетаться с /id
- /id - Включить только каталоги профилей, имя которых соответствует некому шаблону, можно использовать подстановочные знаки * и ?. Может использоваться более одного раза и может сочетаться с /ed
- /i - Игнорировать ошибки, продолжить удаление
Примеры использования Delprof2: User Profile Deletion Tool
Чем хороша данная утилита, так это тем, что может вызываться и работать как удаленно, так и локально. В моей основной задаче мне необходимо именно удаленное удаление профилей.
- Для начала я хочу посмотреть список профилей на удаленном сервере, сделать это можно через команду:
тут мы вывели список профилей на сервере svt2019s01, к сожалению с русскими логинами утилита может показывать кракозябры. Тут так же видно, какие из профилей используются в данный момент, они имеют статус (reason: in use).
- Посмотреть профили на удаленном сервере старше определенного количества дней, в моем примере это 5 дней.
Как видим из списка был убран профиль sem.
- Произведем удаление профилей старше 5 дней на удаленном сервере, добавим в команду ключ /u, не требующий подтверждения и убираем ключ /l.
Выведем список профилей и удостоверимся, что все было удалено.
- Если нужно удалить на сервере только перемещаемые профили, а локальные не трогать, то мы должны добавить ключ /r
Так как в моем примере нет перемещаемых профилей, то команда вернула пустой результат, но уведомила, что все профили локальные.
- Чтобы логировать все действия по удалению, то вы можете добавить вот такую конструкцию в DelProf2.
Если нужно сделать список серверов, то можно в файле написать так:
Delprof2 /c:svt2019s02/d:5 /u > svt2019s01log_%DATE%.txt
Delprof2 /c:svt2019s03 /d:5 /u > svt2019s01log_%DATE%.txt
Как видите сами команды очень простые. Чтобы автоматизировать такой аудит профилей с последующим удалением, я вам рекомендую создать простой bat файл с нужной командой
и запускать его из планировщика Windows по расписанию. Лично я произвожу запуск каждый день в 23-00, выглядит это вот так.
Удаление профилей через PowerShell
Существует уже ряд готовых скриптов PowerShell, которые могут вам помочь в удалении старых профилей пользователей. Первый скрипт от Microsoft, я так же брал его за основу своего.
Для запуска скрипта откройте оболочку PowerShell. Далее загрузите скрипт по ссылке выше или ниже скачайте мой архив с двумя скриптами, распакуйте zip-архив. Давайте для начала выведем справку, выполните команду:
Если у вас выскакивает ошибка "так как выполнение скриптов запрещено для данной системы (Execution of scripts was prohibited)", то перейдите по ссылке (Set-ExecutionPolic) и разрешите данное действие.
Как видите тут есть ключи:
- -ListUnusedDay - показывает за какой срок нужно показывать неиспользуемые профили
- -ListAll - показать все профили
- -DelereUnuseDay - Удалить профили неиспользуемые определенное количество дней
Давайте для начала посмотрим профили которые старше 5 дней, для этого выполните:
Теперь посмотрим вообще все профили хранящиеся на данном сервере, через ключ -ListAll
Теперь удалим профили старше 5 дней, через ключ -DeleteUnusedDay, у вас выскочит подтверждение.
Все это замечательно если у вас один сервер, так же недостатком данного скрипта будет подтверждение удаления. Для более массовых работ есть второй скрипт, скачать его можно по ссылке ниже:
У данного скрипта такие же ключи:
- -ListUnusedDay - показывает за какой срок нужно показывать неиспользуемые профили;
- -ListAll - показать все профили;
- -DelereUnuseDay - Удалить профили неиспользуемые определенное количество дней;
Откройте его с помощью PowerShell ISE. Тут есть два важных момента:
- Теперь при удалении у вас не будет спрашиваться подтверждение
- У вас есть возможность подсовывать список хостов, в виде перечисления или же через файл
Давайте подготовим файл с хостами, главное чтобы они резолвились через ваш DNS сервер.
Далее вам нужно раскомментировать строку с Get-Content и указать путь до вашего текстового файла со списком серверов.
Запустим скрипт через команду:
Ключ -ListAll выводит все профили пользователей попадающие под критерии удаления. Количество дней устаревания вы можете задать через параметр "$Computername -ListUnusedDay 10". Если на хосте из списка не будет профилей попадающих под ваши критерии, то вы получите желтое уведомление "Предупреждение: The item not found". Как видите я поигрался с количеством дней, поэтому и разные списки профилей.
так же добавим ключ для удаления:
В результате удалим профили всех, у кого они старше 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 в нужное вам место, и поменять это в скрипте.
Дополнительные ссылки
- https://gallery.technet.microsoft.com/scriptcenter/How-to-delete-user-d86ffd3c/
- https://gist.github.com/mavericksevmont/8c3877cb7484fc80b309fb39f719926f
На этом у меня все, с вами был Иван Семин, автор и создатель IT портала Pyatilistnik.org.