Come gestire gli handle di file aperti con PowerShell

Julia Tim/Shutterstock

Uno degli errori più frustranti che un utente finale o un amministratore IT può affrontare è quello dei file bloccati all'interno di Windows. Quando si elimina una cartella, si sposta un file o si modifica una configurazione e si verifica un messaggio di errore relativo al file bloccato, è meglio gestirlo in modo rapido ed efficiente.

Microsoft ha introdotto PowerShell in sostituzione shell, ma ha molte più funzionalità di così ed è un linguaggio complesso e capace. Diamo un'occhiata in questo articolo a come utilizzare PowerShell per gestire i file bloccati.

The Locked File Problem

Come viene bloccato esattamente un file? Durante il normale utilizzo, un processo crea molti handle per le risorse come un file. In questo modo, i processi spesso bloccano il file per impedire modifiche involontarie alla configurazione o altri danneggiamenti. Il problema spesso è che è difficile determinare quale processo ha bloccato il file e, successivamente, come rimuovere quel blocco dal file.

Sfortunatamente, non esiste un cmdlet integrato per testare un file e stabilire se è bloccato o da quale processo. Pertanto, è necessario creare le proprie funzioni o includere altri strumenti utili che esistono per aiutare a scoprire di più su questi file.

Testing for Locked Files

In Windows, puoi verificare se un singolo file è bloccato. Utilizzando il seguente blocco di codice, puoi verificare se un determinato file è bloccato. La variabile $ Item deve essere impostata su un percorso file completo. Testando per vedere se il file può essere aperto per la scrittura, come visto con il comando [System.IO.File] :: Open ($ Item, 'Open', 'Write'), puoi sapere se il file è bloccato.

If ([System.IO.File] :: Exists ($ Item)) {Try {$ FileStream = [System.IO.File] :: Open ($ Item, 'Open', 'Write') $ FileStream.Close () $ FileStream.Dispose () $ IsLocked = $ False} Cattura [System.UnauthorizedAccessException] {$ IsLocked = 'AccessDenied'} Cattura {$ IsLocked = $ True}}

Get-SMBOpenFile

Ho detto che Windows non ha una funzione incorporata, ma c'è un caso in cui esiste una funzione. Se si dispone di una condivisione remota o anche di condivisioni amministrative (come c $), è possibile utilizzare il cmdlet Get-SMBOpenFile per generare rapporti su tali file aperti.

PS C: & gt; Get-SMBOpenFile FileId SessionId Path ShareRelativePath —— ——— —- —————– 154618822665 154618822657 C: PS C : & gt;

Lo svantaggio è che funziona solo per i file a cui si accede in remoto. Tutti i file bloccati in uso sul sistema locale non verranno segnalati, quindi per la maggior parte dei casi questa non è una soluzione praticabile. Per chiudere, è possibile reindirizzare i file aperti restituiti al comando Close-SMBOpenFile.

Get-SMBOpenFile | Close-SMBOpenFile

OpenFiles Utility

Windows ha un'utilità incorporata chiamata openfiles che può aiutare a elencare i file in uso e scollegarli. A prima vista sembra perfetto per le tue esigenze! Puoi persino racchiuderlo in una funzione PowerShell per facilitare l'interrogazione e la disconnessione dei file.

Apri un prompt di PowerShell amministrativo ed esegui il comando openfiles/query. Dovresti ricevere subito un messaggio di errore che indica che & # 8220; mantieni l'elenco degli oggetti & # 8221; il flag globale deve essere attivo.

PS C:/& gt; openfiles/query INFO: Il flag globale di sistema “mantieni elenco oggetti” deve essere abilitato per vedere i file aperti in locale. Vedi Openfiles /? per maggiori informazioni. File aperti in remoto tramite punti di condivisione locali: —————————————— — INFO: Nessun file aperto condiviso trovato.

Questo elenco di oggetti è ciò che effettivamente mantiene l'elenco degli handle in uso e consente a openfile di eseguire query su tali informazioni. Per attivarlo, accedere a openfiles/local e quindi riavviare il computer. Lo svantaggio dell'attivazione di questa funzione è che si verifica un leggero calo delle prestazioni, che a seconda del sistema potrebbe non valere l'utilità di utilizzare questo strumento. Detto questo, vediamo come possiamo farlo funzionare in PowerShell.

PS C: & gt; openfiles/Query/fo csv/nh File aperti da remoto tramite punti di condivisione locali: ———————————- ———– “ID”, “Accesso da”, “Tipo”, “Apri file (percorso eseguibile)” “608”, “utente”, “Windows”, “C: ” PS C: & gt; openfiles/Query/fo csv | Seleziona-Oggetto-Salta 4 | ConvertFrom-CSV ID accessibile per tipo Apri file (percorso eseguibile) – ———– —- ——————- ——– 608 utente Windows C: PS C: & gt; openfiles/disconnect/id 608 SUCCESS: La connessione al file aperto “C: ” è stata terminata.

Con gli esempi precedenti, puoi vedere come importare l'output CSV di file aperti in PowerShell. Utilizzando queste informazioni, puoi quindi disconnettere un file per sbloccarlo. A causa del calo di prestazioni che potresti subire con l'abilitazione della funzionalità di gestione dell'elenco di oggetti, potrebbe non essere utile per le tue esigenze. Per questo motivo, potrebbero essere necessarie altre soluzioni.

L'applicazione Handle

Sysinternals è noto per i numerosi strumenti IT utili e quasi essenziali che produce. Qualche tempo fa, Sysinternals è stato acquisito da Microsoft e puoi scaricare e utilizzare questi strumenti ben supportati per te stesso. Convenientemente, esiste un'applicazione chiamata handle che fornisce esattamente ciò che stai cercando!

Per prima cosa, devi scaricare l'applicazione, decomprimere i file e mettere gli eseguibili in una posizione inclusa nella tua variabile d'ambiente Path . In questo modo, puoi facilmente fare riferimento all'applicazione ovunque ti serva. Utilizzando una semplice query per i file aperti, puoi vedere che ottieni molti risultati (troncati per leggibilità).

PS C:/& gt; handle64 -NoBanner … ——————————————– ———————————- RuntimeBroker.exe pid: 9860 Utente 48: File C: Windows System32 188: Sezione BaseNamedObjects __ ComCatalogCache__ 1EC: Sezione BaseNamedObjects __ ComCatalogCache__ ———————————— —————————————— chrome.exe pid: 4628 Utente 78 : File C: Program Files (x86) Google Chrome Application 78.0.3904.108 1C4: Section Sessions 1 BaseNamedObjects windows_shell_global_counters …

Sembra che tu abbia quello che vuoi & # 8212; almeno un modo per scoprire quali file vengono utilizzati & # 8212; e puoi testarli utilizzando il tuo codice di file bloccato da prima. Ma come puoi renderlo più facile da usare? Il codice seguente legge ogni processo e recupera solo i file bloccati. Lo svantaggio è che ci vuole un po 'di tempo perché ci sono molti processi.

$ Processes = Get-Process $ risultati = $ 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}}}

In definitiva, tuttavia, ciò che ottieni è una raccolta di file utilizzabile, elencati per processo, che sai essere in uso e che possono essere ulteriormente filtrati. Se scopri che è necessario chiuderne uno, puoi eseguire le seguenti operazioni (come amministratore):

PS C: & gt; $ risultati | & gt; & gt; Dove-Nome oggetto -EQ 'Blocco note' | & gt; & gt; Where-Object {$ _. Handles.File -Match “test.txt”} Nome PID Handles —- — ——- Blocco note 12028 {@ {Hex = 44; File = C: test.txt} PS C: & gt; handle64 -p 12028 -c 44 -y -nobanner 44: File (R-D) C: test.txt Handle chiuso.

Puoi ulteriormente racchiudere tutto questo in una funzione per rendere ancora più facile l'analisi e la ricerca, se necessario. Esistono molte possibilità, specialmente combinando i vari metodi in una soluzione adatta al proprio ambiente.

Conclusione

Gestire i file bloccati può essere una sfida, soprattutto quando interrompe ciò di cui hai bisogno per essere fatto rapidamente. Esistono diversi modi per trovare e sbloccare quei file, ma richiede un po 'di lavoro poiché Windows non ha un metodo integrato veramente completo per gestire quei file bloccati. Le soluzioni delineate dovrebbero semplificare il lavoro di qualunque sia il problema e consentirti di passare a compiti molto più importanti!


Posted

in

by

Tags: