3

我使用 NSIS 编写了一个安装程序,我需要它在标准位置(如 C:/Program Files/App Name/)安装一些文件(DLL 等)。我还需要在当前用户的 Application Data 目录中安装文件。问题是,当用户不是 Vista 上的管理员时,我需要提升权限,这样做时环境变量会发生变化,因此当前用户现在似乎是管理员用户,我最终安装在管理员用户的目录中,而不是实际用户。您必须在启动安装程序时提升,所以我无法获取用户名然后提升。当我以管理员身份运行安装程序时,是否有一些合理的方法可以确定实际用户是谁?

编辑:不幸的是,在第一次运行时复制数据不是一种选择。如果没有我写入用户目录的内容,该应用程序将无法运行,因为它是一个 MS Word 模板。如果没有模板,我的东西将无法运行,因此我必须在安装时编写模板,并且 Word 要求模板位于用户的 AppData 目录中。

4

3 回答 3

3

我所有的 NSIS 安装程序都使用这个 UAC 插件: http: //nsis.sourceforge.net/UAC_plug-in

启动安装程序后,您可以升级为管理员。这会生成完成所有工作的安装程序的第二个实例。但是您可以以启动安装程序的用户身份调用将在原始进程中运行的代码段。

所以你可以有一个像这样的安装程序部分:

Section "Install My Program" SecMain
    ...    
    # Install files to common folders
    ...
    !insertmacro UAC.CallFunctionAsUser CopyUserWordTemplate
    ...
SectionEnd

Function CopyUserWordTemplate
    SetOutPath $LOCALAPPDATA
    File "MyWordTemplate.dot"
FunctionEnd
于 2009-05-07T14:43:06.990 回答
2

如果另一个用户尝试运行该应用程序怎么办?然后文件将不可用 - 这是我与数月斗争的问题......

我发现的最佳解决方案是利用一个鲜为人知(且完全未记录)的 Windows 功能,称为Active Setup。请参阅http://www.etlengineering.com/installer/activesetup.txt以了解其工作原理。

这是 IE 用来安装每个用户设置的相同功能,总结上面的链接,基本上你创建一个注册表项,Windows 每次用户登录时都会检查它。如果 HKCU 键中的值小于找到的值在 HKLM 中,它运行您定义的脚本/程序/任何东西。您将每个用户的文件安装到程序文件文件夹中,然后在下次登录时使用 Active Setup 功能将它们复制到用户配置文件中。如果您需要确保它们在安装完成时在那里,请在安装完成时安排重新启动。

PS。如果使用 MSI 而不是 NSIS,那么您在启动安装程序时不必提升,Vista 应该在执行序列开始时触发提升(如果安装程序设计正确 - 很少) - 但是当您使用 NSIS那么我猜你需要在安装程序运行时触发提升。

编辑:哈哈,我的确切问题也与 MS Word 模板有关!我为 Word 模板找到的解决方案是从该注册表项中包含的路径下的文件夹中读取安装目录HKLM\SOFTWARE\Microsft\Windows\CurrentVersion\App Paths\Winword.exe并安装到该文件夹​​中。STARTUP系统将提示用户在第一次运行时允许执行宏,即使它已经过数字签名,但它可供所有用户使用。确保也将模板设置为只读,以避免以后出现任何权限错误。

于 2009-01-13T22:33:45.500 回答
1

查看Windows 7 徽标计划文档。它指出:

请注意,在每台机器安装中,用户数据必须在首次运行时写入,而不是在安装期间写入,因为在安装时没有正确的用户位置来存储日期。

如果您的应用程序仅适用于一位用户。然后你应该安装到本地设置文件夹(我认为 vista 和 windows 7 上的名称略有不同)。

于 2009-01-13T21:11:06.197 回答