Skripts durchwühlen den Papierkorb

26. Juli 2010

Informationen 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.

Get-Recycled.ps1 führt alle Objekte im Papierkorb auf und liefert dazu noch weitere Informationen.

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.

Get-Recycled.ps1 führt alle Objekte im Papierkorb auf und liefert dazu noch weitere Informationen.

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.

Alex Angelopoulos/rhh

Lesen Sie auch