NSIS становится владельцем системных файлов IIS - PullRequest
2 голосов
/ 05 марта 2011

Недавно я столкнулся с проблемой в NSIS, которая, по моему мнению, связана с взаимодействием с UAC, но я затрудняюсь объяснить это и не знаю, как предотвратить это в будущем.

Iиметь установщик, который создает и удаляет виртуальные каталоги IIS с помощью плагина NsisIIS.Установщик корректно работал на моей рабочей станции Windows 7.Когда установщик запускался на сервере Windows 2008 R2, он устанавливался правильно, но деинсталлятор удалил все виртуальные каталоги и поставил IIS в нерабочее состояние;до такой степени, что мне пришлось удалить веб-сайт по умолчанию и повторно добавить его.

В конечном итоге я обнаружил, что все файлы конфигурации IIS в C:\Windows\System32\inetsrv\config имеют значок блокировки на них.

Screenshot of IIS config files after NSIS runs

Некоторые расследование , похоже, указывают на то, что это означает, что учетная запись пользователя стала владельцем файла, однако все файлы, перечисленные SYSTEM в качестве файлавладелец.Я проверил другой сервер, на котором я не запускал установщик, и у не есть значок блокировки, примененный к файлам IIS.

Я также видел, что появляется тот же значок блокировкина других файлах, которые создает установщик NSIS.Например, у меня есть файл Web.Config.tpl, который обрабатывается с использованием NSIS ReplaceInFile, который также отображается со значком замка после завершения установки.locked web.config file after installer runs

После того, как я явно предоставил доступ к файлу другой учетной записи пользователя, значок блокировки исчезает.

After adding the IUSR to the file

Я запускаю установщик под локальным администраторомучетная запись на сервере 2008 R2, поэтому я не получаю приглашение UAC.Вот соответствующий код из install.nsi файла

RequestExecutionLevel admin

Section "Application" APP_SECTION
   SectionIn RO
   Call InstallApp
SectionEnd

Section "un.Uninstaller Section"
   Delete "$PROGRAMFILES\${PROGRAMFILESDIR}\Uninstall.exe"
   Call un.InstallApp
SectionEnd

Function InstallApp
   File /oname=Web.Config Web.Config.tpl
   !insertmacro ReplaceInFile Web.Config %CONNECTION_STRING% $CONNECTION_STRING
FunctionEnd

Function un.InstallApp
   ReadRegStr $0 HKLM "Software\${REGKEY}" "VirtualDir"    
   NsisIIS::DeleteVDir "$0"
   Pop $0
FunctionEnd

У меня есть три вопроса, связанных с этим инцидентом:

  1. Как это произошло?
  2. Какя могу исправить мой установщик, чтобы предотвратить его повторение?
  3. Как я могу восстановить разрешения для файлов конфигурации IIS.

1 Ответ

1 голос
/ 05 марта 2011

Макрос ReplaceInFile выполняет удаление и переименование танца, возможно, это портит информацию о безопасности файла.Вы можете попытаться обойти это, используя макрос для копии файла, который вы хотите изменить, а затем используйте FileOpen и копируйте в новое содержимое построчно.

Плагин IIS использует интерфейс IIS COM,не совсем уверен, что там может пойти не так.Вероятно, стоит убедиться, что вы не передаете пустую строку в NsisIIS :: DeleteVDir.

...