Skripts durchwühlen den Papierkorb
26. Juli 2010Informationen aus dem Papierkorb holen oder den Papierkorb eines Windows-Systems komplett löschen – diese Aufgaben stellen sich dem Administrator des Öfteren, wenn er eine Systemmigration ausführen muss. Dazu benötigt der Systembetreuer vom Prinzip her zwei Skripts: Eines sollte alle Inhalte im Papierkorb komplett löschen – das macht das VBScript EmptyRecycleBin.vbs und das zweite sollte Informationen über die Objekte im Papierkorb ermitteln und dann weitere Aktionen an diesen Objekten zulassen: Wenn einzelne Objekte endgültig zu verwerfen sind, ist ein Ansatz nötig, wie ihn das Skript Get-Recycled.ps1 demonstriert. Beide Skripts stehen für Abonnementen zum Download bereit.
Aus den 90er Jahren stammt die erste Aufgabe des Autors im Skripting-Umfeld: Es war eine Vorgehensweise zu finden, um das Säubern und Migrieren von Computern weitgehend zu automatisieren. Eine vergleichsweise einfache Aufgabe war dabei das Ausleeren des Papierkorbs (Recycle Bin): Es wurde einfach ein Skript geschrieben, das diese Inhalte in diesem Verzeichnis im Verlauf des Säuberungsprozesses leerte.
Seit dieser Zeit haben Tools wie die Shell32.dll-Komponente den Umgang mit speziellen Verzeichnissen wie dem Papierkorb noch weiter vereinfacht. Das VBScript-basierte Programm EmptyRecycleBin.vbs (siehe Listing 1) führt zum Beispiel eine Aufgabe aus, die es im Kontext einer Migration zu erfüllen galt: Es leert den Papierkorb ohne für die zu löschenden Objekte eine Bestätigung einzuholen.
Listing 1: EmptyRecycleBin.vbs
Option Explicit
Dim sa, fso, item, items
Set sa = CreateObject("Shell.Application")
Set fso = CreateObject("Scripting.FileSystemObject")
Set items = sa.Namespace(10).Items()
On Error Resume Next
For Each item in items
If fso.FileExists(item.Path) Then
fso.DeleteFile item.Path, True
Else
fso.DeleteFolder item.Path, True
End If
Next
Doch wie viele Operationen im Zusammenhang mit dem Papierkorb aus diesen Tagen hatte das Skript seine Limitierungen: Es leerte nur den Papierkorb des aktuellen Benutzers. Falls andere Objekte, die zum Beispiel über eine höhere Berechtigung erforderten, zu löschen waren, musste man das Skript mit den entsprechenden – höheren – Berechtigungen starten.
Das Skript EmptyRecycleBin.vbs selbst eignet sich gut für das Löschen aller Objekte im Papierkorb. Doch ein Verwerfen einzelner Objekte ist damit nicht machbar. Hier kommt das zweite Skript – diesmal ein Powershell-Skript – ins Spiel: Get-Recycled.ps1.
Die Arbeitsweise von Get-Recycled.ps1 lautet: Es führt alle Objekte im Papierkorb auf und liefert dazu noch die folgenden Informationen für jedes der Objekte:
- Das Datum, an dem das Objekt gelöscht wurde (DeletionTime und DeletionTimeUtc);
- das Verzeichnis in dem das Objekt ursprünglich lag (OriginalParent);
- den ursprünglichen Namen des Objekts (OriginalName);
- den ursprünglichen kompletten Pfadnamen des Objekts (OriginalFullName);
- und die Zeitspanne, die das Objekt nun schon im Papierkorb lag (Age).
Mit Hilfe dieser Zusatzinformationen kann der Administrator an bestimmten Objekten im Papierkorb spezielle Operationen ausführen.
Im Listing 2 ist eine Abfolge von Powershell-Kommandos zu sehen, die anhand dieser Informationen alle Dateien im Papierkorb löscht, die älter sind als zehn Tage:
Listing 2: Sample Commands That Use Get-Recycled.ps1
# Delete items that have been in the Recycle Bin
# more than 10 days.
Get-Recycled | ?{$_.Age.TotalDays -gt 10}
| Remove-Item
# Get the original location of all items deleted
# in the last hour.
Get-Recycled | ?{$_.Age.TotalHours -le 1} |
%{$_.OriginalFullName}
# Restore all .zip files without overwriting
# newer files with the same names.
Get-Recycled | ?{$_.Extension -eq ".zip"} |
%{Move-Item $_ $_.OriginalFullName}
# Restore all .zip files, overwriting
# newer files if necessary.
Get-Recycled | ?{$_.Extension -eq ".zip"} |
%{Move-Item $_ $_.OriginalFullName -Force}
Dazu werden noch die ursprünglichen Orte der Dateien ermittelt, die in der letzten Stunde gelöscht wurden und dann werden noch alle Zip-Dateien im Papierkorb wiederhergestellt.
Die grundlegenden Skripts zu diesem Beitrag, Get-Recycled.ps1, und EmptyRecycleBin.vbs, stehen zusammen mit den Befehlen aus dem Listing 2 für Abonnenten zum Download bereit.