You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Electron+NSIS安装包首次选用户后静默崩溃问题排查

问题描述

我用Electron把Python-Flask Web应用转成桌面应用,用带自定义NSIS脚本的electron-builder制作安装包,还自定义了用户信息页面。现在遇到的问题是:首次安装时,选择“Admin user”/“Only for me”选项后,安装包会直接静默关闭;但第二次安装就能正常运行。

用户信息页面:
用户信息页面

用户选择页面(崩溃节点):
用户选择页面

我的NSIS配置:

nsis:
  oneClick: false
  perMachine: false
  allowElevation: false
  allowToChangeInstallationDirectory: true
  createDesktopShortcut: true
  createStartMenuShortcut: true
  shortcutName: FCC ValveSizing
  installerIcon: assets/FCC_Logo.ico
  uninstallerIcon: assets/FCC_Logo.ico
  deleteAppDataOnUninstall: true
  include: assets/installer.nsh
  language: 1033 # English
  installerSidebar: assets/installer_sidebar.bmp
  installerHeaderIcon: assets/FCC_Logo.ico
  differentialPackage: false

installer.nsh脚本:

!include "MUI2.nsh"
!include "nsDialogs.nsh"
!include "LogicLib.nsh"
!include "FileFunc.nsh"
!insertmacro GetTime

!ifndef BUILD_UNINSTALLER
Var Dialog
Var NameInput
Var UserName
Var OriginalAppData
!endif

!macro customInit
    !ifndef BUILD_UNINSTALLER
        ReadRegStr $UserName HKCU "Software\FCCValveSizing\Setup" "UserName"
        ReadRegStr $OriginalAppData HKCU "Software\FCCValveSizing\Setup" "AppData"
        ${If} $OriginalAppData == ""
            StrCpy $OriginalAppData $APPDATA
        ${EndIf}
    !endif
!macroend

!macro customWelcomePage
    !ifndef BUILD_UNINSTALLER
        !ifdef MUI_WELCOMEPAGE_TITLE
            !undef MUI_WELCOMEPAGE_TITLE
        !endif
        !ifdef MUI_WELCOMEPAGE_TEXT
            !undef MUI_WELCOMEPAGE_TEXT
        !endif
        !define MUI_WELCOMEPAGE_TITLE "Welcome to FCC-ValveSizing Setup"
        !define MUI_WELCOMEPAGE_TEXT \
        "This installer will guide you through the installation of ValveSizing.$\r$\n\
        $\r$\n\
        Developed by FCCommune.$\r$\n\
        $\r$\n\
        Click Next to continue."

        !insertmacro MUI_PAGE_WELCOME
        !insertmacro MUI_PAGE_LICENSE "${BUILD_RESOURCES_DIR}\..\license.rtf"
        Page custom CustomerDetailsPage CustomerDetailsPageLeave
    !endif
!macroend

!ifndef BUILD_UNINSTALLER

Function CustomerDetailsPage
    !insertmacro MUI_HEADER_TEXT \
        "User Information" \
        "Enter your name to personalize your experience."

    nsDialogs::Create 1018
    Pop $Dialog

    ${If} $Dialog == error
        Abort
    ${EndIf}

    ${NSD_CreateLabel} 10u 10u 100u 12u "User Name:"
    Pop $R1

    ${NSD_CreateText} 10u 24u 220u 14u "$UserName"
    Pop $NameInput

    nsDialogs::Show
FunctionEnd

Function CustomerDetailsPageLeave
    ${NSD_GetText} $NameInput $UserName

    ${If} $UserName == ""
        MessageBox MB_OK|MB_ICONEXCLAMATION "Please enter your name before continuing."
        Abort
    ${EndIf}

    WriteRegStr HKCU "Software\FCCValveSizing\Setup" "UserName" "$UserName"
    WriteRegStr HKCU "Software\FCCValveSizing\Setup" "AppData" "$OriginalAppData"
FunctionEnd

!endif

!macro customInstall
    !ifndef BUILD_UNINSTALLER
        ${If} $UserName == ""
            ReadRegStr $UserName HKCU "Software\FCCValveSizing\Setup" "UserName"
        ${EndIf}
        ${If} $OriginalAppData == ""
            ReadRegStr $OriginalAppData HKCU "Software\FCCValveSizing\Setup" "AppData"
        ${EndIf}

        CreateDirectory "$OriginalAppData\ValveSizing"

        ${GetTime} "" "L" $0 $1 $2 $3 $4 $5 $6

        FileOpen $R0 "$OriginalAppData\ValveSizing\user.json" w
        FileWrite $R0 '{$\n'
        FileWrite $R0 '  "name": "$UserName",$\n'
        FileWrite $R0 '  "createdAt": "$2-$1-$0"$\n'
        FileWrite $R0 '}'
        FileClose $R0

        DeleteRegKey HKCU "Software\FCCValveSizing\Setup"
    !endif
!macroend

请问该问题的可能原因是什么?


可能的原因分析

1. 安装上下文切换导致路径变量失效

你的NSIS配置中perMachine: false但开启了非一键安装模式,当用户选择“Admin user”时,安装程序会尝试切换到管理员上下文运行,但customInit宏在初始化阶段就提前赋值$OriginalAppData = $APPDATA——此时的$APPDATA是当前普通用户的路径,切换到管理员上下文后,这个路径对管理员身份来说可能没有写入权限,后续在customInstall中创建目录、写入user.json时触发权限错误,导致安装程序静默崩溃。

第二次安装时,注册表中已存在AppData记录,即使上下文切换,读取到的是之前保存的有效路径,因此能正常执行。

2. 自定义页面与内置页面流程冲突

electron-builder的NSIS非一键安装模板中,默认会在欢迎页之后显示用户类型选择页面(即你说的崩溃节点页面),但你的customWelcomePage宏直接插入了自定义的用户信息页面,跳过了内置页面的处理逻辑。当用户选择安装类型后,安装程序的内置流程无法正确衔接自定义页面的后续步骤,导致流程中断。

3. 注册表操作的权限与上下文矛盾

当用户选择“Admin user”时,安装程序以管理员身份运行,此时HKCU对应的是管理员用户的注册表分支,而非当前普通用户的。首次安装时写入HKCU\Software\FCCValveSizing\Setup的信息对普通用户不可见,但第二次安装如果是普通用户身份,读取不到之前的注册表值,反而触发了$OriginalAppData = $APPDATA的逻辑,使用当前用户的有效路径,因此能正常运行。

4. allowElevation: false的配置矛盾

你设置了allowElevation: false,但用户选择“Admin user”时需要提升权限,这会导致权限请求被拒绝,安装程序无法继续执行必要的系统操作,最终静默退出。第二次安装时,可能系统已缓存某些权限状态,或者安装程序以兼容模式运行,因此绕过了这个问题。


内容的提问来源于stack exchange,提问作者PARASU RAM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 05:34:50