Como gerenciar identificadores de arquivos abertos com o PowerShell
Julia Tim / Shutterstock
Um dos erros mais frustrantes com os quais um usuário final ou administrador de TI pode lidar é o de arquivos bloqueados no Windows. Quando você exclui uma pasta, move um arquivo ou edita uma configuração e encontra uma mensagem de erro de arquivo bloqueado, é melhor lidar com isso com rapidez e eficiência.
A Microsoft introduziu o PowerShell como um shell de substituição, mas possui muito mais funcionalidade que isso e é uma linguagem complexa e capaz. Vamos ver neste artigo como você pode utilizar o PowerShell para lidar com arquivos bloqueados.
O problema do arquivo bloqueado
Como exatamente um arquivo é bloqueado? Durante o uso normal, um processo cria muitos identificadores de recursos, como um arquivo. Ao fazer isso, os processos geralmente bloqueiam o arquivo para impedir que alterações não intencionais na configuração ou outra corrupção ocorram. O problema geralmente é que é difícil determinar qual processo bloqueou o arquivo e, posteriormente, como remover esse bloqueio do arquivo.
Infelizmente, não há cmdlet interno para testar um arquivo e dizer se ele está bloqueado ou por qual processo. Portanto, você precisa criar suas próprias funções ou agrupar outras ferramentas úteis existentes para ajudar a descobrir mais sobre esses arquivos.
Teste de arquivos bloqueados
No Windows, você pode testar se um arquivo individual está bloqueado. Usando o seguinte bloco de código, você pode testar se um determinado arquivo está bloqueado. A variável $ Item precisa ser definida como um caminho completo do arquivo. Testando para ver se o arquivo pode ser aberto para gravação, como visto com o comando [System. IO. File] :: Open ($ Item, 'Open', 'Write'), você pode saber se o arquivo está bloqueado.
If ([System. IO. File] :: Existe ($ Item)) {Experimente {$ FileStream = [System. IO. File] :: Open ($ Item, 'Open', 'Write' ) $ FileStream. Close () $ FileStream. Dispose () $ IsLocked = $ False} Catch [System. UnauthorizedAccessException] {$ IsLocked = 'AccessDenied'} Catch {$ IsLocked = $ True}}
Get-SMBOpenFile
Eu disse que o Windows não tem uma função interna, mas há um caso em que existe uma função. Se você tiver um compartilhamento remoto ou mesmo compartilhamentos administrativos (como c $), poderá usar o cmdlet Get-SMBOpenFile para relatar esses arquivos abertos.
PS C: \ > Get-SMBOpenFile Caminho do arquivo FileId SessionId ShareRelativePath ------ --------- ---- ----------------- 154618822665 154618822657 C: \ PS C : \ > [/PRÉ]A desvantagem é que isso só funciona para arquivos acessados remotamente. Os arquivos bloqueados em uso no sistema local não serão relatados; portanto, na maioria dos casos, essa não é uma solução viável. Para fechar, você pode canalizar os arquivos abertos retornados ao comando Close-SMBOpenFile.
Get-SMBOpenFile | Close-SMBOpenFile
Utilitário OpenFiles
O Windows possui um utilitário interno chamado openfiles que pode ajudar a listar quais arquivos estão em uso e desconectá-los. À primeira vista, parece perfeito para as suas necessidades! Você pode até agrupar isso em uma função do PowerShell para facilitar a consulta e a desconexão de arquivos.
Abra um prompt administrativo do PowerShell e execute o comando openfiles / query. Imediatamente, você receberá uma mensagem de erro informando que o sinalizador global "manter lista de objetos" precisa estar ativado.
PS C: / > openfiles / query INFO: O sinalizador global do sistema 'manter lista de objetos' precisa estar ativado para ver os arquivos abertos locais. Veja Openfiles /? Para maiores informações. Arquivos abertos remotamente por pontos de compartilhamento locais: ------------------------------------------ --- INFO: nenhum arquivo aberto compartilhado encontrado.Essa lista de objetos é o que realmente mantém a lista de identificadores que estão em uso e permite que os arquivos abertos consultem essas informações. Para ativar isso, digite openfiles / local e, em seguida, reinicie o computador. A desvantagem de ativar esse recurso é que há um pequeno impacto no desempenho, que, dependendo do seu sistema, pode não valer a utilidade do uso dessa ferramenta. Dito isto, vamos ver como podemos fazer isso funcionar no PowerShell.
PS C: \ > openfiles / Query / fo csv / nh Arquivos abertos remotamente por pontos de compartilhamento locais: ---------------------------------- ----------- "ID", "Acessado por", "Tipo", "Abrir arquivo (caminho \ executável)" "608", "usuário", "Windows", "C: \" PS C: \ > openfiles / Consulta / fo csv | Selecionar objeto - pular 4 | ID ConvertFrom-CSV Acessado por Tipo Abrir Arquivo (Caminho \ executável) - ----------- ---- ------------------- -------- 608 usuário Windows C: \ PS C: \ > openfiles / desconect / id 608 SUCESSO: A conexão com o arquivo aberto "C: \" foi encerrada.Nos exemplos anteriores, você pode ver como importar a saída CSV dos arquivos abertos para o PowerShell. Usando essas informações, você pode desconectar um arquivo para desbloqueá-lo. Devido ao impacto no desempenho em que você pode incorrer ao ativar o recurso de manutenção de lista de objetos, pode não valer a pena para suas necessidades. Por isso, outras soluções podem ser necessárias.
O aplicativo Handle
Sysinternals é conhecido pelas muitas ferramentas de TI úteis e quase essenciais que eles fabricam. Há algum tempo, o Sysinternals foi adquirido pela Microsoft e você pode fazer o download e usar essas ferramentas com suporte. Convenientemente, existe um aplicativo chamado handle que fornece exatamente o que você está procurando!
Primeiro, você precisa baixar o aplicativo, descompactar os arquivos e colocar os executáveis em um local que a variável de ambiente Path tenha incluído. Ao fazer isso, você pode facilmente referenciar o aplicativo sempre que precisar. Usando uma consulta simples para arquivos abertos, você pode ver muitos resultados (truncados para facilitar a leitura).
PS C: / > handle64 -NoBanner ... -------------------------------------------- ---------------------------------- RuntimeBroker. exe pid: 9860 Usuário 48: Arquivo C: \ Windows \ System32 188: Seção \ BaseNamedObjects \ __ ComCatalogCache__ 1EC: Seção \ BaseNamedObjects \ __ ComCatalogCache__ ------------------------------------ ------------------------------------------ chrome. exe pid: 4628 Usuário 78 : Arquivo C: \ Arquivos de programas (x86) \ Google \ Chrome \ Application \ 78.0.3904.108 1C4: Seção \ Sessões \ 1 \ BaseNamedObjects \ windows_shell_global_counters ...Você parece ter o que deseja ", pelo menos, uma maneira de descobrir quais arquivos estão sendo usados" e pode testá-los usando o código bloqueado de arquivo de antes. Mas como você torna isso mais fácil de usar? O código a seguir lê cada processo e recupera apenas os arquivos bloqueados. A desvantagem é que isso demora um pouco para ser executado, pois há muitos processos.
$ Processes = Get-Process $ results = $ Processes | Objeto Foreach {$ handle = (handle64 -p $ _. ID -NoBanner) | Onde-objeto {$ _ -Match "Arquivo"} | Objeto Foreach {[PSCustomObject] @ {"Hex" = ((($ _ -Split ""). Onde ({$ _ -NE ""}) [0]). Dividir (":") [0]) . Trim () "Arquivo" = (($ _ -Split "") [- 1]). Trim ()}} Se ($ manipula) {[PSCustomObject] @ {"Name" = $ _. Nome "PID" = $ _. ID "Alças" = $ alças}}}Finalmente, o que você obtém é uma coleção acionável de arquivos, listados por processo, que você sabe que estão em uso e que podem ser filtrados ainda mais. Se você descobrir que precisa fechar um deles, faça o seguinte (como administrador):
PS C: \ > $ resultados | > > Nome do objeto Where -EQ 'Notepad' | > > Where-Object {$ _. Handles. File -Match "test. txt"} Nome PID Handles ---- --- ------- Bloco de notas 12028 {@ PS C: \ > handle64 -p 12028 -c 44 -y -nobanner 44: Arquivo (R-D) C: \ test. txt Identificador fechado.Você também pode agrupar tudo isso em uma função para tornar ainda mais fácil analisar e pesquisar conforme necessário. Existem muitas possibilidades, especialmente na combinação dos vários métodos em uma solução que se adapta ao seu ambiente.
Conclusão
Lidar com arquivos bloqueados pode ser um desafio, especialmente quando interrompe o que você precisa fazer rapidamente. Existem várias maneiras de encontrar e desbloquear esses arquivos, mas isso requer um pouco de trabalho, pois o Windows não possui um método interno verdadeiramente abrangente de lidar com esses arquivos bloqueados. As soluções descritas devem resumir o que quer que seja o problema e permitir que você prossiga para tarefas muito mais importantes!
Via: How to Geek
Nenhum comentário