Видалення старих профілів користувачів Windows за допомогою GPO або PowerShell

На робочих станціях і серверах Windows, особливо на термінальних серверах RDS (Remote Desktop Services), періодично виникає необхідність очищення каталогу C: \ Users від старих профілів користувачів (звільнені користувачі, користувачі, які довго не використовують сервер і т.д.).

Основна проблема термінальних серверів - постійне зростання розмірів каталогів профілів користувачів на диску. Частково ця проблема вирішується політиками квотування розміру профілю користувача за допомогою FSRM або NTFS квот, що переміщуються папками і т.д. Але при великій кількості користувачів термінального сервера в папці C: \ Users з часом накопичується величезна кількість каталогів з непотрібними профілями користувачів.

зміст:

  • Ручне видалення профілю користувача в Windows
  • Групова політика автоматично видаляти профілів
  • Очищення сервера від старих профілів користувачів за допомогою PowerShell

Ручне видалення профілю користувача в 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.

Get-WMIObject -class Win32_UserProfile | Where (! $ _. Special) -and ($ _. ConvertToDateTime ($ _. LastUseTime) -lt (Get-Date) .AddDays (-60)) | Measure-Object

У мене на термінальному сервері виявилося 143 профілю неактивних користувачів (загальним розміром близько 10 Гб).

Щоб видалити всі ці профілі досить додати перенаправити список на команду Remove-WmiObject (перед використання скрипта видалення бажано кілька разів перевірити ще раз його висновок за допомогою параметра -WhatIf):

Get-WMIObject -class Win32_UserProfile | Where (! $ _. Special) -and (! $ _. Loaded) -and ($ _. ConvertToDateTime ($ _. LastUseTime) -lt (Get-Date) .AddDays (-30)) | 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):

$ Users = Get-ADGroupMember -Identity DisabledUsers | Foreach $ _. Sid.Value
$ Profiles = Get-WmiObject Win32_UserProfile
$ Profiles | Where $ users -eq $ _. Sid | Foreach $ _. Delete ()