Gerade habe ich einem Kunden detailliert erklärt, warum es – aus meiner Sicht – Sinn macht, die originale Konfiguration für die Ablage der temporären Dateien auf einem Windows-System zu ändern – warum also nicht gleich einen kleinen Beitrag dazu schreiben. Da sowohl das Betriebssystem als auch fast jedes Programm temporäre Dateien (zur Laufzeit) erzeugen, diese aber in den seltensten Fällen auch wieder entfernen, belegen selbige nach einiger Zeit eine Menge Speicherplatz – und das an verschiedenen Stellen.

Im Standard speichert Windows (bei Client und Server identisch) die temporären Dateien an zwei verschiedenen Orten, abhängig ob für das System oder den Benutzer. Das System speichert seine temporären Dateien unter dem Pfad

%WinDir%\Temp

für den Benutzer wird immer folgender Pfad

%UserProfile%\Lokale Einstellungen\Temp

verwendet. Diese Pfade stehen dabei als Umgebungsvariablen (Systemeigenschaften, Erweitert, Umgebungsvariablen) allen Anwendungen zur Verfügung:

%TEMP% und %TMP%

Alle Programme, die temporäre Dateien erzeugen, nutzen diese Variablen, um ihre Daten dort abzulegen. Es wird schnell ersichtlich, dass Systemprozesse (z.B. Windows Update) und Programme ihre temporären Dateien, abhängig vom angemeldeten Benutzer, an unterschiedlichen Stellen “verteilen” – eine unschöne Sache, wie ich finde.

Aus diesem Grund habe ich für unsere betreuten Systeme  eine Lösung geschaffen, die diese Problematik sauber und einfach in den Griff bekommt. Da ich ja ein Fan automatischer Lösungen bin, besteht deren Umsetzung aus einer Kombination von Skripten und der Anwendung von Gruppenrichtlinien. Wer keine Domäne hat, kann die beiden folgenden Skripte aber auch lokal ausführen.

Download der Skripte: Temp-System.vbs und Temp-User.vbs

Die Einbindung der Skripte in Gruppenrichtlinien habe ich bereits in dem Artikel VBS Skripte für eine Windows 2003 Domäne beschrieben, bei einer Windows Server 2008 (R2) Domäne werden diese nicht mehr benötigt, da die Registry-Einstellungen direkt über die Gruppenrichtlinien-Erweiterungen für Windows Server 2008 vorgenommen werden können.

Ausführung

Das erste Skript Temp-System.vbs sorgt dafür, dass auf dem %SystemDrive% (typischerweise Laufwerk C: ) ein neuer Ordner Temp erstellt wird. Bei der Ausführung durch eine Gruppenrichtlinie erfolgt selbige vor der Benutzeranmeldung beim Starten des Systems (Computerkonfiguration). Anschließend werden die beiden System-Umgebungsvariablen TEMP und TMP in der Registry auf diesen Wert gesetzt:

HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\
“TEMP”=REG_SZ:%SystemDrive%\Temp
“TMP”=REG_SZ:%SystemDrive%\Temp

Das zweite Skript Temp-User.vbs ist von dem ersten abhängig, bei Ausführung durch eine Gruppenrichtlinie erfolgt selbige nach der Benutzeranmeldung. Dabei wird in dem neu erstellten Ordner ein Unterordner mit dem Benutzernamen erzeugt:

%SystemDrive%\Temp\%Username%

Dieser Ordner wird nun wiederum im Benutzer-abhängigen Teil der Registry aktualisiert:

HKCU\Environment
“TEMP”=REG_SZ:%SystemDrive%\Temp\%Username%
“TMP”=REG_SZ:%SystemDrive%\Temp\%Username%

Bei Anzeige der konfigurierten Umgebungsvariablen sollte dann folgende Einstellung erscheinen:

Die Werte können auch in einer Kommandozeilenbox mit dem Befehl set abgefragt und kontrolliert werden.

Von nun an werden alle System-temporären Dateien unter %SystemDrive%\Temp und alle Benutzer-temporären Dateien unter %SystemDrive%\Temp\%Username% abgelegt. Ein zentraler Ort, von dem diese wiederum schnell entfernt und das System gesäubert werden kann. Diese Aufgabe kann bspw. ein Abmelde-Skript (Batch-Datei) mit folgendem Inhalt erfüllen:

@echo off
del %SystemDrive%\Temp\%Username%\*.* /F /S /Q
rd %SystemDrive%\Temp\%Username% /S /Q

Zugegeben, für einen einzelnen Benutzer an einem einzelnen Computer macht dieser ganze Aufwand relativ wenig Sinn, dennoch vereinfacht es die “Säuberung” des Systems von nicht benötigten, temporären Dateien.

Exkurs Terminalserver

Ganz anders verhält es sich aber bei der Anmeldung von mehreren Benutzern an einem System – zum Beispiel bei einem Terminalserver. In größeren Umgebungen ist es sinnvoll Server-gespeicherte Terminalserverprofile für die Benutzer zu verwenden – bei Einsatz von NLB (Network Load Balancing) in Terminalserver-Farmen ist dies sogar Voraussetzung. Allerdings werden hier die Benutzerprofile beim Anmelden auf den Terminalserver kopiert und nach der Abmeldung zurück synchronisiert und wieder gelöscht. Leider habe ich es schon erlebt, dass einige Anwendungen temporäre Dateien erstellt haben, die trotz Beendigung der Anwendung noch ein Datei-Handle besaßen und nicht vom Terminalserver bei der Abmeldung gelöscht werden konnten. Als Folge wurde auch das Profilverzeichnis nicht gelöscht, was zu unschönen “Profil-Leichen” führte. Mit der Änderung der temporären Ordner-Konfiguration konnte dieses Problem einfach gelöst werden.

Der neue temporäre Ordner für den Benutzer %SystemDrive%\Temp\%Username% lässt sich aber durchaus für eine Reihe weiterer Einstellungen benutzen. So kann man bspw. den Internet Explorer durch die Registryschlüssel

HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\
“Cache”=REG_SZ:%TEMP%\Temporary Internet Files
“Cookies”=REG_SZ:%TEMP%\Cookies
“History”=REG_SZ:%TEMP%\History

zur Ablage des Verlaufs, Cookies und temporären Internet-Dateien im neuen Benutzer-Temp-Ordner “zwingen”. Speziell für Terminalserverprofile eine feine Sache, da die Synchronisierung der Benutzerprofile erheblich beschleunigt wird.

Fazit

Die dargestellte Konfiguration der temporären Ordner ist keinesfalls ein Muss. Für mich hat sie sich allerdings in der Vergangenheit bei der Administration der unterschiedlichsten Systeme bewährt. Die zentrale Ablage der gesamten temporären Dateien eines Systems ermöglicht zum einen die einfache Kontrolle bezgl. des Umfangs als auch eine schnelle Säuberung. Wie bei allen meinen Beiträgen gilt: Bei Tipps, Vorschlägen sowie Fragen oder Kritiken hinterlasst bitte einen Kommentar.