以管理员身份运行时获取当前登录用户

时间:2009-01-13 17:29:56

标签: windows installer nsis

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

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

如果其他用户尝试运行该应用程序该怎么办?然后文件将无法使用 - 这是我与之斗争了好几个月的问题......

我发现的最佳解决方案是利用一个名为 Active Setup 的鲜为人知(并且完全没有记录)的Windows功能。有关其工作原理的详细说明,请参阅http://www.etlengineering.com/installer/activesetup.txt

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

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

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

答案 2 :(得分:1)

查看Windows 7 Logo Program文档。它声明:

  

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

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

相关问题