fix(windows): run printer repair directly before UAC fallback
Some checks failed
Desktop Release / Bootstrap updater signing key (push) Has been cancelled
Desktop Release / Windows x64 NSIS (push) Has been cancelled
Desktop Release / Linux x64 DEB + AppImage (push) Has been cancelled
Desktop Release / Publish public desktop release (push) Has been cancelled
Some checks failed
Desktop Release / Bootstrap updater signing key (push) Has been cancelled
Desktop Release / Windows x64 NSIS (push) Has been cancelled
Desktop Release / Linux x64 DEB + AppImage (push) Has been cancelled
Desktop Release / Publish public desktop release (push) Has been cancelled
This commit is contained in:
parent
68052a11ef
commit
2f6c3889b0
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@fieldlens/print",
|
"name": "@fieldlens/print",
|
||||||
"version": "0.1.26",
|
"version": "0.1.27",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "fieldlens-print"
|
name = "fieldlens-print"
|
||||||
version = "0.1.26"
|
version = "0.1.27"
|
||||||
description = "FieldLens print-stream barcode capture companion"
|
description = "FieldLens print-stream barcode capture companion"
|
||||||
authors = ["Arrowstack"]
|
authors = ["Arrowstack"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|||||||
@ -407,21 +407,51 @@ if ($null -ne $targetConfig -and $targetConfig.PrintTicketXML) {{
|
|||||||
|
|
||||||
fs::write(&script_path, script).context("write Windows printer setup script")?;
|
fs::write(&script_path, script).context("write Windows printer setup script")?;
|
||||||
|
|
||||||
|
// First run the script directly. This is the reliable path when FieldLens
|
||||||
|
// itself was started as administrator and avoids a second hidden RunAs
|
||||||
|
// process plus fragile nested PowerShell argument quoting.
|
||||||
|
let direct = hidden_windows_command("powershell.exe")
|
||||||
|
.args([
|
||||||
|
"-NoProfile",
|
||||||
|
"-NonInteractive",
|
||||||
|
"-ExecutionPolicy",
|
||||||
|
"Bypass",
|
||||||
|
"-File",
|
||||||
|
])
|
||||||
|
.arg(&script_path)
|
||||||
|
.args(["-TargetPrinter", target_printer])
|
||||||
|
.output()
|
||||||
|
.context("run Windows printer setup")?;
|
||||||
|
|
||||||
|
if direct.status.success() {
|
||||||
|
let _ = fs::remove_file(&script_path);
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the app is not elevated, retry through UAC. Keep this as a fallback
|
||||||
|
// rather than the primary path so admin-launched builds never depend on a
|
||||||
|
// nested hidden RunAs process.
|
||||||
let path = ps_quote(&script_path.to_string_lossy());
|
let path = ps_quote(&script_path.to_string_lossy());
|
||||||
let elevated = format!(
|
let elevated = format!(
|
||||||
"$p = Start-Process -FilePath powershell.exe -Verb RunAs -WindowStyle Hidden -Wait -PassThru -ArgumentList @('-NoProfile','-NonInteractive','-WindowStyle','Hidden','-ExecutionPolicy','Bypass','-File','{path}','-TargetPrinter','{target}'); exit $p.ExitCode"
|
"$p = Start-Process -FilePath powershell.exe -Verb RunAs -Wait -PassThru -ArgumentList @('-NoProfile','-NonInteractive','-ExecutionPolicy','Bypass','-File','{path}','-TargetPrinter','{target}'); exit $p.ExitCode"
|
||||||
);
|
);
|
||||||
|
|
||||||
let status = hidden_windows_command("powershell.exe")
|
let elevated_status = hidden_windows_command("powershell.exe")
|
||||||
.args(["-NoProfile", "-NonInteractive", "-WindowStyle", "Hidden", "-Command", &elevated])
|
.args(["-NoProfile", "-NonInteractive", "-Command", &elevated])
|
||||||
.status()
|
.status()
|
||||||
.context("launch elevated Windows printer setup")?;
|
.context("launch elevated Windows printer setup")?;
|
||||||
|
|
||||||
let _ = fs::remove_file(&script_path);
|
let _ = fs::remove_file(&script_path);
|
||||||
|
|
||||||
if !status.success() {
|
if !elevated_status.success() {
|
||||||
|
let stderr = String::from_utf8_lossy(&direct.stderr).trim().to_string();
|
||||||
return Err(anyhow!(
|
return Err(anyhow!(
|
||||||
"printer setup was cancelled or failed; Windows administrator approval may be required"
|
"Windows printer setup failed{}",
|
||||||
|
if stderr.is_empty() {
|
||||||
|
"; administrator approval may be required".to_string()
|
||||||
|
} else {
|
||||||
|
format!(": {stderr}")
|
||||||
|
}
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -450,17 +480,42 @@ if (Get-PrinterPort -Name $portName -ErrorAction SilentlyContinue) {{
|
|||||||
uuid::Uuid::new_v4()
|
uuid::Uuid::new_v4()
|
||||||
));
|
));
|
||||||
fs::write(&script_path, script)?;
|
fs::write(&script_path, script)?;
|
||||||
|
let direct = hidden_windows_command("powershell.exe")
|
||||||
|
.args([
|
||||||
|
"-NoProfile",
|
||||||
|
"-NonInteractive",
|
||||||
|
"-ExecutionPolicy",
|
||||||
|
"Bypass",
|
||||||
|
"-File",
|
||||||
|
])
|
||||||
|
.arg(&script_path)
|
||||||
|
.output()
|
||||||
|
.context("run Windows printer removal")?;
|
||||||
|
|
||||||
|
if direct.status.success() {
|
||||||
|
let _ = fs::remove_file(&script_path);
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
let path = ps_quote(&script_path.to_string_lossy());
|
let path = ps_quote(&script_path.to_string_lossy());
|
||||||
let elevated = format!(
|
let elevated = format!(
|
||||||
"$p = Start-Process -FilePath powershell.exe -Verb RunAs -WindowStyle Hidden -Wait -PassThru -ArgumentList @('-NoProfile','-NonInteractive','-WindowStyle','Hidden','-ExecutionPolicy','Bypass','-File','{path}'); exit $p.ExitCode"
|
"$p = Start-Process -FilePath powershell.exe -Verb RunAs -Wait -PassThru -ArgumentList @('-NoProfile','-NonInteractive','-ExecutionPolicy','Bypass','-File','{path}'); exit $p.ExitCode"
|
||||||
);
|
);
|
||||||
let status = hidden_windows_command("powershell.exe")
|
let status = hidden_windows_command("powershell.exe")
|
||||||
.args(["-NoProfile", "-NonInteractive", "-WindowStyle", "Hidden", "-Command", &elevated])
|
.args(["-NoProfile", "-NonInteractive", "-Command", &elevated])
|
||||||
.status()?;
|
.status()?;
|
||||||
let _ = fs::remove_file(&script_path);
|
let _ = fs::remove_file(&script_path);
|
||||||
|
|
||||||
if !status.success() {
|
if !status.success() {
|
||||||
return Err(anyhow!("removing FieldLens Print was cancelled or failed"));
|
let stderr = String::from_utf8_lossy(&direct.stderr).trim();
|
||||||
|
return Err(anyhow!(
|
||||||
|
"removing FieldLens Print failed{}",
|
||||||
|
if stderr.is_empty() {
|
||||||
|
String::new()
|
||||||
|
} else {
|
||||||
|
format!(": {stderr}")
|
||||||
|
}
|
||||||
|
));
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://schema.tauri.app/config/2",
|
"$schema": "https://schema.tauri.app/config/2",
|
||||||
"productName": "FieldLens Print",
|
"productName": "FieldLens Print",
|
||||||
"version": "0.1.26",
|
"version": "0.1.27",
|
||||||
"identifier": "dev.arrowstack.fieldlens.print",
|
"identifier": "dev.arrowstack.fieldlens.print",
|
||||||
"build": {
|
"build": {
|
||||||
"beforeDevCommand": "npm run dev",
|
"beforeDevCommand": "npm run dev",
|
||||||
|
|||||||
@ -142,7 +142,7 @@ let config: AppConfig
|
|||||||
let jobs: Job[] = []
|
let jobs: Job[] = []
|
||||||
let status: Status = { running: false, mode: 'raw-proxy', pending: 0, jobs: 0 }
|
let status: Status = { running: false, mode: 'raw-proxy', pending: 0, jobs: 0 }
|
||||||
let loginTimer: number | undefined
|
let loginTimer: number | undefined
|
||||||
let currentVersion = '0.1.25'
|
let currentVersion = '0.1.27'
|
||||||
let bundleType: BundleType | null = null
|
let bundleType: BundleType | null = null
|
||||||
let availableUpdate: Update | null = null
|
let availableUpdate: Update | null = null
|
||||||
let availableManualUpdate: ManualUpdate | null = null
|
let availableManualUpdate: ManualUpdate | null = null
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user