Clean-UserProfiles
Terminal Server sind eine schöne Sache, aber letztens wollte ich mal wieder einen Server patchen und musste mit Erschrecken feststellen, dass die Festplatte fast voll war. Das war doch am Anfang nicht so und so habe ich mit WinDirStat einmal nachgeschaut, wo die Platzfresser sind. Und es war sehr schnell offensichtlich, dass die Benutzerprofile einen ganz großen Anteil daran haben.
Was ist drin in "AppData"?
Ein Blick über viele Benutzerverzeichnisse zeigt, dass sich in dem versteckten Verzeichnis die unterschiedlichsten Daten ansammeln. Einige davon sind offensichtlich temporärer Natur. Andere sicher nicht zu einfach zu löschen, z.B.
Benutzerprofil unter APPDATA\LOCAL | Inhalt | Löschbar |
---|---|---|
\TechSmith\Camtasia Studio\CrashDumps |
Bei mir mehrere 250MB große Dumpfiles des Camtasia Recorder |
Ja |
\Google\Chrome\User
Data\Default\Cache |
Hier legt der Chrome Browser seinen Cache ab. Bei mir waren das 800 MB ! |
Ja |
\Microsoft\OneNote |
OneNote Cache und Sicherungen |
Besser nicht |
\Microsoft\Outlook |
Hier liegt auf jeden Fall eine OST-Datei |
Nein |
\Microsoft\Office\15.0\Lync\Tracing |
Wer kein Tracing braucht, kann hier schnell mal 300 MB und mehr gewinnen. Das Verzeichnis "Tracing" auf der Wurzel ist von Lync 2010 |
Ja |
\Microsoft\Terminal Server Client\Cache |
Der Bitmap-Cache des RDP-Clients ist mit 300 MB auch nicht kein |
Ja |
\Microsoft\Windows\WebCache |
Diese Pfade sind in der Regel auch |
|
\Microsoft\Windows
Live Mail |
Bei mir schlummerte hier ein Datenbestand von ca. 1,9GB an Mails und Kontakten, die ich seit 2011 nicht mehr genutzt aber nie deinstalliert hatte. |
Vielleicht |
\FontCache*.dat" |
Hier sammelt der Windows Font Service pro User temporäre Daten a 8 MB, die immer wieder dynamisch aufgebaut aber nicht wieder gelöscht werden |
Ja |
\Temp\*.* |
Das klassische lokale TEMP-Verzeichnis |
Ja |
\Microsoft\Windows\WER\ReportArchive\*.* |
Wenn Sie alte Windows Error Report Dateien nicht mehr brauchen, kann dies auch weg |
Ja |
\Mozilla\Firefox\Profiles\*.default\ |
Firefox hat auch ein Cache-Verzeichnis |
|
\Google\Chrome\User Data\Default\Cache\ |
Ebenso die Chrome-Fraktion. Auf Terminal Servern sollten Sie sicherstellen, dass nicht jeder Anwender seinen eigenen Chrome im UserData installiert. |
Ja |
Und dann gibt es noch ein paar Verzeichnisse außerhalb von "APPDATA\Local", die ggfls. mit bereinigt werden könnten. WinDirStat zeigt das gut an. Anhand der Farben und der Gruppierung nach Erweiterungen lässt sich sehr einfach erkennen, welche Gleichmäßigkeit es gibt.
Selbst die wenigen User haben schon 1GB an "Terminal Server Cache" Files und das ist ein kleiner Server.
Auch wenn Sie die verschiedenen Dateien und Verzeichnisse löschen, werden diese durch die Applikation natürlich wieder aufgebaut. Es ist aber durchaus interessant z.B. auf einem Terminal Server vor einem Backup z.B. so die Datenmenge zu reduzieren. Sie sollten dennoch pro Applikation schauen, ob die temporären Bereiche hier nicht per Konfiguration angepasst werden können. Warum sollten Browser mehrere Gigabyte an Cache-Daten ablegen, wenn die Internet-Verbindung schnell ist oder sie sogar einen Proxy haben? Etwas weniger Cache reicht und entlastet zumindest Terminal Server.
Oft findet man auch lange vergessene Programme. Bei mir schlummerte auf "\Local\Microsoft\Windows Live Mail" z.B. der Datenbestand einer alten Installation von 2011 mit 1,4GB Mails.
Mein eigenes Profil habe ich so um ca. 13 GB verkleinert. Wer vielleicht nur ein Tablet mit einer kleinen SSD hat, ist das eine nennenswerte Menge.
Beschränken mit Bordmittel
Zuerst habe ich natürlich etwas geschaut, wie man vielleicht mit Bordmitteln hier etwas erreichen kann. Einige Ansätze gibt es ha
- Cleanmgr.exe
Diese keine EXE ist der "Bereinigungsassistent", der auch per Taskplaner gestartet werden könnte. Er bereinigt zwar schon die ein oder andere Information aber an die Benutzerverzeichnisse geht er nicht wirklich ran. - Gruppenrichtlinie für Profilgröße
Hierüber kann ein Administrator bestimmen, wie groß das Benutzerprofil werden kann, Quasi eine Art Software-Quota, bei der Windows die Größer überwacht und den Benutzer informiert und zum Löschen anhält. Aber welcher Benutzer kommt damit zurecht, zumal die Datenmengen ja im versteckten Verzeichnis "APPDATA" liegen ? - Die Gruppe "Gäste"
Wenn die Benutzerkonten lokal auf dem dem Terminal Server auch in der Gruppe "Gäste" sind, dann wirkt eine besondere Funktion von Windows. Wenn sich der Anwender "abmeldet", dann wird das Profil gleich mit entsorgt. Das spart mächtig Platz, aber die Anwender sollten dann entweder ein "Roaming Profile" haben oder die wesentlichen Verzeichnisse sollten auf einen Dateiserver umgeleitet sein oder die Anwender sollten ihre erzeugten Daten auf jeden Fall auf einem dauerhaften Ort speichern.
Alle drei Dinge sind aber nicht wirklich hilfreich bei der Bereinigung eines Servers und insbesondere der Benutzerprofile.
Löschen per Skript
Also muss man wieder ein Skript her und nachdem ich mir ein paar Server angeschaut habe, habe ich einige Quellen gefunden, die einfach mal so gelöscht werden können und letztlich doch ein eigenes PowerShell-Script gemacht.
$pathlist = Get-childItem 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList' ` | % {Get-ItemProperty $_.pspath } ` | Select profileImagePath foreach ($path in $pathlist) { write-host "Processing $path" Remove-Item -Recurse -Force ($path.profileImagePath+"\AppData\Local\Microsoft\Windows\Temporary Internet Files\*.*") Remove-Item -Recurse -Force ($path.profileImagePath+"\AppData\Local\FontCache*.dat") Remove-Item -Recurse -Force ($path.profileImagePath+"\AppData\Local\Microsoft\Terminal Server Client\Cache\*.*") Remove-Item -Recurse -Force ($path.profileImagePath+"\AppData\Local\Microsoft\Windows\WebCache\*.*") Remove-Item -Recurse -Force ($path.profileImagePath+"\AppData\Local\Temp\*.*") Remove-Item -Recurse -Force ($path.profileImagePath+"\AppData\Local\Microsoft\Windows\WER\ReportArchive\*.*") Remove-Item -Recurse -Force ($path.profileImagePath+"\AppData\Local\Mozilla\Firefox\Profiles\*.default\") Remove-Item -Recurse -Force ($path.profileImagePath+"\AppData\Roaming\Microsoft\Office\*.tmp") Remove-Item -Recurse -Force ($path.profileImagePath+"\AppData\Local\Google\Chrome\User Data\Default\Cache\*") Remove-Item -Recurse -Force ($path.profileImagePath+"\AppData\Local\Google\Chrome\User Data\Default\Media Cache\*") Remove-Item -Recurse -Force ($path.profileImagePath+"\AppData\Local\Microsoft\Office\15.0\Lync\Tracing\OCAddin\*.*") Remove-Item -Recurse -Force ($path.profileImagePath+"\AppData\Local\Microsoft\Office\15.0\Lync\Tracing\*.*") Remove-Item -Recurse -Force ($path.profileImagePath+"\Tracing\uccapi*.*") }
Es gibt hier natürlich keine "schöne" Ausgabe und wenn ein Verzeichnis nicht vorhanden ist, wird eine rote Fehlermeldung ausgegeben. Auch zähle ich nicht vorher die Dateien um danach den gewonnenen Platz anzugeben. Es ist ein einfaches Script, welche ich sogar per Zwischenablage einfach in eine Admin-PowerShell kopieren und ausführen kann.
Cleanup auf Servern
Aber auch andere Stelle "müllen" sich gerne mal zu. Hier eine Exchange VM in meiner Farm mit einem Exchange 2016 Server, auf dem keine Benutzer sind. Allein durch den Betrieb und die Selbstüberwachung werden die umfangreiche Protokolle geschrieben, die einige Gigabytes belegen.
Speziell für DemoVMs u.a. kann hier eine "schnelle Löschung" die VMs klein halten. Gerade die Logdateien des IIS werden durch keinen anderen Prozess gelöscht.
Weitere Links
- WinDirStat
- PowerShell
- Terminal Server
- Gruppenrichtlinien
- http://community.spiceworks.com/scripts/show/782-User-cleanup
- http://blogs.technet.com/b/heyscriptingguy/archive/2011/11/10/use-PowerShell-to-find-User-profiles-on-a-computer.aspx
- https://gallery.technet.microsoft.com/Automated-Disk-Cleanup-29ebb30b
- Local Service system profile
grown to extremely large size
https://social.technet.microsoft.com/Forums/windowsserver/en-US/3795364f-b66c-43ae-82d3-8ed5eb1aa2ce/local-service-system-profile-grown-to-extremely-large-size
"these files are per-User, so if many people log on to a server you could end up with many of these files. Unfortunately, the Font Cache service does not automatically delete old per-User cache files so für now I'm afraid you'll have to work around this on your own. für example, you could create a scheduled maintenance task that automatically deletes all the FontCache-S-*.dat files if their total size exceeds a certain amount. This is a safe workaround. - Use Some (Relatively) unknown Command-Line Switches für Disk Cleanup
https://technet.microsoft.com/en-us/magazine/ff742191.aspx