Найти, какой процесс заблокировал файл без сторонних инструментов

При попытке удалить файл или папку, которая используется процессом, появляется диалоговое окно «Используемый файл», в котором отображается имя программы, заблокировавшей файл.

Однако в некоторых случаях диалоговое окно «Используемый файл» не отображает имя процесса, который заблокировал файл, который вы пытаетесь удалить. В некоторых случаях в диалоговом окне будет показано «действие не может быть завершено, поскольку файл открыт в другой процесс«.

Найти, какой процесс заблокировал файл

Для исследования процессов и заблокированных файлов Windows Sysinternals Process Explorer, вероятно, является первым вариантом, который приходит на ум большинству пользователей. Тем не менее, есть два встроенные решения отображать текущий список открытых файлов вместе с соответствующими именами процессов.

Найдите, какой процесс заблокировал файл, используя:

  1. Монитор ресурсов (resmon.exe)
  2. Process Explorer от Microsoft Sysinternals
  3. Дескриптор от Microsoft Sysinternals

    2. Process Explorer

    Process Explorer не нуждается в представлении. В Process Explorer все, что вам нужно сделать, это использовать функцию поиска и ввести имя файла. Это показывает процесс, который обращается к файлу.

    Найти, какой процесс заблокировал файл

    В представлении нижней панели вы можете при необходимости закрыть дескриптор файла.

    Вы должны запустить Process Explorer от имени администратора, чтобы управлять процессами с повышенными правами. Чтобы поднять Process Explorer, откройте меню «Файл» → Показать детали для всех процессов.

    Проверьте эти связанные статьи Process Explorer:

    3. Ручка от Windows Sysinternals

    Handle — это утилита от Microsoft Sysinternals, которая отображает информацию об открытых дескрипторах для любого процесса в системе. Вы можете использовать его для просмотра программ, у которых открыт файл, или для просмотра типов объектов и имен всех дескрипторов программы. Handle похож на версию Process Explorer для командной строки.

    Заметка: В дескрипторе v4.21 имеется небольшая ошибка, из-за которой он всегда сообщает «Не найдено подходящих дескрипторов», если буква диска указана в верхнем регистре. Надеюсь, что Microsoft исправит это в следующем обновлении.

    В окне командной строки администратора используйте синтаксис командной строки, чтобы найти процесс, в котором открыт файл:

    handle.exe -a -u filename_with_path

    Если имя файла содержит пробелы, заключите его в двойные кавычки.

    Пример:

    handle.exe -a -u "c:\users\ramesh\desktop\Mandate-form.pdf"

    найти, какой процесс заблокировал файл - дескриптор sysinternals

    (Упоминание имени файла без пути может не обязательно работать в любой ситуации. Рекомендуется всегда указывать полный путь.)

    Выходные данные показывают имя процесса, идентификатор процесса, имя пользователя, заблокированное (целевое) имя файла с путем.

    Sysinternals Handle: аргументы командной строки

    usage: handle [[-a [-l]] [-u] | [-c  [-y]] | [-s]] [-p |] [name] [-nobanner]
    Сбросить всю информацию о ручках.
    -LПросто покажите дескрипторы разделов на основе файла подкачки.
    Закрывает указанный дескриптор (интерпретируется как шестнадцатеричное число).
    Вы должны указать процесс по его PID. ПРЕДУПРЕЖДЕНИЕ. Закрытие дескрипторов может вызвать нестабильность приложения или системы.
    -YНе запрашивайте подтверждение закрытой ручки.
    -sПечать счетчика каждого типа открытой ручки.
    -UПоказывать имя пользователя-владельца при поиске дескрипторов.
    -пДамп-дескрипторы, принадлежащие процессу (частичное имя принято).
    названиеПоиск дескрипторов объектов с (фрагмент принят).
    -nobannerНе отображать баннер запуска и сообщение об авторских правах.

    Никакие аргументы не будут сбрасывать все ссылки на файлы.

    Добавить дескриптор Sysinternals в контекстное меню

    Вы можете добавить дескриптор Sysinternals в контекстное меню для файлов, чтобы быстро найти программу, которая заблокировала файл. Чтобы добавить его в контекстное меню, выполните следующие действия:

    1. Загрузите Handle с сайта Microsoft Sysinternals.
    2. Скопируйте файлы Handle.exe handle64.exe в папку — например, d:\tools
    3. Скопируйте следующие строки кода в Блокнот и сохраните файл как find_handle.vbs в постоянное место.
      'Runs Sysinternals Handle.exe utility with filename argument.
      '© Ramesh Srinivasan -- https://winhelponline.com/blog
      'Created Date: Mar 29, 2008
      'Updated Date: Jun 11, 2019
      'For all versions of Windows, including Windows 10
      Option Explicit
      Dim objShell, WshShell, objFSO, sBaseKey, sFilename
      Set objShell = CreateObject("Shell.Application")
      Set WshShell = CreateObject("WScript.Shell")
      Set objFSO = CreateObject("Scripting.FileSystemObject")
      If WScript.Arguments.Count = 0  Then
      sBaseKey = "HKCU\Software\Classes\*\shell\"
      WshShell.RegWrite sBaseKey & "FindHandle\", "Find Handle", "REG_SZ"
      WshShell.RegWrite sBaseKey & "FindHandle\command\", "wscript.exe " & """" & _
      WScript.ScriptFullName & """" & " " & """" & "%1" & """", "REG_SZ"
      Else
      If objFSO.FileExists(WScript.Arguments(0)) = True Then
      sFilename = lcase(WScript.Arguments(0))
      objShell.ShellExecute "cmd.exe", "/k d:\tools\handle.exe -a -u " & _
      """" & sFilename & """", "", "runas", 1
      End If
      End If

      Заметка: Путь Sysinternals Handle.exe жестко закодирован как d:\tools\handle.exe в приведенном выше сценарии. Если программа находится по другому пути, измените путь в сценарии соответствующим образом. Для 64-битной Windows вы можете использовать либо Handle.exe или handle64.exe

    4. Двойной щелчок find_handle.vbs добавить пункт контекстного меню в реестр. Вам нужно будет сделать это только один раз. Но если вы переместите скрипт в другую папку, вам нужно будет дважды щелкнуть по нему еще раз, чтобы обновить путь в реестре.
    5. Вы увидите Найти ручку вариант, когда вы щелкаете правой кнопкой мыши по файлу. При нажатии на него запускается скрипт, который в свою очередь запускает handle.exe с аргументом имени файла, чтобы найти процесс, который заблокировал файл.

      найти, какой процесс заблокировал файл - дескриптор sysinternals

    Удалить Найти ручку пункт контекстного меню, запустить редактор реестра (regedit.exe) и удалите следующий ключ:

    HKEY_CURRENT_USER\Software\Classes\*\shell\FindHandle

    4. OpenFiles.exe — встроенный консольный инструмент

    Еще один встроенный инструмент, который мы собираемся использовать, — это Openfiles.exe, консольный инструмент, который не является новым для Windows. Первоначально он был представлен в 2000 году как часть средств Windows Resource Kit 2000/2003. Эта утилита была включена по умолчанию в Windows Vista и выше (включая Windows 10). Openfiles отображает список открытых в данный момент файлов из локальных или общих папок, а также идентификатор дескриптора и имя исполняемого файла процесса. Этот инструмент также позволяет отключить один или несколько файлов, которые открыты удаленно из общей папки.

    Включить глобальный флаг «Ведение списка объектов» в первый раз

    Во-первых, чтобы включить отслеживание локальных дескрипторов файлов, необходимо включить флаг «поддерживать список объектов», выполнив следующую команду из командной строки администратора.

    openfiles /local on

    Вы увидите следующее сообщение:

    ИНФОРМАЦИЯ: глобальный системный флаг «вести список объектов» в настоящее время включен.

    Вам нужно будет выполнить эту команду только в первый раз. Затем перезапустите Windows, чтобы изменения вступили в силу.

    Просмотр открытых файлов и соответствующих имен процессов

    После перезапуска Windows в окне командной строки администратора введите:

    openfiles

    Здесь перечислены идентификатор файла / дескриптора, имя процесса и список файлов, открытых локально или удаленно через локальные точки доступа, в формате таблицы.

    Чтобы просмотреть вывод в формате List или CSV, используйте параметр / query.

    openfiles /query /FO LIST
    openfiles /query /FO CSV

    Чтобы скопировать вывод в буфер обмена, перенаправьте вывод в Clip.exe, как показано ниже. Затем вставьте вывод в Блокнот или любой другой редактор по вашему выбору.

    openfiles |clip

    Найти, какой процесс заблокировал файл

    openfiles /query /FO LIST |clip
    openfiles /query /FO CSV |clip

    Найти, какой процесс заблокировал файл

    Для получения дополнительной информации о копировании вывода командной строки в буфер обмена или сохранении вывода в файл см. Статью Как скопировать текст вывода командной строки в буфер обмена или сохранить в файл?

    Чтобы узнать, используется ли конкретный файл программой (и узнать, какая программа), вы можете использовать следующую командную строку.

    openfiles | findstr /i 

    Пример:

    openfiles | findstr /i eiffel

    Приведенная выше команда выводит список всех открытых файлов, которые содержат слово «eiffel» в имени файла. В этом примере Word 2016 в настоящее время блокирует файл «Эйфелева башня.docx» (ID 4576).

    Найти, какой процесс заблокировал файл

    И диалог «Используемый файл» говорит мне то же самое.

    Найти, какой процесс заблокировал файл

    Отключите файлы, открытые удаленно из общей папки.

    Чтобы отключить файлы, открытые из общей папки, чтобы можно было удалить, переименовать файл или изменить содержимое, используйте /disconnect параметр, чтобы обрезать соединения с этим файлом. Вот параметры командной строки.

    OPENFILES /Disconnect [/S system [/U username [/P [password]]]]
    {[/ID id] [/A accessedby] [/O openmode]}
    [/OP openfile]
    Description:
    Enables an administrator to disconnect files and folders that
    have been opened remotely through a shared folder.
    Parameter List:
    /S     system         Specifies the remote system to connect to.
    /U     [domain\]user  Specifies the user context under which the
    command should execute.
    /P     [password]     Specifies the password for the given user
    context.
    /ID    id             Specifies to disconnect open files by file ID.
    The "*" wildcard may be used.
    /A     accessedby     Specifies to disconnect all open files by
    "accessedby" value. The "*" wildcard
    may be used.
    /O     openmode       Specifies to disconnect all open files by
    "openmode" value. Valid values are Read,
    Write or Read/Write. The "*" wildcard
    may be used.
    /OP    openfile       Specifies to disconnect all open file
    connections created by a specific "open
    file" name. The "*" wildcard may be used.
    /?                    Displays this help message.
    Examples:
    OPENFILES /Disconnect /?
    OPENFILES /Disconnect /ID 1
    OPENFILES /Disconnect /A  username
    OPENFILES /Disconnect /O Read/Write
    OPENFILES /Disconnect /OP "c:\My Documents\somedoc.doc" /ID 234
    OPENFILES /Disconnect /S system  /U username /ID 5
    OPENFILES /Disconnect /S system  /U username /P password /ID *
    

    Openfiles.exe отлично справляется со списком всех открытых файлов вместе с именами процессов, но не может принудительно уничтожать процессы. Однако этот превосходный (но упускаемый из виду) встроенный консольный инструмент может пригодиться, если вы хотите быстро найти имя процесса, использующего файл, или отключить файл, доступ к которому осуществляется через общую папку пользователем сети — независимо от на стороннее решение.

    5. OpenedFilesView

    OpenedFilesView от Nirsoft отображает список всех открытых файлов в вашей системе. Для каждого открытого файла отображается дополнительная информация: значение дескриптора, доступ для чтения / записи / удаления, позиция файла, процесс, открывший файл и т. Д. При желании вы также можете закрыть один или несколько открытых файлов или закрыть процесс, который открыл эти файлы.

    Найти, какой процесс заблокировал файл

    Вы можете закрыть процессы выбранных файлов или закрыть дескрипторы файлов. Номер дескриптора представлен в шестнадцатеричных значениях, тогда как консольный инструмент openfiles.exe показывает его в обычном формате. Этот инструмент также позволяет добавить опцию контекстного меню, чтобы быстро найти процесс, который в данный момент использует файл, через контекстное меню. Опция контекстного меню / поддержка командной строки, я считаю, является одной из самых полезных функций, предлагаемых OpenedFilesView.

Ссылка на основную публикацию