Usuwanie starych profili użytkowników Windows za pomocą GPO lub PowerShell

Na stacjach roboczych i serwerach Windows, szczególnie na serwerach terminali RDS (Remote Desktop Services), okresowo zachodzi potrzeba czyszczenia katalogu C: \ Users ze starych profili użytkowników (zwolnieni użytkownicy, użytkownicy, którzy nie używali serwera przez długi czas itp.).

Głównym problemem serwerów terminali jest ciągły wzrost wielkości katalogów profili użytkowników na dysku. Ten problem został częściowo rozwiązany przez zasady przydziału rozmiaru profilu użytkownika przy użyciu kwot FSRM lub NTFS, folderów mobilnych itp. Ale przy dużej liczbie użytkowników serwera terminali z czasem gromadzi się ogromna liczba katalogów z niepotrzebnymi profilami użytkowników w folderze C: \ Users.

Treść

  • Ręcznie usuń profil użytkownika w systemie Windows
  • Zasady grupy do automatycznego usuwania starych profili
  • Usuwanie serwera ze starych profili użytkowników za pomocą PowerShell

Ręcznie usuń profil użytkownika w systemie Windows

Wielu początkujących administratorów próbuje ręcznie usunąć katalog z profilem użytkownika z folderu C: \ Users. Można to zrobić, jeśli po usunięciu folderu ręcznie usuniesz sekcję profilu użytkownika z linkiem do katalogu w gałęzi rejestru HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ ProfileList. Prawidłowym ręcznym sposobem usunięcia profilu użytkownika w systemie Windows jest otwarcie właściwości systemu, przejdź do Zaawansowane ustawienia systemu -> Profile użytkowników -> Ustawienia, wybierz profil użytkownika z listy użytkowników (kolumna Rozmiar wskazuje rozmiar profilu użytkownika) i kliknij Usuń.

Ale to ręczny sposób, ale chcę automatyzacji.

Zasady grupy do automatycznego usuwania starych profili

System Windows ma wbudowane zasady grupy do automatycznego usuwania starych profili użytkowników starszych niż xx dni. Ta zasada znajduje się w sekcji. Konfiguracja komputera -> Szablony administracyjne -> System -> Profile użytkowników (Konfiguracja komputera -> Szablony administracyjne -> System -> Profile użytkowników) i nazywa się „Usuń profile użytkowników po ponownym uruchomieniu po określonej liczbie dni”(Usuń profile użytkowników starsze niż określona liczba dni po ponownym uruchomieniu systemu). Możesz włączyć tę opcję w lokalnym edytorze zasad (gpedit.msc) lub za pomocą zasad domeny z konsoli GPMC.msc.

Włącz zasadę i określ, po ilu dniach profil użytkownika zostanie uznany za nieaktywny, a „Usługa profilu użytkownika systemu Windows” może automatycznie usunąć taki profil przy następnym uruchomieniu. Zwykle warto określić co najmniej 45-90 dni.

Korzystając z tej zasady, musisz mieć pewność, że po wyłączeniu / ponownym uruchomieniu serwera nie występują problemy z czasem systemowym (czas nie znika), w przeciwnym razie aktywne profile użytkowników mogą zostać usunięte.

Główne problemy z tą metodą automatycznego czyszczenia profili czekają na ponowne uruchomienie serwera i są nieselektywne (nie można zapobiec usunięciu niektórych profili, na przykład kont lokalnych, administratorów itp.). Ponadto ta zasada może nie działać, jeśli niektóre oprogramowanie innych firm (najczęściej jest to program antywirusowy) uzyskuje dostęp do pliku NTUSER.DAT w profilach użytkowników i aktualizuje datę ostatniego użycia.

Usuwanie serwera ze starych profili użytkowników za pomocą PowerShell

Zamiast korzystać z zasad do automatycznego czyszczenia profili omówionych powyżej, możesz użyć prostego skryptu PowerShell, aby znaleźć i usunąć profile nieaktywnych lub zablokowanych użytkowników.

Najpierw spróbujemy obliczyć rozmiar profilu każdego użytkownika w folderze C: \ Users przy użyciu prostego skryptu z artykułu „Rozmiar folderu wyjściowego za pomocą programu PowerShell”:

gci -force 'C: \ Users'-ErrorAction SilentlyContinue | ? $ _ -is [io.directoryinfo] | %
$ len = 0
gci -recurse -force $ _. pełna nazwa -ErrorAction SilentlyContinue | % $ len + = $ _. długość
$ _. pełna nazwa, „0: N2 GB” -f ($ len / 1Gb)
$ suma = $ suma + $ len

„Całkowity rozmiar profilu”, „0: N2 GB” -f (suma $ / 1 Gb)

Całkowity całkowity rozmiar wszystkich profili użytkowników w katalogu C: \ Users wynosi około 22 GB.

Teraz wymienimy użytkowników, których profil nie był używany przez ponad 60 dni. Do wyszukiwania można użyć wartości pola profilu LastUseTime..

Get-WMIObject -class Win32_UserProfile | Gdzie (! $ _. Specjalne) -i ($ _. ConvertToDateTime ($ _. LastUseTime) -lt (Get-Date) .AddDays (-60)) | Zmierz obiekt

Miałem 143 profile nieaktywnych użytkowników na serwerze terminali (całkowity rozmiar około 10 GB).

Aby usunąć wszystkie te profile, po prostu dodaj przekierowanie listy do komendy Remove-WmiObject (przed użyciem skryptu usuwania zaleca się podwójne sprawdzenie jego wyniku za pomocą parametru -WhatIf):

Get-WMIObject -class Win32_UserProfile | Gdzie (! $ _. Specjalne) -i (! $ _. Załadowane) -i ($ _. ConvertToDateTime ($ _. LastUseTime) -lt (Get-Date) .AddDays (-30)) | Usuń-WmiObject -WhatIf

Aby nie usuwać profili niektórych użytkowników, na przykład specjalnych kont usług systemowych i sieciowych, konta administratora lokalnego, użytkowników z aktywnymi sesjami, listy kont wyjątków), należy zmodyfikować skrypt w następujący sposób:

# Lista kont, których profili nie można usunąć
$ ExcludedUsers = „Publiczny”, „zenoss”, „svc”, „użytkownik_1”, „użytkownik_2”
$ LocalProfiles = Get-WMIObject -class Win32_UserProfile | Gdzie (! $ _. Specjalny) -i (! $ _. Załadowany) -i ($ _. ConvertToDateTime ($ _. LastUseTime) -lt (Get-Date) .AddDays (-60))
foreach ($ LocalProfile w $ LocalProfiles)

if (! ($ ExcludedUsers-like $ LocalProfile.LocalPath.Replace („C: \ Users \”, „”)))

$ LocalProfile | Usuń-WmiObject
Write-host $ LocalProfile.LocalPath, „profil usunięty” -ForegroundColor Magenta

Możesz skonfigurować uruchomienie tego skryptu za pomocą skryptu zasad grupy zamykania lub zgodnie z harmonogramem. (Przed skonfigurowaniem automatycznego usuwania profili dokładnie przetestuj skrypt w swoim środowisku!).

Możesz zmodyfikować skrypt, aby automatycznie usuwał użytkowników wszystkich użytkowników dodanych do określonej grupy AD (na przykład grupa DisabledUsers):

$ users = Get-ADGroupMember -Identity DisabledUsers | Foreach $ _. Sid.Value
$ profile = Get-WmiObject Win32_UserProfile
$ profile | Gdzie $ users -eq $ _. Sid | Foreach $ _. Usuń ()