Здравствуйте уважаемые читатели!

Хочу в этом посте рассказать о способе замены файлов, занятых каким-либо процессом операционной системы (ОС) и которые нельзя заменить или удалить из пользовательской сессии.

Необходимость в такой замене появляется, например, при установке приватного хотфикса, который может представлять из себя просто одну или несколько библиотек dll.

Возможные варианты:

  1. Остановить сервис или завершить приложение, которое “держит” файл(ы).
  2. Если остановить сервис или приложение не удается, то можно “убить” процесс из панели задач или командой taskkill, используя PID или имя процесса.
  3. Первые два случая могут не подходить по причине того, что требуется замена файлов занятых службами, остановка которых невозможна или приведет к нестабильности системы и потери контроля. Как например служба Remote Desktop Services и процесс svchost.exe. В этом случае можно воспользоваться утилитами MoveFile и PendMoves из пакета Sysinternals.
  • MoveFile – Позволяет запланировать (отложить) переименование/удаление файла до следующей перезагрузки системы.
  • PendMoves – Позволяет просмотреть весь список отложенных операций переименования/удаления, который запланирован в системе.
Если с PendMoves все достаточно просто – утилита запускается без параметров и выдает список операций, то MoveFile рекомендую использовать следующим способом:
  1. Запланировать операцию удаления файла, который должен быть заменен.
  2. Запланировать операцию перемещения/переименования нового файла вместо удаленного.

Пример использования MoveFile:

MoveFile "C:\Program Files (x86)\Citrix\system32\rpm.dll" ""

MoveFile "C:\Temp\Hotfix\rpm.dll" "C:\Program Files (x86)\Citrix\system32\rpm.dll"

Обратите внимание на пустые кавычки в качестве destination у первой команды, означающих удаление файла.
При следующем старте системы файл rpm.dll в каталоге C:\Program Files (x86)\Citrix\system32 будет заменен файлом из каталога c:\temp\hotfixes

Пример вывода PendMoves:

PendMove v1.1
Copyright (C) 2004 Mark Russinovich
Sysinternals - wwww.sysinternals.com
Source: C:\Program Files (x86)\Citrix\system32\rpm.dll
Target: DELETE
Source: C:\Temp\Hotfix\rpm.dll
Target: C:\Program Files (x86)\Citrix\system32\rpm.dll
Time of last update to pending moves key: 15-Aug-13 10:41 AM
Дополнительные советы по использованию:
  • Не забудьте сделать резервную копию ваших файлов перед заменой!
  • Перемещаемые файлы должны находиться на локальных дисках системы.
  • Если планируете часто пользоваться утилитами – скопируйте их в каталог c:\windows\system32.
  • При первом запуске утилиты выводят запрос о согласии с лицензионной политикой, который можно отключить для использования в скриптах с помощью параметра /accepteula
Удачного использования!