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:
- Öffne das Erweiterte Systemeinstellungen (Führen Sie den Befehl aus
SystemPropertiesAdvanced
) und gehe zu Benutzerprofil -> Einstellungen; - 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;
- Wählen Sie den Benutzer aus, dessen Profil Sie löschen möchten, und klicken Sie auf Löschen Taste.
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](/f/47fce9c65d8068583defb099959309d4.webp)
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:
- Führen Sie den Registrierungseditor aus (
regedit.exe
); - Gehen Sie zum Registrierungsschlüssel HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList;
- 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;
- 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
); - 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.
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.
- 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;
- Geben Sie den Richtliniennamen an und bearbeiten Sie das Gruppenrichtlinienobjekt.
- Navigieren Sie zu Computerkonfiguration -> Administrative Vorlagen -> System -> Benutzerprofile;
- Öffnen Sie die Option Löschen Sie Benutzerprofile, die älter als eine angegebene Anzahl von Tagen sind, beim Systemneustart;
- 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;
- 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.
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](/f/c63be375e201f8691075f787c19161ff.webp)
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](/f/67fb23c4b181fc44c5fbb2723f132647.webp)
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](/f/f0e1917577fdf18e4a82b7faf2dc5d98.webp)
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](/f/47d97b07b19b1b534172b7fd5c119883.webp)
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](/f/06e01a35106b52684da5e3a30297ba13.webp)
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
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()}