以其他用户身份运行时,以NSIS安装程序登录用户名[admin]

时间:2018-02-17 18:18:38

标签: nsis appdata limited-user

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

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

我目前正在使用NSIS v2.49,我在2年内没有更新,所以我认为它已经过时了。在撰写本文时,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安装程序是否无法确定登录用户的用户名?

1 个答案:

答案 0 :(得分:1)

这就是UAC的工作方式。

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

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

您可以在Certification requirements for Windows desktop apps或较早的Windows Logo requirements文档中找到这些建议:

  

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

中      

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

中      

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

     

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