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
\Google\Chrome\User Data\Default\Media 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
\Microsoft\Office\15.0\Lync\Tracing\OCAddin\
\Tracing\uccapi*.*

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
\Microsoft\Windows\Temporary Internet Files

Diese Pfade sind in der Regel auch

 

\Microsoft\Windows Live Mail
\Microsoft\Windows Live Contacts

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.

Weitere Links