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

3
我使用NSIS编写了一个安装程序,需要将一些文件(DLL等)安装到标准位置,例如C:/Program Files/App Name/。我还需要将文件安装到当前用户的应用程序数据目录中。问题是,当用户在Vista上不是管理员时,我需要提升权限,这样环境变量会改变,因此当前用户现在似乎是管理员用户,我最终会安装在管理员用户的目录而不是实际用户的目录中。由于必须在启动安装程序时提升权限,因此无法获取用户名并提升权限。在以管理员身份运行安装程序时,是否有合理的方法来确定实际用户是谁?
编辑: 不幸的是,在第一次运行时复制数据不是一个选项。如果我不将我要写入用户目录的东西(MS Word模板)写入其中,我的应用程序将无法正常工作。我的东西没有模板就无法运行,因此我必须在安装时写入模板,而Word要求模板位于用户的AppData目录中。
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

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文件夹中。 即使数字签名,用户第一次运行时也会提示允许宏执行,但它将对所有用户可用。 确保将模板设置为只读,以避免以后出现任何权限错误。

这看起来非常酷,我要设置一下并查看它是否能够完成我需要做的所有事情。如果可以,你真的很有帮助。实际上,无论我的测试结果如何,你都非常有帮助。谢谢。 - alanc10n

1

请查看Windows 7 Logo Program文档。其中提到:

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

如果您的应用程序仅适用于一个用户,则应安装到本地设置文件夹(在Vista和Windows 7上名称略有不同)。


+1,在应用程序的首次执行时进行OS X技巧处理,因为不能保证运行应用程序的用户是安装它的那个人。 - Ana Betts
很遗憾,这不是一个选项。如果我不将东西写入用户目录,应用程序将无法工作,因为它是一个 MS Word 模板。我的东西没有模板是无法运行的,所以我必须在安装时编写模板,而 Word 要求模板位于用户的 AppData 目录中。 - alanc10n

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接