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

问题描述:

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

编辑: 不幸的是,第一次运行时复制的数据不是一个选项。没有我写给用户目录的东西,该应用程序就无法工作,因为它是一个MS Word模板。我的东西不会在没有模板的情况下运行,所以我必须在安装时编写模板,Word要求模板位于用户的AppData目录中。

我所有的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 

看看Windows 7 Logo Program文档。它指出:

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

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

+0

+1,做OS X的把戏,只是做这些事情上的应用程序的第一次执行,因为你不能保证用户谁运行该应用程序是谁安装它。 – 2009-01-13 21:38:22

+0

不幸的是,这不是一个选项。没有我写给用户目录的东西,该应用程序就无法工作,因为它是一个MS Word模板。我的东西不会在没有模板的情况下运行,所以我必须在安装时编写模板,Word要求模板位于用户的AppData目录中。 – alanc10n 2009-01-13 22:19:08

如果其他用户试图运行该应用程序会怎么样?然后这些文件将不可用 - 这是一个问题,我与几个月作斗争...

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

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

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

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