3

Наши продавцы установили собственное приложение, которое использует несколько пользовательских COM-объектов /DLL, хранящихся в System32. Я пытался заменить одну из этих библиотек DLL более новой версией, которая прекрасно работает после установки, но не после перезагрузки.

Вот интересная часть.

  1. Я отменяю регистрацию старой DLL с помощью regsvr32 /u myDll.dll
  2. Regsvr32 показывает диалог, указывающий на успех.
  3. Я копирую старую DLL в папку "save" и переименовываю ее в 20110412-myDll.dll_.
  4. Я удаляю оригинал из system32.
  5. Я поставил новую DLL в system32.
  6. Зарегистрируйте новый dll с помощью regsvr32 myDll.dll
  7. Протестируйте новую DLL с VBScript - работает нормально.
  8. И самое интересное
  9. Перезагружать.
  10. Перезапустите тестовый скрипт vb. Это не удается.
  11. Посмотрите на DLL (которую я заменил) в system32. Он был волшебным образом заменен старой DLL. Я проверил это с помощью fc (двоичное сравнение) с system32\myDll.dll и сохраненным 20110412-myDll.dll_.
  12. УДАЛИТЬ старую DLL. Убедитесь, что оно на самом деле прошло.
  13. Поиск всех дисков для "myDll.DLL ", включая системные папки. Убедитесь, что в папке "save" нет экземпляров старой DLL, кроме переименованной версии.
  14. перезагружать
  15. Старая DLL снова волшебным образом появилась.

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

У кого-нибудь есть предложения?

Обновить

Просто, черт возьми, я запустил одну из машин в безопасном режиме, установил новую DLL и снова перезапустил. На этот раз изменение, кажется, сработало, даже после последующего перезапуска. Weird.

Я могу сделать это на других машинах, которые сталкиваются с той же проблемой, и я ожидаю, что это сработает, но я действительно хотел бы знать, в чем проблема. Argh.

2 ответа2

2

Скорее всего, это проблема восстановления системы. Попробуйте отключить его перед заменой DLL.

Дополнительные сведения см. В разделе Что такое восстановление системы в операционных системах Windows?

и http://support.microsoft.com/kb/310405

1

Система заменяет библиотеку DLL файлом C:\Windows\System32\DLLCache помощью функции защиты файлов Windows. Проверьте Системный журнал в Просмотрщике событий (в Администрировании) для этого события:

Event ID: 64001
Source: Windows File Protection
Description: File replacement was attempted on the protected system file C:\Windows\System32\myDll.DLL . This file was restored to the original version to maintain system stability. The file version of the system file is x.x:x.x. 

Попробуйте удалить файл DLL, хранящийся в DLLCache , снова замените DLL в System32 , затем перезагрузите компьютер

Изменить: Проверьте журналы в вашем программном обеспечении безопасности, так как некоторые программы безопасности отслеживают системные DLL и блокируют попытки заменить файл. Вы также можете попробовать использовать Process Monitor, чтобы проверить, какая программа заменяет DLL, особенно во время запуска, с помощью функции "Включить ведение журнала загрузки", расположенной в разделе "Параметры".

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .