具有每个用户和管理部分的 Windows 安装程序
Posted
技术标签:
【中文标题】具有每个用户和管理部分的 Windows 安装程序【英文标题】:Windows installer with both per-user and admin parts 【发布时间】:2011-11-10 20:27:04 【问题描述】:是否可以构建一个 MSI 安装程序,它可以为非管理员用户进行按用户安装(将文件复制到非管理员用户的目录),但也可以将文件复制到 Program Files 或其他仅限管理员的目录?使用 NSIS 存在一个 UAC 插件,它允许某些步骤以普通用户身份运行,而其他步骤则以提升的权限运行。 MSI 是否存在这样的事情,或者有什么方法可以在获得管理员权限的同时保留原始用户上下文?
【问题讨论】:
【参考方案1】:不,这是不可能的。安装要么在用户上下文中运行,要么在提升的系统上下文中运行。
但它不会阻止您将某些文件复制到用户的配置文件中。这些文件将继承文件夹上设置的默认权限。默认设置是对用户、系统和管理员组的完全访问权限。
虽然技术上可行,但我不建议使用它。考虑一台有多个用户的计算机:其中一个安装您的 MSI 包,并且他们将文件安装在用户的配置文件中。另一个用户登录这台计算机并从“开始”菜单启动您的应用程序:用户的配置文件中没有文件,而您的应用程序希望它们在那里。
解决此问题的最佳方法是将要进入用户配置文件的文件安装到 Program Files。在您的应用程序第一次启动时,它会将这些文件复制到用户的配置文件中。因此,多用户计算机的每个用户都可以使用您的应用程序。
如果要在用户之间共享这些数据,请考虑将它们安装到 ProgramData,CommonAppDataFolder
property。这样文件将对所有计算机用户可见和可读。然而,只有安装该应用程序的用户才具有写入权限,因此您的安装程序应修改 ProgramData 内您的应用程序文件夹的权限,以将写入权限授予其他用户。
【讨论】:
同意答案:使用安装程序复制每台机器的文件,然后让应用程序在首次启动时将它们复制到用户配置文件中。然后在 HKCU 中设置一个标志来指示该用户的复制操作已经完成。但是,说安装程序在用户上下文或提升的系统上下文中运行有点不准确 - 它实际上在两种上下文中运行,但在安装顺序中的不同时间。简而言之,GUI 在用户上下文中运行,而文件副本以提升的权限运行。如果需要,我可以添加更长的解释作为单独的答案。这里空间不足 @Glytzhkof 我的意思是安装过程(复制文件,写入注册表项)在当前用户上下文中运行,在每用户安装中,或者在提升的系统上下文中,在每台机器安装中. GUI 向导始终在当前用户上下文中运行。 您的建议的问题以及我试图做我所描述的原因是有问题的文件必须放在用户的 appdata 目录中(它是一个 MS Word 全局模板和 Word在用户的 STARTUP 目录中查找这些)。 @idontwanttortfm 但是,即使安装升级运行,也没有什么能阻止您将 Word 模板放入用户的配置文件中。您应该使用AppDataFolder
property 来引用安装模板中的用户配置文件,并添加Microsoft\Templates
。请注意,它会仅安装给当前用户,计算机的其他用户不会拥有您的模板文件。 Office 模板文件的共享位置在C:\Program Files\Microsoft Office\Templates\1033
。数字 1033
是 Windows 区域设置 ID。
@AlexeyIvanov 我认为问题在于安装程序以管理员用户而不是非管理员用户身份运行,因此模板进入了错误用户的 AppDataFolder。【参考方案2】:
请看这篇文章:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd408068(v=vs.85).aspx
【讨论】:
如果我理解正确的话,它是一个可以按用户或所有用户安装的安装程序。我正在寻找两者,也就是说,将文件安装在仅限管理员的位置,如 Program Files,同时还在非管理员用户自己的目录(如用户的应用程序数据目录)中安装一些文件。以上是关于具有每个用户和管理部分的 Windows 安装程序的主要内容,如果未能解决你的问题,请参考以下文章