当前位置: 首页 > 知识库问答 >
问题:

Inno安装使用{localappdata}登录用户

詹高畅
2023-03-14

遇到此问题时,我正在尝试使用 Inno Setup 创建安装程序,其他所有内容都在安装,但注册表项未安装在当前用户中。我发现了这个有用的主题(非常感谢!
Inno 设置 为登录用户(非管理员用户)创建注册表项

这解决了添加注册表项的问题,如下所示:

 [Run]
 Filename: reg.exe; \
   Parameters: "ADD ""HKCU\Software\myprinter"" /v OutputFile /t REG_SZ /d ""{localappdata}\temp\\"""; \
   Flags: runasoriginaluser runhidden

我的问题:
{localappdata} 指的是管理员用户(管理员)而不是本地用户(测试):

它添加了:HKCU\Software\myprinter OutputFile REG_SZ c:\users\admin\appdata\local\temp\

必需:HKCU\Software\myprinter OutputFile REG_SZ c:\users\test\appdata\local\temp\

该软件无法工作,因为它不允许使用管理员临时(当然)

尽管根据在线帮助,它应该适用于启动安装程序的用户,但就我而言,似乎并非如此。(带或不带安装后配置标志)

runasoriginaluser

仅在[运行]部分有效。如果指定了此标志,并且系统运行的是Windows Vista或更高版本,则衍生的进程将使用最初启动安装程序的用户的(通常为非提升的)凭据(即“UAC对话前”凭据)来执行。

这是使用postinstall标志时的默认行为。

如果用户通过右键单击其EXE文件并选择“以管理员身份运行”来启动安装程序,那么不幸的是,此标志将无效,因为安装程序没有机会使用原始用户凭据运行任何代码。如果安装程序是从已经提升的进程启动的,情况也是如此。但是请注意,这不是Inno安装程序特定的限制;在这种情况下,基于Windows安装程序的安装程序也不能返回到原始用户凭据。

此标志不能与runascurrentuser标志结合使用。

注意:运行Inno Setup:5.5.9(a)和Windows 10

共有1个答案

叶华皓
2023-03-14

首先,你的方法不正确。

有两种正确的方法:

>

  • 如果安装程序仅为当前(非特权)用户安装应用程序,则不需要管理员权限。使用PrivilegesRequired=最低

     PrivilegesRequired=lowest
    

    然后,<code>{localappdata}</code>常量(和类似的)将正确引用当前用户的文件夹。

    如果安装程序为所有用户安装应用程序,则更新某个特定用户的注册表是没有意义的。所有用户都需要注册表设置,而不仅仅是一个。在这种情况下,推荐的方法是在< code>HKLM中设置通用注册表设置(或将设置存储到某个通用文件中)。并让应用程序在第一次运行时将设置复制到用户注册表配置单元。

    另请参阅当用户使用“以管理员身份运行”时,如何使用安装程序写入用户的我的文档目录。

    您还可以允许用户在这两种方法之间进行选择。< br >请参见使Inno Setup安装程序仅在需要时请求权限提升。

    这个问题从更广泛的角度涵盖了这个主题:
    从以管理员身份运行的Inno安装程序为当前登录的用户安装应用程序

    有关类似问题,请参见

      < li>Inno Setup -将用户文件放入管理文档中 < li>Inno安装程序总是安装到管理员的AppData目录中

    无论如何,{localappdata}常量由Inno Setup进程解析,在Administrator帐户上下文中运行。并且解析决不受runasoriginaluser标志的影响。

    但是您可以使用等效的 %LOCALAPPDATA% 环境变量,该变量将由执行的进程解析,即在“原始用户”上下文中。

    要允许环境变量解析,您需要通过< code>cmd.exe执行该命令。

    [Run]
    Filename: {cmd}; \
        Parameters: "/C reg.exe ADD ""HKCU\Software\myprinter"" /v OutputFile /t REG_SZ /d ""%LOCALAPPDATA%\temp\\"""; \
        Flags: runasoriginaluser runhidden
    

    尽管这是不现实的。

    有关另一种方法,请参阅Inno Setup-从需要权限的安装程序中访问非特权帐户文件夹。

  •  类似资料:
    • 我有两个二进制文件,必须为它们创建一个服务。我尝试了一个解决方案,使用“SC创建”从如何安装Windows服务与Inno安装?

    • 我创建了这个简单的脚本: 通知?它为什么要将其安装到Windows文件夹中? 我如何指定我真正想要安装文件的文件夹?

    • 我目前正在使用React在一个网站上工作,我希望能够有用户登录。现在,我的策略是在提交时将表单数据发送到服务器(express),如果信息与我的数据库中的用户匹配,服务器将发回一个签名的JWT,其中没有敏感信息(只有用户名)。 一旦客户机接收到JWT,我就将它添加到localStorage中,并将它的解码数据添加到redux存储中。我计划让我的redux存储当前登录的用户。

    • 我使用Inno Setup 6. x的目标是在代码中自定义文本,即Pascal Script。我使用Pascal Script的原因是我只想在为真时自定义/更改标签。我该怎么做? 以下两种方法不起作用: > 使用脚本常量: 这显示的是“{code:GetFinishedLabel}”,而不是“BLA”。 在< code>InitializeWizard中自定义向导。 完整(失败)示例: 仍然显示中

    • 我想首先将现有文件“我的程序旧”重命名为“我的程序v2”,但前提是“我的程序v2”还不存在。 然后我想将“我的程序”重命名为“我的程序旧”,但前提是“我的程序旧”不存在。 然后我想从安装程序安装‘我的程序',但前提是’我的程序‘还不存在。 我将非常感谢任何指导!