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

