Skip to content

Commit

Permalink
fix(updater): fix nsis updater unable to launch installers requiring …
Browse files Browse the repository at this point in the history
…elevation (#444)

Co-authored-by: Lucas Nogueira <[email protected]>
  • Loading branch information
amrbashir and lucasfernog authored Jun 19, 2023
1 parent a79d6d9 commit 56d455d
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 9 deletions.
5 changes: 5 additions & 0 deletions .changes/updater-nsis-admin.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"updater": "patch"
---

On Windows, fix NSIS installers requiring administrator rights failing to be launched by updater.
40 changes: 31 additions & 9 deletions plugins/updater/src/updater/core.rs
Original file line number Diff line number Diff line change
Expand Up @@ -728,17 +728,44 @@ fn copy_files_and_run<R: Read + Seek>(
// 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 {
let found_path = path?.path();
// 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)
Command::new(powershell_path)
.args(["-NoProfile", "-WindowStyle", "Hidden"])
.args(["Start-Process"])
.arg(found_path)
.arg("-ArgumentList")
.arg(
[
config.tauri.bundle.updater.windows.install_mode.nsis_args(),
updater_config
.installer_args
.iter()
.map(AsRef::as_ref)
.collect::<Vec<_>>()
.as_slice(),
]
.concat()
.join(", "),
)
.spawn()
.expect("installer failed to start");

Expand Down Expand Up @@ -808,13 +835,8 @@ fn copy_files_and_run<R: Read + Seek>(
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",
Expand Down

0 comments on commit 56d455d

Please sign in to comment.