以另一个用户[管理员]身份运行时,在NSIS安装程序中登录用户名

以另一个用户[管理员]身份运行时,在NSIS安装程序中登录用户名,nsis,appdata,limited-user,Nsis,Appdata,Limited User,我创建了一个需要提升的NSIS安装程序,并在usersAppData目录中安装了一些文件。只要当前用户是管理员,这就可以正常工作。如果用户是受限用户,则他们必须以管理员身份运行安装程序,并将管理员凭据传递给安装程序。除了NSIS将文件安装到管理员用户AppData目录之外,这一切都非常有效。这是因为我一直在使用$PROFILE变量来确定在何处安装文件,但$PROFILE将路径返回给运行安装程序的用户,而不是登录到系统的用户 因此,需要明确的是,如果用户A是一个受限帐户,而用户B是管理员帐户,那么

我创建了一个需要提升的NSIS安装程序,并在users
AppData
目录中安装了一些文件。只要当前用户是管理员,这就可以正常工作。如果用户是受限用户,则他们必须以管理员身份运行安装程序,并将管理员凭据传递给安装程序。除了NSIS将文件安装到管理员用户
AppData
目录之外,这一切都非常有效。这是因为我一直在使用
$PROFILE
变量来确定在何处安装文件,但
$PROFILE
将路径返回给运行安装程序的用户,而不是登录到系统的用户

因此,需要明确的是,如果
用户A
是一个受限帐户,而
用户B
是管理员帐户,那么当我使用
用户A
登录计算机并运行安装程序时,传递
用户B
的凭据,我只能从NSIS获取
用户B
的用户名,因此无法为
用户A
安装必要的文件

我目前正在使用NSIS v2.49,我已经两年多没有更新过它了,所以我认为它已经过时了。在撰写本文时,sourceforge上的NSIS站点已经关闭了几天,因此很难找到该软件的最新副本。如果有人能指出这有助于解决这个问题,我愿意升级到NSIS v3.x

下面是一些非常简单的代码来演示我的问题。如果您构建此安装程序并在有限用户桌面上运行它,它将演示3种不同的尝试以获取当前登录的用户名,但所有3种方法都将返回运行安装程序的用户的名称:

Outfile Test.exe
RequestExecutionLevel admin ;Require admin rights on NT6+ (When UAC is turned on)

!include LogicLib.nsh

Function .onInit
UserInfo::GetAccountType
pop $0
${If} $0 != "admin" ;Require admin rights on NT4+
    MessageBox mb_iconstop "Administrator rights required!"
    SetErrorLevel 740 ;ERROR_ELEVATION_REQUIRED
    Quit
${EndIf}

MessageBox MB_OK $PROFILE
System::Call "advapi32::GetUserName(t .r0, *i ${NSIS_MAX_STRLEN} r1) i.r2"
MessageBox MB_OK "User name Test 1: $0"
ReadEnvStr $0 "USERNAME" 
MessageBox MB_OK "User name Test 2: $0" 

FunctionEnd

Page instfiles

Section
SectionEnd

作为另一个用户运行安装程序时,NSIS安装程序无法确定登录用户的用户名吗?

UAC就是这样工作的

如果您需要提升,那么您正在进行计算机/所有用户安装,您应该只写入$ProgramFiles和HKLM。将
SetShellVarContext all
添加到
.onInit
函数中,以防止写入用户配置文件。您还应该禁用“完成”页面上的“运行”复选框

如果应用程序需要$AppData中的数据,则应用程序应在用户第一次运行应用程序时将$ProgramFiles、ProgramData(SetShellVarContext all+$AppData)或$COMMONFILES中的模板数据复制到$AppData中。至少从Windows 2000开始,这就是Windows徽标程序中的一项要求

您可以在或旧文档中找到这些建议:

10.3必须在计算机上的用户之间共享的应用程序数据应存储在ProgramData中

10.4您的应用程序的数据是特定用户专有的,并且不能与计算机的其他用户共享,必须存储在users\%username%\AppData中

10.6您的应用程序必须在第一次运行时写入用户数据,而不是在“每台机器”安装过程中写入用户数据

安装应用程序时,没有正确的用户位置 存储数据。应用尝试修改默认关联 安装后在机器级别的行为将不成功。 相反,必须在每个用户级别声明默认值,这会阻止 防止多个用户覆盖彼此的默认值


NSIS网站仍处于关闭状态,因为Sourceforge正在迁移到另一个数据中心,但下载是可用的@,您应该升级并启用Unicode支持。UAC问题不会改变。登录用户是指锁定屏幕上键入的凭据吗?Explorer.exes用户?一个由runas.exe启动的中间人用户?谢谢你的回答。我不知道,但这一切都有道理!