Einer der frustrierendsten Fehler, mit denen ein Endbenutzer oder IT-Administrator umgehen kann, sind gesperrte Dateien in Windows. Wenn Sie einen Ordner löschen, eine Datei verschieben oder eine Konfiguration bearbeiten und eine Fehlermeldung für gesperrte Dateien auftritt, ist es besser, schnell und effizient damit umzugehen.
Microsoft hat PowerShell als Ersatz eingeführt Shell, aber es hat weit mehr Funktionalität als das und ist eine komplexe und fähige Sprache. Schauen wir uns in diesem Artikel an, wie Sie PowerShell verwenden können, um mit gesperrten Dateien umzugehen.
Das Problem mit gesperrten Dateien
Wie genau wird eine Datei gesperrt? Während der normalen Verwendung erstellt ein Prozess viele Handles für Ressourcen wie eine Datei. Auf diese Weise sperren die Prozesse häufig die Datei, um zu verhindern, dass unbeabsichtigte Konfigurationsänderungen oder andere Beschädigungen auftreten. Das Problem besteht häufig darin, dass es schwierig ist, festzustellen, welcher Prozess die Datei gesperrt hat, und anschließend, wie diese Sperre aus der Datei entfernt werden kann.
Leider gibt es kein eingebautes Cmdlet, mit dem eine Datei getestet und festgestellt werden kann, ob sie gesperrt ist oder durch welchen Prozess. Daher müssen Sie Ihre eigenen Funktionen erstellen oder andere nützliche Tools einschließen, um mehr über diese Dateien zu erfahren.
Testen auf gesperrte Dateien
In Windows können Sie testen, ob eine einzelne Datei gesperrt ist. Mit dem folgenden Codeblock können Sie testen, ob eine bestimmte Datei gesperrt ist. Die Variable $ Item muss auf einen vollständigen Dateipfad festgelegt werden. Durch Testen, ob die Datei zum Schreiben geöffnet werden kann, wie mit dem Befehl [System.IO.File] :: Open ($ Item, 'Open', 'Write') angezeigt, können Sie feststellen, ob die Datei gesperrt ist.
If ([System.IO.File] :: Exists ($ Item)) {Try {$ FileStream = [System.IO.File] :: Open ($ Item, 'Open', 'Write') $ FileStream.Close () $ FileStream.Dispose () $ IsLocked = $ False} Catch [System.UnauthorizedAccessException] {$ IsLocked = 'AccessDenied'} Catch {$ IsLocked = $ True}}
Get-SMBOpenFile
Ich habe gesagt, dass Windows keine integrierte Funktion hat, aber es gibt einen Fall, in dem eine Funktion vorhanden ist. Wenn Sie eine Remote-Freigabe oder sogar administrative Freigaben (z. B. c $) haben, können Sie das Cmdlet Get-SMBOpenFile verwenden, um über diese geöffneten Dateien zu berichten.
PS C: & gt; Get-SMBOpenFile FileId SessionId-Pfad ShareRelativePath —— ——— —- —————– 154618822665 154618822657 C: PS C. : & gt;Der Nachteil ist, dass dies nur für Dateien funktioniert, auf die per Fernzugriff zugegriffen wird. Gesperrte Dateien, die auf Ihrem lokalen System verwendet werden, werden nicht gemeldet. In den meisten Fällen ist dies keine praktikable Lösung. Zum Schließen können Sie die geöffneten Dateien an den Befehl Close-SMBOpenFile zurückleiten.
Get-SMBOpenFile | Close-SMBOpenFile
OpenFiles-Dienstprogramm
Windows verfügt über ein integriertes Dienstprogramm namens openfiles, mit dessen Hilfe Sie die verwendeten Dateien auflisten und die Verbindung trennen können. Auf den ersten Blick sieht es perfekt für Ihre Bedürfnisse aus! Sie können dies sogar in eine PowerShell-Funktion einbinden, um das Abfragen und Trennen von Dateien zu vereinfachen.
Öffnen Sie eine administrative PowerShell-Eingabeaufforderung und führen Sie den Befehl openfiles/query aus. Sie sollten sofort eine Fehlermeldung erhalten, die besagt, dass die Liste “Objekte pflegen” & # 8221; Das globale Flag muss aktiviert sein.
PS C:/& gt; openfiles/query INFO: Das globale Systemflag 'Objektliste verwalten' muss aktiviert sein, damit lokal geöffnete Dateien angezeigt werden. Siehe Openfiles /? für mehr Informationen. Dateien, die remote über lokale Freigabepunkte geöffnet werden: —————————————— — INFO: Keine freigegebenen geöffneten Dateien gefunden.
Diese Objektliste verwaltet die Liste der verwendeten Handles und ermöglicht es openfiles, diese Informationen abzufragen. Um dies zu aktivieren, geben Sie openfiles/local on ein und starten Sie Ihren Computer neu. Der Nachteil beim Aktivieren dieser Funktion besteht darin, dass es zu einem leichten Leistungseinbruch kommt, der sich je nach System möglicherweise nicht für die Verwendung dieses Tools lohnt. Lassen Sie uns jedoch sehen, wie wir diese Funktion in PowerShell ausführen können.
PS C: & gt; openfiles/Query/fo csv/nh Dateien, die remote über lokale Freigabepunkte geöffnet werden: ———————————- ———– “ID”, “Zugriff über”, “Typ”, “Datei öffnen (Pfad ausführbare Datei)”, “608”, “Benutzer”, “Windows”, “C: ” PS C: & gt; openfiles/Query/fo csv | Select-Object -Skip 4 | ConvertFrom-CSV-ID, auf die nach Typ zugegriffen wird Datei öffnen (Pfad ausführbare Datei) – ———– —- ——————- ——– 608 Benutzer Windows C: PS C: & gt; openfiles/separect/id 608 ERFOLG: Die Verbindung zur geöffneten Datei “C: ” wurde beendet.In den vorherigen Beispielen können Sie sehen, wie Sie die CSV-Ausgabe von OpenFiles in PowerShell importieren. Mit diesen Informationen können Sie dann eine Datei trennen, um sie zu entsperren. Aufgrund der Leistungseinbußen, die bei der Aktivierung der Funktion zum Verwalten von Objektlisten auftreten können, lohnt es sich möglicherweise nicht für Ihre Anforderungen. Aus diesem Grund sind möglicherweise andere Lösungen erforderlich.
Die Handle-Anwendung
Sysinternals ist bekannt für die vielen nützlichen und nahezu unverzichtbaren IT-Tools, die sie herstellen. Vor einiger Zeit wurde Sysinternals von Microsoft übernommen, und Sie können diese gut unterstützten Tools selbst herunterladen und verwenden. Praktischerweise gibt es eine Anwendung mit dem Namen Handles, die genau das bietet, wonach Sie suchen!
Zuerst müssen Sie die Anwendung herunterladen, die Dateien entpacken und die ausführbaren Dateien an einem Speicherort ablegen, den Ihre Umgebungsvariable Path enthält . Auf diese Weise können Sie einfach auf die Anwendung verweisen, wo immer Sie sie benötigen. Wenn Sie eine einfache Abfrage für geöffnete Dateien verwenden, können Sie feststellen, dass Sie viele Ergebnisse erhalten (aus Gründen der Lesbarkeit abgeschnitten).
PS C:/& gt; handle64 -NoBanner … —————————————- ———————————- RuntimeBroker.exe pid: 9860 Benutzer 48: Datei C: Windows System32 188: Abschnitt BaseNamedObjects __ ComCatalogCache__ 1EC: Abschnitt BaseNamedObjects __ ComCatalogCache__ ———————————— —————————————— chrome.exe pid: 4628 User 78 : Datei C: Programme (x86) Google Chrome Application 78.0.3904.108 1C4: Abschnitt Sessions 1 BaseNamedObjects windows_shell_global_counters …Sie scheinen zumindest das zu bekommen, was Sie wollen So können Sie herausfinden, welche Dateien verwendet werden, und Sie können sie mit Ihrem zuvor gesperrten Dateisperrcode testen. Aber wie machen Sie das einfacher? Der folgende Code liest jeden Prozess und ruft nur die gesperrten Dateien ab. Der Nachteil ist, dass die Ausführung eine Weile dauert, da es viele Prozesse gibt.
$ Processes = Get-Process $ results = $ Processes | Foreach-Object {$ handle = (handle64 -p $ _. ID -NoBanner) | Where-Object {$ _ -Match “File”} | Foreach-Object {[PSCustomObject] @ {“Hex” = ((($ _ -Split “”) .Where ({$ _ -NE “”}) [0]). Split (“:”) [0]) .Trim () “File” = (($ _ -Split “”) [- 1]). Trim ()}} If ($ handle) {[PSCustomObject] @ {“Name” = $ _. Name “PID” = $ _. ID “Handles” = $ handle}}}Letztendlich erhalten Sie jedoch eine umsetzbare Sammlung von Dateien, die nach Prozessen aufgelistet sind und von denen Sie wissen, dass sie verwendet werden und weiter gefiltert werden können. Wenn Sie feststellen, dass Sie eine davon schließen müssen, können Sie (als Administrator) Folgendes tun:
PS C: & gt; $ results | & gt; & gt; Where-Object Name -EQ 'Notepad' | & gt; & gt; Where-Object {$ _. Handles.File -Match “test.txt”} Name PID-Handles —- — ——- Notepad 12028 {@ {Hex = 44; Datei = C: test.txt} PS C: & gt; handle64 -p 12028 -c 44 -y -nobanner 44: Datei (R-D) C: test.txt Handle geschlossen.
Sie können all dies weiter in eine Funktion einbinden, um das Parsen und Suchen nach Bedarf noch einfacher zu machen. Es gibt viele Möglichkeiten, insbesondere die Kombination der verschiedenen Methoden zu einer Lösung, die zu Ihrer Umgebung passt.
Schlussfolgerung
Der Umgang mit gesperrten Dateien kann eine Herausforderung sein, insbesondere wenn dies der Fall ist stoppt, was Sie brauchen, um schnell fertig zu werden. Es gibt eine Reihe von Möglichkeiten, diese Dateien zu finden und zu entsperren, aber es erfordert ein wenig Arbeit, da Windows nicht über eine wirklich umfassende integrierte Methode für den Umgang mit diesen gesperrten Dateien verfügt. Die beschriebenen Lösungen sollten das Problem in kurzer Zeit lösen und Sie zu weitaus wichtigeren Aufgaben übergehen lassen!