Eu já vi várias respostas sobre o uso do Handle ou Process Monitor , mas gostaria de descobrir em meu próprio código (C #) qual processo está bloqueando um arquivo.
Eu tenho uma sensação desagradável de que vou ter que soletrar na API do win32, mas se alguém já fez isso e pode me colocar no caminho certo, eu realmente aprecio a ajuda.
Atualizar
Links para perguntas semelhantes
c#
file-locking
AJ.
fonte
fonte
Respostas:
Uma das coisas boas
handle.exe
é que você pode executá-lo como um subprocesso e analisar a saída.Fazemos isso em nosso script de implantação - funciona como um encanto.
fonte
Há muito tempo, era impossível obter com segurança a lista de processos bloqueando um arquivo porque o Windows simplesmente não rastreia essas informações. Para dar suporte à API do Restart Manager , essas informações agora são rastreadas.
Eu montei o código que pega o caminho de um arquivo e retorna um
List<Process>
de todos os processos que estão bloqueando esse arquivo.Usando de permissão limitada (por exemplo, IIS)
Essa chamada acessa o registro. Se o processo não tiver permissão para isso, você receberá ERROR_WRITE_FAULT, o que significa
An operation was unable to read or write to the registry
. Você pode conceder permissão seletivamente à sua conta restrita para a parte necessária do registro. É mais seguro, porém, que seu processo de acesso limitado defina um sinalizador (por exemplo, no banco de dados ou no sistema de arquivos, ou usando um mecanismo de comunicação entre processos, como fila ou canal nomeado) e faça um segundo processo chamar a API do Restart Manager.Conceder permissões diferentes do mínimo ao usuário do IIS é um risco de segurança.
fonte
tasklist /m YourDllName.dll
e analisar a saída. Veja stackoverflow.com/questions/152506/…É muito complexo invocar o Win32 de c #.
Você deve usar a ferramenta Handle.exe .
Depois disso, seu código C # deve ser o seguinte:
fonte
/accepteula
. Atualizei a resposta de Gennady com a mudança.handle.exe
Eu tive problemas com a solução de stefan . Abaixo está uma versão modificada que parece funcionar bem.
ATUALIZAR
Se você deseja apenas saber quais processos estão bloqueando uma DLL específica, é possível executar e analisar a saída de
tasklist /m YourDllName.dll
. Funciona no Windows XP e posterior. VejoO que isso faz? lista de tarefas / m "mscor *"
fonte
myProcessArray
? É um membro da classe (mas também realmente devolvido a partir getFileProcesses () O mesmo vale paramyProcess
.Isso funciona para DLLs bloqueadas por outros processos. Esta rotina não descobrirá, por exemplo, que um arquivo de texto está bloqueado por um processo do Word.
C #:
VB.Net:
fonte
mais simples com linq:
fonte