我最近遇到了NSIS的一个问题,我认为这与UAC的互动有关,但我无法解释它,我不知道将来如何防止它。
我有一个安装程序,可以使用NsisIIS插件创建和删除IIS虚拟目录。安装程序似乎在我的Windows 7工作站上正常工作。当安装程序在Windows 2008 R2服务器上运行时,它安装正确,但卸载程序删除了所有虚拟目录并将IIS置于不可用状态;到了我必须删除默认网站并重新添加它。
我最终发现C:\Windows\System32\inetsrv\config
下的所有IIS配置文件都有锁定图标。
某些investigation似乎表明这意味着用户帐户已取得该文件的所有权,但所有文件都列为SYSTEM
作为文件所有者。我确实检查了一个我没有运行安装程序的服务器,它确实不将锁定图标应用于IIS文件。
我还看到NSIS安装程序创建的其他文件上出现了相同的锁图标。例如,我有一个使用NSIS ReplaceInFile处理的Web.Config.tpl
文件,该文件在安装程序完成后也会显示锁定图标。
在我明确授予另一个用户帐户访问权限后,锁定图标就会消失。
我在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
我有三个问题源于此事件:
答案 0 :(得分:1)
ReplaceInFile宏执行删除和重命名舞蹈,这可能会混淆文件安全信息。您可以尝试通过在要修改的文件的副本上使用宏来解决此问题,然后使用FileOpen并逐行复制新内容。
IIS插件使用IIS COM接口,不确定那里可能出现什么问题。确保不将空字符串传递给NsisIIS :: DeleteVDir可能是个好主意。