So löschen Sie alte Benutzerprofile in Windows

Admin

Administratoren sollten gelegentlich alte Benutzerprofile (im Ruhestand oder inaktive Benutzer usw.) aus C:\Benutzer auf Windows-Workstations und -Servern löschen. Die Aufgabe zur Bereinigung des Windows-Benutzerprofils wird am häufigsten auf RDS-Terminalservern (Remote Desktop Services) ausgeführt.

Das Hauptproblem bei RDS-Servern ist die stetig wachsende Größe der Benutzerprofilverzeichnisse auf der Festplatte. Dieses Problem wird teilweise durch Benutzerprofilgrößenkontingente mithilfe von FSRM oder gelöst NTFS-Kontingente, Roaming nutzen Profile wie FSLogix oder Benutzerprofildiskette, umgeleitete Ordner usw. Wenn Sie jedoch eine große Anzahl von RDS-Benutzern haben, wird der Ordner C:\Benutzer mit der Zeit eine große Anzahl von Verzeichnissen mit alten (nicht verwendeten) Benutzerprofilen enthalten.

Inhalt:

  • Wie lösche ich ein Benutzerprofil in Windows manuell?
  • GPO: Benutzerprofile löschen, die älter als eine angegebene Anzahl von Tagen sind
  • Löschen Sie alte Benutzerprofile mit PowerShell-Skript

Wie lösche ich ein Benutzerprofil in Windows manuell?

Unter Windows können Sie ein Profil manuell über die Systemsteuerung löschen:

  1. Öffne das Erweiterte Systemeinstellungen (Führen Sie den Befehl aus SystemPropertiesAdvanced ) und gehe zu Benutzerprofil -> Einstellungen;
  2. In diesem Fenster werden alle auf diesem Computer gespeicherten Benutzerprofile (lokal, Domäne und Microsoft-Konten) aufgelistet. Die Größe jedes Benutzerprofils auf der Festplatte ist im aufgeführt Größe Spalte;
  3. Wählen Sie den Benutzer aus, dessen Profil Sie löschen möchten, und klicken Sie auf Löschen Taste. Benutzerprofil manuell in Windows entfernen

Unter Windows 11/10 und Windows Server 2022/2019 können Sie Benutzerprofile über das von der Festplatte löschen Einstellungen App. Gehe zu Konten -> Zugang zur Arbeit und zur Schule (oder Führen Sie die URI-Verknüpfung ausms-settings: otherusers ). Wählen Sie einen Benutzer aus und klicken Sie Entfernen ihre Profildaten vom Computer zu löschen.

ms-settings – Benutzerprofil in Windows 11 entfernen

Wenn ein Benutzerprofil in Windows ordnungsgemäß gelöscht wird, werden das Profilverzeichnis in C:\Benutzer und der Benutzereintrag in der Registrierung gelöscht.

Viele unerfahrene Administratoren versuchen, das Benutzerprofilverzeichnis manuell aus dem Ordner C:\Benutzer zu entfernen. In diesem Fall müssen Sie die Profilreferenz manuell aus der Windows-Registrierung löschen:

  1. Führen Sie den Registrierungseditor aus (regedit.exe);
  2. Gehen Sie zum Registrierungsschlüssel HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList;
  3. Für jeden lokal angemeldeten Benutzer (dies Dem Benutzer muss die Anmeldemethode erlaubt sein bis zum Lokale Anmeldung zulassen GPO-Option) wird ein separater Unterschlüssel mit der SID des Benutzers als Namen erstellt;
  4. Sie können den dem Benutzer entsprechenden Registrierungsschlüssel anhand seiner SID finden, oder Sie können den Inhalt aller Unterschlüssel manuell durchsuchen, bis Sie einen Schlüssel finden, in dem der ProfileImagePath Der Wert verweist auf das Verzeichnis mit dem Benutzerprofil auf der Festplatte (z. B. C:\Users\j.smith);Profilbildpfad in der Registrierung
  5. Löschen Sie diesen Registrierungsschlüssel, um die korrekte Entfernung des Profils abzuschließen.

Sie können das Profil eines bestimmten Benutzers auch mit PowerShell löschen:

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

Dieser Befehl entfernt sowohl das Festplattenverzeichnis als auch das j.smith Benutzerprofilreferenz in der Registrierung HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList.

Dieser Befehl funktioniert sowohl in Windows PowerShell und neue Versionen von PowerShell Core 6.x, 7.x.

Sie können ein Benutzerprofil auf einem Remotecomputer mithilfe von PowerShell Remoting und dem entfernen Invoke-Command-Cmdlet:

$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: Benutzerprofile löschen, die älter als eine angegebene Anzahl von Tagen sind

In Windows gibt es eine integrierte Gruppenrichtlinienoption zum automatischen Löschen von Benutzerprofilen, die älter als xx Tage sind. Sie können diese Option mit aktivieren Editor für lokale Gruppenrichtlinien (gpedit.msc) oder mit dem Domänen-GPO-Verwaltungskonsole (gpmc.msc). In diesem Beispiel wenden wir eine automatische Profilbereinigungsrichtlinie auf Hosts in an die RDS-Farm die sich in einem separaten Behälter befinden (Organisationseinheit, OU) im Active Directory.

Bevor Sie die Bereinigungsprofilrichtlinie auf alle Hosts anwenden, empfehlen wir Ihnen dringend, sie auf einem Testhost zu testen. Versetzen Sie einen der RDSH-Server in den Wartungsmodus (Drain). und testen Sie die Richtlinie darauf.
  1. Suchen Sie die Organisationseinheit mit den Computern/Servern, auf die Sie die Benutzerprofil-Bereinigungsrichtlinie anwenden möchten. Klicken Sie mit der rechten Maustaste auf die Organisationseinheit und wählen Sie sie aus Erstellen Sie ein Gruppenrichtlinienobjekt in dieser Domäne und verknüpfen Sie es hier;Erstellen Sie eine neue Domänen-GPO
  2. Geben Sie den Richtliniennamen an und bearbeiten Sie das Gruppenrichtlinienobjekt.
  3. Navigieren Sie zu Computerkonfiguration -> Administrative Vorlagen -> System -> Benutzerprofile;
  4. Öffnen Sie die Option Löschen Sie Benutzerprofile, die älter als eine angegebene Anzahl von Tagen sind, beim Systemneustart;
  5. Aktivieren Sie die Richtlinie und geben Sie die Anzahl der Tage an, die ein Benutzerprofil als aktiv gilt. Wenn dieser Zeitraum abgelaufen ist, löscht der Windows-Benutzerprofildienst das Profil beim nächsten Neustart automatisch. Es wird empfohlen, den Zeitraum anzugeben 45-90 Tage hier;Gruppenrichtlinie: Benutzerprofile löschen, die älter als eine angegebene Anzahl Tage sind, beim Systemneustart
  6. Nach Ihnen Wenden Sie die neuen Gruppenrichtlinieneinstellungen an, löscht der Benutzerprofildienst auf Ihrem Windows-Server automatisch die alten Benutzerprofile. Benutzerprofile werden beim nächsten Serverneustart gelöscht.
Wenn Sie diese Richtlinie verwenden, müssen Sie sicherstellen, dass beim Stoppen/Neustarten des Servers keine Probleme mit der Systemzeit auftreten (siehe Artikel „Systemzeit und -datum ändern sich nach dem Neustart”). Andernfalls können aktive Benutzerprofile gelöscht werden.

Ein weiterer Nachteil besteht darin, dass Sie nicht verhindern können, dass bestimmte Profile entfernt werden, z. B. lokale Konten, Administratoren usw.

Diese Richtlinie funktionierte in Versionen vor Windows 11/10 und Windows Server 2022/2019 nicht korrekt. Bisher wurde die Inaktivität des Benutzerprofils anhand des Datums bestimmt, an dem die Datei NTUSER.dat geändert wurde. Bei der Installation von Windows-Updates kann der Trusted Installer-Dienst das Änderungsdatum des ändern NTUSER.dat Datei im Profil jedes Benutzers. Daher geht der Win32_UserProfile-Dienst davon aus, dass das Profil kürzlich verwendet wurde.

In modernen Windows-Versionen prüft diese Gruppenrichtlinienoption die Benutzerprofilaktivität anhand der Werte von LocalProfileUnloadTimeLow Und LocalProfileUnloadTimeHigh Parameter unter in HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\

Rufen Sie die Ladezeit des Profils aus dem Registrierungsparameter LocalProfileUnloadTimeHigh ab

Sie können das folgende Skript verwenden, um das zu erhalten LocalProfileLoadTimeLow Und LocalProfileUnloadTimeHigh Registrierungswerte im normalen Zeitformat:

$profilelist = Get-ChildItem „HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList“ foreach ($p in $profilelist) { try { $objUser = (New-Object System. Sicherheit. Rektor. SecurityIdentifier($p. PSChildName)).Translate([System. Sicherheit. Rektor. 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") } sonst { $null } [pscustomobject][ordered]@{ User = $objUser SID = $p. PSChildName Loadtime = $LoadTime UnloadTime = $UnloadTime } }
Erhalten Sie das letzte Lade- und Entladedatum des Profils mit PowerShell

Diese Liste enthält die letzte Ladezeit für jedes Benutzerprofil.

Löschen Sie alte Benutzerprofile mit PowerShell-Skript

Anstatt die oben beschriebene Richtlinie zur automatischen Profilbereinigung zu verwenden, können Sie ein einfaches PowerShell-Skript verwenden, um die Profile von zu finden und zu entfernen Behinderte oder inaktive Benutzer.

Versuchen wir zunächst, die Größe des Profils jedes Benutzers in C:\Benutzer mithilfe eines einfachen Skripts aus dem Artikel zu berechnen Ordnergröße mit PowerShell ermitteln

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)

Die Gesamtgröße aller Benutzerprofile in C:\Benutzer beträgt etwa 32 GB.

Zählen Sie die Gesamtgröße des Benutzerprofils auf dem RDS-Host
Skript ignoriert Symbolische Windows-Links (Symlinks) bei der Berechnung der Benutzerprofilgröße.

Sehen wir uns die Liste der Benutzer an, deren Profile länger als 60 Tage nicht verwendet wurden. Sie können den Wert in verwenden LastUseTime Feld des Profils, um sie zu finden.

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

Es stellte sich heraus, dass ich 127 inaktive Benutzerkonten auf meinem RDS-Host hatte (mit einer Gesamtgröße der Profile von etwa 18 GB).

Rufen Sie die Liste der inaktiven Benutzer nach Profil LastUseTime auf RDSH ab

Das folgende PowerShell-Skript listet die Details von Benutzerprofilen auf, die seit mehr als 60 Tagen nicht aktualisiert wurden. Das Drehbuch wandelt die SID des Benutzers in einen Namen um, berechnet die Größe des Profils jedes Benutzers und zeigt eine resultierende Tabelle an:

$allprofilesinfo = @() $OldProfiles=Get-WMIObject -class Win32_UserProfile | Wobei {(!$_.Special) -and ($_.ConvertToDateTime($_.LastUseTime) -lt (Get-Date).AddDays(-60))} Foreach ($OldProfile in $OldProfiles) {$objSID = New-Object System. Sicherheit. Rektor. SecurityIdentifier ($OldProfile. SID) $objUser = $objSID.Translate( [System. Sicherheit. Rektor. NTAccount]) $userinfo = New-Object PSObject -Property @{ userName = $objUser. Wert ProfilePath = $OldProfile.localpath LastUsedDate = $OldProfile. ConvertToDateTime($OldProfile. LastUseTime) FolderSize = "{0:N2} GB" -f ((gci –force $OldProfile.localpath –Recurse -ErrorAction SilentlyContinue| Measure Länge -s).sum / 1Gb) } $allprofilesinfo += $userinfo } $allprofilesinfo
Powershell: Lokale Profilinformationen auflisten

Um alle diese Benutzerprofile zu entfernen, reicht es aus, die Benutzerliste an die weiterzuleiten Entfernen-WmiObject Befehl (es wird empfohlen, dass Sie die Ausgabe des Skripts mit dem überprüfen -Was ist, wenn Parameter, bevor Sie ihn ausführen):

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

Wie bereits erwähnt, kann der Trusted Installer-Dienst bei der Installation einiger Windows-Updates das Änderungsdatum der Datei NTUSER.dat im Profil jedes Benutzers ändern.

Der Screenshot oben zeigt, dass alle Profile etwa gleichzeitig geändert wurden. Überprüfen Sie das Datum der letzten in Windows installierten Updates:

gwmi win32_quickfixengineering |sort installedon |select InstalledOn -Last 1

Oder mit der PSWindowsUpdate-Modul:

Get-WUHistory | Select-Object -First 10

Es wird höchstwahrscheinlich mit dem Datum zusammenfallen, an dem die Profile geändert wurden. Daher können Sie in früheren Windows-Versionen eine Liste inaktiver Profile abrufen, indem Sie ein anderes Skript verwenden, das dies überprüft letzte Schreibzeit Attribut des Profilverzeichnisses des Benutzers:

$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 }

Um das Löschen der Profile einiger Benutzer (z. B System Und Netzwerkdienst Konten, a lokaler Administrator Konto, Konten von Benutzern mit aktiven Sitzungen und andere Konten aus dem Ausnahme Liste) können Sie das Skript wie folgt ändern:

#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
}
}

Du kannst Führen Sie dieses PowerShell-Skript über ein GPO aus beim Herunterfahren oder mit einem PowerShell-Skript im Taskplaner.

Es wird empfohlen, das Skript in Ihrer Umgebung zu testen, bevor Sie die automatische Profillöschung konfigurieren!

Sie können das Skript so ändern, dass alle Benutzerprofile automatisch gelöscht werden der spezifischen AD-Gruppe hinzugefügt. Sie möchten beispielsweise die Profile von Benutzern löschen, die gekündigt haben. Fügen Sie diese Konten einfach zum hinzu BehinderteBenutzer Gruppe und führen Sie das Skript auf dem Zielhost aus:

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

PowerShell: Paketquelle kann nicht aufgelöst werden
PowerShell: Paketquelle kann nicht aufgelöst werden

Wenn Sie versuchen, PowerShell-Module aus der Online-PSGallery zu installieren, wird möglicherwei...

PowerShell-Module im Offline-Modus installieren (ohne Internetzugang)
PowerShell-Module im Offline-Modus installieren (ohne Internetzugang)

Die beliebtesten PowerShell-Module werden online über die offizielle PowerShell-Galerie installie...

PowerShell SecretManagement-Modul: Anmeldeinformationen und Geheimnisse sicher verwalten
PowerShell SecretManagement-Modul: Anmeldeinformationen und Geheimnisse sicher verwalten

Microsoft hat kürzlich ein sehr nützliches veröffentlicht SecretManagement PowerShell-Modul. Sie ...