Может ли Windows сказать мне, что использует мой USB-накопитель?

Будучи добропорядочным гражданином, я щелкаю левой кнопкой мыши на значке "Безопасное извлечение устройства" на панели задач и выбираю свой USB-накопитель для отключения.

Тогда я получаю сообщение:

Windows не может остановить ваше устройство тома Generic, потому что оно используется. Закройте все программы или окна, которые могут использовать устройство, а затем повторите попытку позже.

Конечно, будучи операционной системой, она точно знает , какие приложения используют мое устройство. Так почему это не говорит мне?

Или есть способ, который я могу узнать?

10 ответов

Решение

Вы можете использовать Sysinternals Process Explorer, чтобы найти дескриптор для любых открытых файлов. Просто выберите Find меню и выберите Find Handle or DLL, В открывшемся диалоговом окне введите букву диска в поле поиска. Результаты поиска должны показывать все файлы, которые открыты с диска и в каком процессе они открыты.

Более простой метод : Windows (по крайней мере, 10, AFAIK) создает запись в журнале событий, когда вы пытаетесь извлечь съемный диск, и вы не можете этого сделать, потому что процесс заблокирован. Два идентификатора события 225 будут отображать идентификатор процесса и имя процесса, ответственного за блокировку.

Шаг за шагом:

1) Запустить просмотрщик событий

2) Откройте "Журналы Windows", затем "Система".

3) Щелкните правой кнопкой мыши "Система" и выберите "Фильтровать текущий журнал"

4) В появившемся диалоговом окне введите "225" (без кавычек), где написано "Все идентификаторы событий".

5) Затем вы увидите все события, связанные с невозможностью извлечения, потому что процесс заблокировал диск.

6) Посмотрите на временные метки всех этих записей и выясните, какие из них относятся к фактическому времени, когда вы пытались извлечь диск.

7) Примите соответствующие меры. Изящное завершение задачи (закрытие программы с блокировкой) в большинстве случаев нормально. Остановка службы поиска Windows также в порядке. Остановка антивирусного сканирования должна быть в порядке (если вы не подозреваете, что у вас есть какие-либо вирусы в то время). Зайдя в диспетчер задач и убив процесс, возможно, не будет в порядке. Как с этим бороться, выходит за рамки этого вопроса.

8) (Сохранить вид ...) на панели "Действия" (в правом кадре) вы можете "Сохранить фильтр в пользовательском представлении ...", чтобы найти его в "Пользовательских представлениях" (в левом кадре над " Журналы Windows ")

Идентификатор процесса:

Имя процесса:

8) Если у вас нет другой записи с именем процесса , системный процесс (идентификатор процесса 4) удерживает ваш диск. Чтобы обойти это, вам нужно перейти к управлению дисками и перевести диск, который вы хотите извлечь, в автономный режим . Если файл находится на вашем загрузочном диске, вы не можете перевести его в автономный режим. В этом случае см. Примечание ниже:

ОБНОВЛЕНИЕ 2018 : я видел такие приложения, как WhatsApp Desktop, сохраняющие дескрипторы на Chrome Canary через системный процесс . Поскольку вы не можете извлечь загрузочный диск (поскольку он используется), решение было использовать другую изящную утилиту Sysinternals , названную Handle . После закрытия программы с заблокированным файлом запустите дескриптор и запустите (в качестве примера) handle64 "Chrome SxS\Application\chrome.exe" чтобы увидеть, присутствуют ли все еще маркеры в файле, который имеет блокировку PID 4. Методом проб и ошибок закрывайте каждую запущенную программу, пока на заблокированном файле больше не останется дескрипторов.

Лучший метод (платный)

Скачайте и запустите SafelyRemove . Он помогает вам извлечь диск и, если он не может этого сделать, показывает, какие процессы заблокированы на нем:

Вы также можете использовать командную строку для запроса журнала Windows, используя wevtutil.exe (начиная с Windows 7), зная, что Windows Kernel-PnP использует событие 225 для регистрации в системе (всегда с идентификатором 4 процесса) отказа от удаления или удаления устройство USB\VID_####&PID_############ (где # обозначают шестнадцатеричные числа).

wevtutil qe System /q:"*[System[(EventID=225)]]" /c:5 /f:text /rd:true
  • qe System: запрос событий из системного журнала
  • /q: запрос с XPath
  • EventID=225 означает, что система отклонила запрос на удаление
  • /c:5: количество записей для извлечения (5 здесь)
  • / f: текст: формат (по умолчанию xml)
  • / rd: true: обратный порядок (сначала самый новый)

Я использую это в пакетном скрипте.

Вот быстрая команда PowerShell, чтобы запросить журнал событий и показать, какое приложение блокирует извлечение диска (у меня работает с Windows 10, возможно, работает и с 7/8)

Get-EventLog -LogName System -after (Get-Date).AddHours(-1) | Where-Object {$_.EventID -eq 225} | Sort-Object TimeGenerated | Format-Table -Wrap

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

PS C:\Users\Jonathan> Get-EventLog -LogName System -after (Get-Date).AddHours(-1) | \Where-Object {$_.EventID -eq 225} | Sort-Object TimeGenerated | Format-Table -Wrap

   Index Time          EntryType   Source                 InstanceID Message
   ----- ----          ---------   ------                 ---------- -------
   14692 Sep 07 10:50  Warning     Microsoft-Windows-Ke          225 The application \Device\HarddiskVolume4\Windows\System32\Taskmgr.exe with process id 11972 stopped
                                   rnel-PnP                          the removal or ejection for the device USB\VID_0781&PID_5575\200445301013C111B1A0.
   14693 Sep 07 10:50  Warning     Microsoft-Windows-Ke          225 The application \Device\HarddiskVolume4\Windows\System32\Taskmgr.exe with process id 11972 stopped
                                   rnel-PnP                          the removal or ejection for the device USB\VID_0781&PID_5575\200445301013C111B1A0.

Вы можете запустить resmon.exe (через WIN+R), перейти на диск> Активность диска> Сортировать по файлу. Теперь вы можете видеть все файлы, к которым обращается система, и какие процессы обращаются к ним, упорядоченные по пути к файлу (который запускается между прочим) с буквой диска). Может работать не во всех случаях, но это простой подход.

Перезагрузка компьютера кажется "освободить" использование устройства. Также для более быстрого удаления вы можете отключить кэширование Windows в разделе "Оборудование" вашего устройства, иногда Windows займет больше времени, чем ожидалось, чтобы сбросить кэш на внешний диск, и отобразит это сообщение о том, что устройство используется (потому что оно будет Сама винда)

Для меня (Windows 7).

  1. Нажмите клавишу Windows
  2. В разделе "Поиск программ и файлов" введите: diskmgmt.msc
  3. В списке поиска найдите запись и щелкните правой кнопкой мыши - выберите "Запуск от имени администратора".
  4. Введите учетные данные администратора для запуска "Управление дисками" (при необходимости)
  5. Найдите оскорбительный USB-накопитель, который не будет извлечен в списке дисков
  6. Левая панель, правой кнопкой мыши выберите " Извлечь "
  7. Дескрипторы "следует" закрыть - вы всегда можете дважды проверить в sys innerals process explorer

Примечание. Значок панели задач "Безопасное извлечение устройства и извлечение носителя" больше не отображает USB-диск - только три точки

  1. Физически удалить диск

Если вы открываете "Мой компьютер", а ваш диск не указан в заголовках "Съемное хранилище", то Windows почему-то рассматривает его как фиксированный системный ресурс. Вам придется размонтировать все разделы на диске.

Если это так, откройте "Управление компьютером", затем перейдите к "Управление дисками". Для каждого раздела на устройстве щелкните правой кнопкой мыши раздел, выберите "Изменить буквы и пути диска" и удалите все буквы дисков, назначенные этому разделу. Как только вы это сделаете, вы должны обнаружить, что функция "безопасного извлечения" работает так, как вы надеялись.

Если вы используете powershell-core (PowerShell 7), вы можете использовать следующее (для удобства чтения ограничено пятью недавними событиями):

      Get-WinEvent -MaxEvents 5 -FilterHashtable @{LogName='System';Id=225} | Format-Table -Wrap

Это похоже на ответ Джона , ноGet-EventLogявляется частью старого API Win32 и не поддерживается в powershell-core.Get-WinEventавтоматически сортируется в хронологическом порядке (по убыванию), поэтому дополнительная сортировка также не требуется.

Я пробовал это с помощью Windows 10.

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

В диспетчере ресурсов столбец с именем image используется для отображения имени процесса, а столбец с именем File может использоваться для проверки того, использует ли процесс ваш диск. Например, адрес файла будет F:/foo/bar.tmpЗатем, если у вашего подключенного USB- накопителя есть буква диска F:, вы можете завершить этот процесс. столбец с именем PID показывает идентификатор процесса.

Чтобы убить процесс: введите CMD или командную строку taskkill /F /PID pid_number

Если бы USB, о котором сообщалось, что windows используется ... такой же, как и все остальные здесь.

В Windows 10 Ctrl + Alt + Del попадает в диспетчер задач.

Найти с помощью прокрутки - Windows Explorer. и выделить.

Справа внизу - приятная дружественная кнопка "Перезапустить процесс".

Двойная тройная проверка, что "Проводник Windows" - единственное, что выделено.

Щелкните левой кнопкой мыши дружественную кнопку "Перезапустить процесс".

У меня был только один Проводник, у других иногда есть два. Просто отметьте, какой из них возвращается. Попробуйте и закройте / извлеките USB. Мой работал нормально, закройте USB.

Если ваш не извлекает / закрывает, то, вероятно, это был другой проводник. Попробуйте еще раз и перезапустите его. Удачи.

Другие вопросы по тегам