fix(core): fix nsis updater unable to launch installers requiring elevation, closes #7184 (#7185)

* Launch NSIS updaters requiring elevation from non-elevated process

* Add changes file

* remove detached process, use powershell

* Update updater-admin-launch-fix.md

---------

Co-authored-by: Amr Bashir <amr.bashir2015@gmail.com>
This commit is contained in:
Raphii 2023-06-19 17:11:16 +02:00 committed by GitHub
parent 8c0166f459
commit 1a3dcdb830
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 39 additions and 9 deletions

View File

@ -0,0 +1,5 @@
---
'tauri': 'patch:bug'
---
On Windows, fix NSIS installers requiring administrator rights failing to be launched by updater.

View File

@ -709,15 +709,45 @@ fn copy_files_and_run<R: Read + Seek>(
let paths = read_dir(&tmp_dir)?; let paths = read_dir(&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"),
);
for path in paths { for path in paths {
let found_path = path?.path(); let found_path = path?.path();
// we support 2 type of files exe & msi for now // we support 2 type of files exe & msi for now
// If it's an `exe` we expect an installer not a runtime. // If it's an `exe` we expect an installer not a runtime.
if found_path.extension() == Some(OsStr::new("exe")) { 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 // Run the EXE
Command::new(found_path) Command::new(powershell_path)
.args(config.tauri.updater.windows.install_mode.nsis_args()) .args(["-NoProfile", "-WindowStyle", "Hidden"])
.args(&config.tauri.updater.windows.installer_args) .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::<Vec<_>>()
.as_slice(),
]
.concat()
.join(", "),
)
.spawn() .spawn()
.expect("installer failed to start"); .expect("installer failed to start");
@ -785,13 +815,8 @@ fn copy_files_and_run<R: Read + Seek>(
msiexec_args.extend(config.tauri.updater.windows.installer_args.clone()); msiexec_args.extend(config.tauri.updater.windows.installer_args.clone());
// run the installer and relaunch the application // 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) let powershell_install_res = Command::new(powershell_path)
.args(["-NoProfile", "-windowstyle", "hidden"]) .args(["-NoProfile", "-WindowStyle", "Hidden"])
.args([ .args([
"Start-Process", "Start-Process",
"-Wait", "-Wait",