- Удаление старых профилей пользователей Windows с помощью GPO или PowerShell
- Ручное удаление профиля пользователя в Windows
- Групповая политика автоматического удаления старых профилей
- Очистка сервера от старых профилей пользователей с помощью PowerShell
- Удаляем учетные записи на Windows серверах.
- Как удалить профиль пользователя windows server 2012
- Постановка задачи
- Методы для автоматического удаления профилей пользователей
- Удаление устаревших профилей через GPO
- Удаление устаревших профилей через Delprof2: User Profile Deletion Tool
- Скачать Delprof2: User Profile Deletion Tool
- Примеры использования Delprof2: User Profile Deletion Tool
- Удаление профилей через PowerShell
- Вызов Pelprof через PowerShell
Удаление старых профилей пользователей Windows с помощью GPO или PowerShell
На рабочих станциях и серверах Windows, особенно на терминальных серверах RDS (Remote Desktop Services), периодически возникает необходимость очистки каталога C:\Users от старых профилей пользователей (уволенные пользователи, пользователи, которые долго не используют сервер и т.д.).
Основная проблема терминальных серверов – постоянный рост размеров каталогов профилей пользователей на диске. Частично эта проблема решается политиками квотирования размера профиля пользователя с помощью FSRM или NTFS квот, перемещаемыми папками и т.д. Но при большом количестве пользователей терминального сервера в папке C:\Users со временем накапливается огромное количество каталогов с ненужными профилями пользователей.
Ручное удаление профиля пользователя в Windows
Многие начинающиеся администраторы пытаются вручную удалить каталог с профилем пользователя из папки C:\Users. Так можно делать, если вы после удаления папки вручную удалите раздел профиля пользователя со ссылкой на каталог в ветке реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\ CurrentVersion\ProfileList. Правильный ручной способ удаления профиля пользователя в Windows – открыть свойства системы, перейти в Advanced System Settings -> User Profiles -> Settings, выбрать в списке пользователя (в столбце Size указан размер профиля пользователя) и нажать кнопку Удалить.
Но это ручной способ, а хочется автоматизации.
Групповая политика автоматического удаления старых профилей
В Windows есть встроенная групповая политика для автоматического удаления старых профилей пользователей старше xx дней. Эта политика находится в разделе Конфигурация компьютера -> Административные шаблоны -> Система -> Профили пользователей (Computer Configuration -> Administrative Templates -> System -> User Profiles) и называется “Удалять при перезагрузке системы профили пользователей по истечении указанного числа дней” (Delete user profiles older than a specified number days on system restart). Вы можете включить этот параметр в локальном редакторе политик (gpedit.msc) или с помощью доменных политик из консоли GPMC.msc.
Включите политику и укажите через сколько дней профиль пользователя считается неактивным и “Служба профилей пользователей Windows” можно автоматически удалить такой профиль при следующей перезагрузке. Обычно тут стоит указать не менее 45-90 дней.
Основные проблемы такого способа автоматической очистки профилей – ожидание перезагрузки сервера и неизбирательность (вы не можете запретить удаление определенных профилей, например, локальных учетных записей, администраторов и т.д.). Также эта политика может не работать, если некоторое стороннее ПО (чаще всего это антивирус) обращается к файлу NTUSER.DAT в профилях пользователей и обновляет дату последнего использования.
Очистка сервера от старых профилей пользователей с помощью PowerShell
Вместо использования рассмотренной выше политики автоматической очистки профилей, вы можете использовать простой PowerShell скрипт для поиска и удаления профилей неактивных или заблокированных пользователей.
Сначала попробуем подсчитать размер профиля каждого пользователя в папке C:\Users c помощью простого скрипта из статьи “Вывести размер папок с помощью PowerShell”:
gci -force ‘C:\Users’-ErrorAction SilentlyContinue | ? < $_ -is [io.directoryinfo] >| % <
$len = 0
gci -recurse -force $_.fullname -ErrorAction SilentlyContinue | % < $len += $_.length >
$_.fullname, ‘ <0:n2>GB’ -f ($len / 1Gb)
$sum = $sum + $len
>
“Общий размер профилей”,’ <0:n2>GB’ -f ($sum / 1Gb)
Итого суммарный размер всех профилей пользователей в каталоге C:\Users около 22 Гб.
Теперь выведем список пользователей, профиль которых не использовался более 60 дней. Для поиска можно использовать значение поля профиля LastUseTime.
У меня на терминальном сервере оказалось 143 профиля неактивных пользователей (общим размером около 10 Гб).
Чтобы удалить все эти профили достаточно добавить перенаправить список на команду Remove-WmiObject (перед использование скрипта удаления желательно несколько раз перепроверить его вывод с помощью параметра –WhatIf ):
Чтобы не удалять профили некоторых пользователей, например, специальные аккаунты System и Network Service, учетную запись локального администратора, пользователей с активными сессиями, список аккаунтов-исключений), нужно модифицировать скрипт следующим образом:
#Список аккаунтов, чьи профили нельзя удалять
$ExcludedUsers =»Public»,»zenoss»,»svc»,”user_1”,”user_2”
$LocalProfiles=Get-WMIObject -class Win32_UserProfile | Where <(!$_.Special) -and (!$_.Loaded) -and ($_.ConvertToDateTime($_.LastUseTime) -lt (Get-Date).AddDays(-60))>
foreach ($LocalProfile in $LocalProfiles)
<
if (!($ExcludedUsers -like $LocalProfile.LocalPath.Replace(«C:\Users\»,»»)))
<
$LocalProfile | Remove-WmiObject
Write-host $LocalProfile.LocalPath, «профиль удален” -ForegroundColor Magenta
>
>
Вы можете настроить запуск этого скрипта через shutdown скрипт групповой политики или по расписанию заданием планировщика. (перед настройкой автоматического удаления профилей внимательно протестируйте скрипт в своей среде!).
Можно модифицировать скрипт, чтобы автоматически удалять пользователи всех пользователей, которые добавлены в определенную группу AD (например, группа DisabledUsers):
Удаляем учетные записи на Windows серверах.
Иногда, когда приходит письмо от отдела кадров об увольнении сотрудника.
Я руководствуюсь следующим порядком:
Первым делом блокирую учетную запись сроком на 1 месяц .
На иконке My Computer правой кнопкой мыши, далее Manage – Computer Management – Local Users and Groups – Users.
Таких сотрудников накапливается множество.
Выводим список заблокированных учетных записей через wmi – запрос :
wmic useraccount where (Status=’Degraded’) get Caption
Далее, удаляем учетную запись :
Net user /delete
, где берем данные из предыдущего вывода.
, но даже после этого удаления остаются данные профиля и помечаются, как Account Unknown . Для их удаления переходи: — на иконке My Computer правой кнопкой мыши, далее Properties – Advanced – User Profiles – Settings
На каждой нажимаем Delete.
Вот на этом можно считать, что с удаление мы справились. Способ не автоматизированный. Но действующий.
Используйте прокси ((заблокировано роскомнадзором, используйте vpn или proxy)) при использовании Telegram клиента:
Поблагодари автора и новые статьи
будут появляться чаще 🙂
Карта МКБ: 4432-7300-2472-8059
Yandex-деньги: 41001520055047
Большое спасибо тем кто благодарит автора за практические заметки небольшими пожертвованиями. С уважением, Олло Александр aka ekzorchik.
Как удалить профиль пользователя windows server 2012
Добрый день! Уважаемые читатели и гости одного из популярных блогов по системному администрированию 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
При запуске приведенного ниже сценария все, что вам нужно сделать, это ввести имя хоста рабочих станций и имя папки профиля, то есть имя пользователя учетной записи.
Не забываем поместить утилиту pelprof2 в нужное вам место, и поменять это в скрипте.