From a8c17e86db4423263600f6e212ab36501d3d5d9c Mon Sep 17 00:00:00 2001 From: Amr Bashir Date: Mon, 19 Jun 2023 18:13:28 +0300 Subject: [PATCH] fix(updater): fix nsis updater unable to launch installers requiring elevation ref: https://github.com/tauri-apps/tauri/pull/7185 --- plugins/updater/src/updater/core.rs | 44 ++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/plugins/updater/src/updater/core.rs b/plugins/updater/src/updater/core.rs index 8ebaf842..62270b4d 100644 --- a/plugins/updater/src/updater/core.rs +++ b/plugins/updater/src/updater/core.rs @@ -728,6 +728,12 @@ fn copy_files_and_run( // extract the msi extractor.extract_into(&tmp_dir)?; + let system_root = std::env::var("SYSTEMROOT"); + let powershell_path = system_root.as_ref().map_or_else( + |_| "powershell.exe".to_string(), + |p| format!("{p}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe"), + ); + let paths = read_dir(&tmp_dir)?; for path in paths { @@ -735,11 +741,34 @@ fn copy_files_and_run( // we support 2 type of files exe & msi for now // If it's an `exe` we expect an installer not a runtime. if found_path.extension() == Some(OsStr::new("exe")) { + // we need to wrap the installer path in quotes for Start-Process + let mut installer_arg = std::ffi::OsString::new(); + installer_arg.push("\""); + installer_arg.push(&found_path); + installer_arg.push("\""); + // Run the EXE - Command::new(found_path) - .args(config.tauri.bundle.updater.windows.install_mode.nsis_args()) - .args(&updater_config.installer_args) - .spawn() + Command::new(powershell_path) + .args(["-NoProfile", "-WindowStyle", "Hidden"]) + .args(["Start-Process"]) + .arg(found_path) + .arg("-ArgumentList") + .arg( + [ + config.tauri.updater.windows.install_mode.nsis_args(), + config + .tauri + .updater + .windows + .installer_args + .iter() + .map(AsRef::as_ref) + .collect::>() + .as_slice(), + ] + .concat() + .join(", "), + ) .expect("installer failed to start"); exit(0); @@ -808,13 +837,8 @@ fn copy_files_and_run( msiexec_args.extend(updater_config.installer_args.clone()); // run the installer and relaunch the application - let system_root = std::env::var("SYSTEMROOT"); - let powershell_path = system_root.as_ref().map_or_else( - |_| "powershell.exe".to_string(), - |p| format!("{p}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe"), - ); let powershell_install_res = Command::new(powershell_path) - .args(["-NoProfile", "-windowstyle", "hidden"]) + .args(["-NoProfile", "-WindowStyle", "Hidden"]) .args([ "Start-Process", "-Wait",