Jak usunąć stare profile użytkowników w systemie Windows?

Administratorzy powinni od czasu do czasu usuwać stare profile użytkowników (użytkownicy na emeryturze lub nieaktywni itp.) z folderu C:Users na stacjach roboczych i serwerach z systemem Windows. Zadanie czyszczenia profilu użytkownika systemu Windows jest najczęściej wykonywane na serwerach terminali usług pulpitu zdalnego (RDS).

Głównym problemem serwerów RDS jest stały wzrost rozmiaru katalogów profili użytkowników na dysku twardym. Ten problem jest częściowo rozwiązany przez przydziały rozmiaru profilu użytkownika przy użyciu przydziałów FSRM lub NTFS, przy użyciu profili mobilnych, takich jak FSLogix lub User Profile Disk, przekierowanych folderów itp. Jeśli jednak masz dużą liczbę użytkowników RDS, z czasem folder C:Users będzie zawierał dużą liczbę katalogów ze starymi (nieużywanymi) profilami użytkowników.

Advertisement

Jak ręcznie usunąć profil użytkownika w systemie Windows?

W systemie Windows możesz ręcznie usunąć profil z Panelu sterowania:

  1. Otworzyć Zaawansowane ustawienia systemu (uruchom polecenie SystemPropertiesAdvanced ) i przejdź do Profile użytkowników -> Ustawienia;
  2. To okno zawiera listę wszystkich profili użytkowników (lokalnych, domenowych i Microsoft) przechowywanych na tym komputerze. Rozmiar każdego profilu użytkownika na dysku jest podany w pliku Rozmiar
  3. Wybierz użytkownika, którego profil chcesz usunąć i kliknij Usunąć przycisk.

W systemach Windows 11/10 i Windows Server 2022/2019 można usuwać profile użytkowników z dysku za pomocą Ustawienia aplikacja. iść do Konta -> Dostęp do pracy i szkoły (lub uruchom skrót URI ms-settings:otherusers ). Wybierz użytkownika i kliknij Usunąć usunięcia swoich danych profilowych z komputera.

ms-settings - usuń profil użytkownika w systemie Windows 11

Po prawidłowym usunięciu profilu użytkownika w systemie Windows usuwany jest katalog profilu w C:Users i wpis użytkownika w rejestrze.

Advertisement

Wielu początkujących administratorów próbuje ręcznie usunąć katalog profilu użytkownika z folderu C:Users. W takim przypadku konieczne będzie ręczne usunięcie odniesienia do profilu z rejestru systemu Windows:

  1. Uruchom Edytor rejestru (regedit.exe);
  2. Przejdź do klucza rejestru HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionLista profili
  3. Dla każdego użytkownika zalogowanego lokalnie (ta metoda logowania musi być dozwolona dla użytkownika przez Zezwalaj na logowanie lokalne opcji GPO), tworzony jest osobny podklucz z identyfikatorem SID użytkownika jako nazwą;
  4. Możesz znaleźć klucz rejestru odpowiadający użytkownikowi według identyfikatora SID lub możesz ręcznie przeglądać zawartość wszystkich kluczy podrzędnych, aż znajdziesz klucz, w którym Ścieżka obrazu profilu wartość wskazuje katalog z profilem użytkownika na dysku (np. C:Usersj.smith);profileimagepath w rejestrze
  5. Usuń ten klucz rejestru, aby zakończyć prawidłowe usuwanie profilu.

Możesz także usunąć profil określonego użytkownika za pomocą PowerShell:

Get-CimInstance -Class Win32_UserProfile | Where-Object { $_.LocalPath.split(‘’)[-1] -eq 'j.smith' } | Remove-CimInstance

To polecenie usuwa zarówno katalog dysku twardego, jak i plik j.smith odwołanie do profilu użytkownika w rejestrze HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionProfileList.

Możesz usunąć profil użytkownika na komputerze zdalnym za pomocą usługi PowerShell Remoting i polecenia cmdlet Invoke-Command:

Advertisement

$compname="mun-wks92s3"
$user = "j.smith"
Invoke-Command -ComputerName $compname -ScriptBlock {
param($user)
Get-CimInstance -Class Win32_UserProfile | Where-Object { $_.LocalPath.split(‘’)[-1] -eq $user } | Remove-CimInstance
} -ArgumentList $user

GPO: Usuń profile użytkowników starsze niż określona liczba dni

W systemie Windows istnieje wbudowana opcja zasad grupy umożliwiająca automatyczne usuwanie profili użytkowników starszych niż xx dni. Możesz włączyć tę opcję za pomocą lokalnego Edytora zasad grupy (gpedit.msc) lub za pomocą konsoli zarządzania GPO domeny (gpmc.msc). W tym przykładzie zastosujemy zasady automatycznego czyszczenia profilu do hostów w farmie RDS, które znajdują się w oddzielnym kontenerze (jednostka organizacyjna, jednostka organizacyjna) w usłudze Active Directory.

  1. Znajdź jednostkę organizacyjną zawierającą komputery/serwery, do których chcesz zastosować zasady czyszczenia profilu użytkownika. Kliknij prawym przyciskiem myszy jednostkę organizacyjną i wybierz Utwórz obiekt zasad grupy w tej domenie i połącz go tutaj;utwórz nową domenę gpo
  2. Określ nazwę polityki i edytuj GPO;
  3. Przejdź do Konfiguracja komputera -> Szablony administracyjne -> System -> Profile użytkowników;
  4. Otwórz opcję Usuń profile użytkowników starsze niż określona liczba dni podczas ponownego uruchamiania systemu;
  5. Włącz politykę i określ liczbę dni, przez które profil użytkownika jest uważany za aktywny. Po upływie tego okresu Usługa profilu użytkownika systemu Windows automatycznie usunie profil przy następnym uruchomieniu. Zaleca się określenie okresu 45-90 dni tutaj;Zasady grupy: usuwaj profile użytkowników starsze niż określona liczba dni po ponownym uruchomieniu systemu
  6. Po zastosowaniu nowych ustawień zasad grupy usługi profili użytkowników w systemie Windows Server automatycznie usuną stare profile użytkowników. Profile użytkowników zostaną usunięte po ponownym uruchomieniu serwera.
Jeśli korzystasz z tej polityki, musisz upewnić się, że nie ma problemów z czasem systemowym, gdy serwer jest zatrzymywany/restartowany (sprawdź artykuł „Czas i data systemowa zmieniają się po restarcie”). W przeciwnym razie aktywne profile użytkowników mogą zostać usunięte.

Inną wadą jest to, że nie można zapobiec usunięciu niektórych profili, takich jak konta lokalne, administratorzy itp.

Ta zasada nie działała poprawnie w wersjach wcześniejszych niż Windows 11/10 i Windows Server 2022/2019. Wcześniej brak aktywności profilu użytkownika był określany na podstawie daty modyfikacji pliku NTUSER.dat. Podczas instalowania aktualizacji systemu Windows usługa Zaufany instalator może zmienić datę modyfikacji pliku NTUSER.dat plik w profilu każdego użytkownika. W rezultacie usługa Win32_UserProfile myśli, że profil był ostatnio używany.

W nowoczesnych wersjach systemu Windows ta opcja zasad grupy sprawdza aktywność profilu użytkownika pod kątem wartości LocalProfileUnloadTimeLow oraz LocalProfileUnloadTimeHigh parametry w HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionProfileList

Pobierz czas ładowania profilu z parametru rejestru LocalProfileUnloadTimeHigh

Możesz użyć następującego skryptu, aby uzyskać LocalProfileLoadTimeLow oraz LocalProfileUnloadTimeHigh wartości rejestru w normalnym formacie czasu:

$profilelist = Get-ChildItem "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionProfileList"
foreach ($p in $profilelist) { try { $objUser = (New-Object System.Security.Principal.SecurityIdentifier($p.PSChildName)).Translate([System.Security.Principal.NTAccount]).value } catch { $objUser = "[UNKNOWN]" } Remove-Variable -Force LTH,LTL,UTH,UTL -ErrorAction SilentlyContinue $LTH = '{0:X8}' -f (Get-ItemProperty -Path $p.PSPath -Name LocalProfileLoadTimeHigh -ErrorAction SilentlyContinue).LocalProfileLoadTimeHigh $LTL = '{0:X8}' -f (Get-ItemProperty -Path $p.PSPath -Name LocalProfileLoadTimeLow -ErrorAction SilentlyContinue).LocalProfileLoadTimeLow $UTH = '{0:X8}' -f (Get-ItemProperty -Path $p.PSPath -Name LocalProfileUnloadTimeHigh -ErrorAction SilentlyContinue).LocalProfileUnloadTimeHigh $UTL = '{0:X8}' -f (Get-ItemProperty -Path $p.PSPath -Name LocalProfileUnloadTimeLow -ErrorAction SilentlyContinue).LocalProfileUnloadTimeLow $LoadTime = if ($LTH -and $LTL) { [datetime]::FromFileTime("0x$LTH$LTL") } else { $null } $UnloadTime = if ($UTH -and $UTL) { [datetime]::FromFileTime("0x$UTH$UTL") } else { $null } [pscustomobject][ordered]@{ User = $objUser SID = $p.PSChildName Loadtime = $LoadTime UnloadTime = $UnloadTime }
} 

Uzyskaj datę ostatniego załadowania i usunięcia profilu za pomocą programu PowerShell

Ta lista zawiera czas ostatniego logowania dla każdego profilu użytkownika.

Usuń stare profile użytkowników za pomocą skryptu PowerShell

Zamiast korzystać z opisanych powyżej zasad automatycznego czyszczenia profilu, możesz użyć prostego skryptu PowerShell, aby znaleźć i usunąć profile wyłączonych lub nieaktywnych użytkowników.

Najpierw spróbujmy obliczyć rozmiar profilu każdego użytkownika w C:Users za pomocą prostego skryptu z artykułu Pobieranie rozmiaru folderu za pomocą PowerShell

gci -force ‘C:Users’-ErrorAction SilentlyContinue | Where { !($_.Attributes -match " ReparsePoint") }| ? { $_ -is [io.directoryinfo] } | % {
$len = 0
gci -recurse -force $_.fullname -ErrorAction SilentlyContinue | % { $len += $_.length }
$_.fullname, ‘{0:N2} GB’ -f ($len / 1Gb)
$sum = $sum + $len
}
"Total size of profiles",'{0:N2} GB' -f ($sum / 1Gb)

Advertisement

Łączny rozmiar wszystkich profili użytkowników w C:Users wynosi około 32 GB.

policz całkowity rozmiar profilu użytkownika na hoście RDS

Zobaczmy listę użytkowników, których profile nie były używane przez ponad 60 dni. Możesz użyć wartości w Czas ostatniego użycia polu profilu, aby je znaleźć.

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

Okazało się, że mam 127 nieaktywnych kont użytkowników na moim hoście RDS (o łącznej wielkości profilu około 18 GB).

uzyskaj listę nieaktywnych użytkowników według profilu LastUseTime na RDSH

Poniższy skrypt programu PowerShell zawiera szczegółowe informacje o profilach użytkowników, które nie były aktualizowane przez ponad 60 dni. Skrypt konwertuje identyfikator SID użytkownika na nazwę, oblicza rozmiar profilu każdego użytkownika i wyświetla wynikową tabelę:

$allprofilesinfo = @()
$OldProfiles=Get-WMIObject -class Win32_UserProfile | Where {(!$_.Special) -and ($_.ConvertToDateTime($_.LastUseTime) -lt (Get-Date).AddDays(-60))}
Foreach ($OldProfile in $OldProfiles) {$objSID = New-Object System.Security.Principal.SecurityIdentifier ($OldProfile.SID) $objUser = $objSID.Translate( [System.Security.Principal.NTAccount]) $userinfo = New-Object PSObject -Property @{ userName = $objUser.Value ProfilePath = $OldProfile.localpath LastUsedDate = $OldProfile.ConvertToDateTime($OldProfile.LastUseTime) FolderSize = "{0:N2} GB" -f ((gci –force $OldProfile.localpath –Recurse -ErrorAction SilentlyContinue| measure Length -s).sum / 1Gb) } $allprofilesinfo += $userinfo }
$allprofilesinfo

powershell: wyświetla informacje o profilach lokalnych

Aby usunąć wszystkie te profile użytkowników, wystarczy potokować listę użytkowników do the Usunąć-WmiObject komenda (zaleca się sprawdzenie danych wyjściowych skryptu z parametrem -WhatIf przed jego uruchomieniem):

Get-WMIObject -class Win32_UserProfile | Where {(!$_.Special) -and (!$_.Loaded) -and ($_.ConvertToDateTime($_.LastUseTime) -lt (Get-Date).AddDays(-30))} | Remove-WmiObject –WhatIf

Jak wspomniano wcześniej, podczas instalowania niektórych aktualizacji systemu Windows usługa Zaufany instalator może zmienić datę modyfikacji pliku NTUSER.dat w profilu każdego użytkownika.

Powyższy zrzut ekranu pokazuje, że wszystkie profile zostały zmienione mniej więcej w tym samym czasie. Sprawdź datę ostatnich aktualizacji zainstalowanych w systemie Windows:

gwmi win32_quickfixengineering |sort installedon  |select InstalledOn -Last 1

Lub za pomocą modułu PSWindowsUpdate:

Get-WUHistory | Select-Object -First 10

Najprawdopodobniej zbiegnie się to z datą zmiany profili. Dlatego we wcześniejszych wersjach systemu Windows można uzyskać listę nieaktywnych profili za pomocą innego skryptu, który sprawdza czas ostatniego zapisu atrybut katalogu profilu użytkownika:

$USERS= (Get-ChildItem -directory -force 'C:Users' | Where { ((Get-Date) — $_.lastwritetime).days -ge 60 } | % {'c:users' + $_.Name})
foreach ($User in $USERS) {
Get-WMIObject -class Win32_UserProfile | Where {(!$_.Special) -and (!$_.Loaded) -and ($_.LocalPath -eq $User)} | Remove-WmiObject WhatIf }

Aby uniknąć usuwania profili niektórych użytkowników (np System oraz Usługa sieciowa konta, A administrator lokalny konto, konta użytkowników posiadających aktywne sesje oraz inne konta z wyjątek list), możesz zmodyfikować skrypt w następujący sposób:

Advertisement

#The list of accounts, which profiles must not be deleted
$ExcludedUsers ="Public","zabbix_agent","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, "profile deleted” -ForegroundColor Magenta
}
}

Możesz uruchomić ten skrypt PowerShell za pośrednictwem obiektu GPO podczas zamykania systemu lub za pomocą skryptu PowerShell w Harmonogramie zadań.

Zaleca się przetestowanie skryptu w swoim środowisku przed skonfigurowaniem automatycznego usuwania profilu!

Możesz zmodyfikować skrypt, aby automatycznie usuwał wszystkie profile użytkowników dodane do określonej grupy AD. Na przykład chcesz usunąć profile użytkowników, którzy zrezygnowali. Po prostu dodaj te konta do Użytkownicy niepełnosprawni group i uruchom skrypt na hoście docelowym:

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

Advertisement