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

Posted

技术标签:

【中文标题】以管理员身份运行时获取当前登录的用户【英文标题】:Getting currently logged on user when running as admin 【发布时间】:2009-01-13 17:29:56 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

这看起来很酷,我要设置它,看看它是否能完成我需要做的所有事情。如果是这样,你已经非常有帮助了。事实上,无论我的测试结果如何,你都非常有帮助。谢谢。【参考方案3】:

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

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

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

【讨论】:

+1,做 OS X 的把戏,只在应用程序第一次执行时做这些事情,因为你不能保证运行应用程序的用户就是安装它的用户。 不幸的是,这不是一个选项。如果没有我写入用户目录的内容,该应用程序将无法运行,因为它是一个 MS Word 模板。没有模板我的东西不会运行,所以我必须在安装时编写模板,Word 要求模板位于用户的 AppData 目录中。

以上是关于以管理员身份运行时获取当前登录的用户的主要内容,如果未能解决你的问题,请参考以下文章

使用标准用户帐户在提升的脚本中获取登录用户名

为以访客身份登录的用户从服务器下载文件

以管理员身份运行

win7所有程序都只能用管理员身份运行

Powershell 以管理员用户身份运行命令行

安全计算环境linux-身份鉴别技术 2021-03-06