[wip] use windows crate to run as admin

This commit is contained in:
ddidderr 2025-03-20 20:57:32 +01:00
parent 393f8b5fab
commit 78f7ff2405
Signed by: ddidderr
GPG Key ID: 3841F1C27E6F0E14
4 changed files with 117 additions and 16 deletions

104
Cargo.lock generated
View File

@ -2436,6 +2436,7 @@ dependencies = [
"tauri-plugin-shell", "tauri-plugin-shell",
"tauri-plugin-store", "tauri-plugin-store",
"tokio", "tokio",
"windows 0.61.1",
] ]
[[package]] [[package]]
@ -4768,7 +4769,7 @@ dependencies = [
"tao-macros", "tao-macros",
"unicode-segmentation", "unicode-segmentation",
"url", "url",
"windows", "windows 0.60.0",
"windows-core 0.60.1", "windows-core 0.60.1",
"windows-version", "windows-version",
"x11-dl", "x11-dl",
@ -4844,7 +4845,7 @@ dependencies = [
"webkit2gtk", "webkit2gtk",
"webview2-com", "webview2-com",
"window-vibrancy", "window-vibrancy",
"windows", "windows 0.60.0",
] ]
[[package]] [[package]]
@ -5043,7 +5044,7 @@ dependencies = [
"tauri-utils", "tauri-utils",
"thiserror 2.0.12", "thiserror 2.0.12",
"url", "url",
"windows", "windows 0.60.0",
] ]
[[package]] [[package]]
@ -5069,7 +5070,7 @@ dependencies = [
"url", "url",
"webkit2gtk", "webkit2gtk",
"webview2-com", "webview2-com",
"windows", "windows 0.60.0",
"wry", "wry",
] ]
@ -5902,9 +5903,9 @@ checksum = "b0d606f600e5272b514dbb66539dd068211cc20155be8d3958201b4b5bd79ed3"
dependencies = [ dependencies = [
"webview2-com-macros", "webview2-com-macros",
"webview2-com-sys", "webview2-com-sys",
"windows", "windows 0.60.0",
"windows-core 0.60.1", "windows-core 0.60.1",
"windows-implement", "windows-implement 0.59.0",
"windows-interface", "windows-interface",
] ]
@ -5926,7 +5927,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bfb27fccd3c27f68e9a6af1bcf48c2d82534b8675b83608a4d81446d095a17ac" checksum = "bfb27fccd3c27f68e9a6af1bcf48c2d82534b8675b83608a4d81446d095a17ac"
dependencies = [ dependencies = [
"thiserror 2.0.12", "thiserror 2.0.12",
"windows", "windows 0.60.0",
"windows-core 0.60.1", "windows-core 0.60.1",
] ]
@ -5994,11 +5995,24 @@ version = "0.60.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ddf874e74c7a99773e62b1c671427abf01a425e77c3d3fb9fb1e4883ea934529" checksum = "ddf874e74c7a99773e62b1c671427abf01a425e77c3d3fb9fb1e4883ea934529"
dependencies = [ dependencies = [
"windows-collections", "windows-collections 0.1.1",
"windows-core 0.60.1", "windows-core 0.60.1",
"windows-future", "windows-future 0.1.1",
"windows-link", "windows-link",
"windows-numerics", "windows-numerics 0.1.1",
]
[[package]]
name = "windows"
version = "0.61.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c5ee8f3d025738cb02bad7868bbb5f8a6327501e870bf51f1b455b0a2454a419"
dependencies = [
"windows-collections 0.2.0",
"windows-core 0.61.0",
"windows-future 0.2.0",
"windows-link",
"windows-numerics 0.2.0",
] ]
[[package]] [[package]]
@ -6010,6 +6024,15 @@ dependencies = [
"windows-core 0.60.1", "windows-core 0.60.1",
] ]
[[package]]
name = "windows-collections"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8"
dependencies = [
"windows-core 0.61.0",
]
[[package]] [[package]]
name = "windows-core" name = "windows-core"
version = "0.52.0" version = "0.52.0"
@ -6025,11 +6048,24 @@ version = "0.60.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca21a92a9cae9bf4ccae5cf8368dce0837100ddf6e6d57936749e85f152f6247" checksum = "ca21a92a9cae9bf4ccae5cf8368dce0837100ddf6e6d57936749e85f152f6247"
dependencies = [ dependencies = [
"windows-implement", "windows-implement 0.59.0",
"windows-interface", "windows-interface",
"windows-link", "windows-link",
"windows-result", "windows-result",
"windows-strings", "windows-strings 0.3.1",
]
[[package]]
name = "windows-core"
version = "0.61.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980"
dependencies = [
"windows-implement 0.60.0",
"windows-interface",
"windows-link",
"windows-result",
"windows-strings 0.4.0",
] ]
[[package]] [[package]]
@ -6042,6 +6078,16 @@ dependencies = [
"windows-link", "windows-link",
] ]
[[package]]
name = "windows-future"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a1d6bbefcb7b60acd19828e1bc965da6fcf18a7e39490c5f8be71e54a19ba32"
dependencies = [
"windows-core 0.61.0",
"windows-link",
]
[[package]] [[package]]
name = "windows-implement" name = "windows-implement"
version = "0.59.0" version = "0.59.0"
@ -6053,6 +6099,17 @@ dependencies = [
"syn 2.0.100", "syn 2.0.100",
] ]
[[package]]
name = "windows-implement"
version = "0.60.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.100",
]
[[package]] [[package]]
name = "windows-interface" name = "windows-interface"
version = "0.59.1" version = "0.59.1"
@ -6080,6 +6137,16 @@ dependencies = [
"windows-link", "windows-link",
] ]
[[package]]
name = "windows-numerics"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1"
dependencies = [
"windows-core 0.61.0",
"windows-link",
]
[[package]] [[package]]
name = "windows-registry" name = "windows-registry"
version = "0.4.0" version = "0.4.0"
@ -6087,7 +6154,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3"
dependencies = [ dependencies = [
"windows-result", "windows-result",
"windows-strings", "windows-strings 0.3.1",
"windows-targets 0.53.0", "windows-targets 0.53.0",
] ]
@ -6109,6 +6176,15 @@ dependencies = [
"windows-link", "windows-link",
] ]
[[package]]
name = "windows-strings"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97"
dependencies = [
"windows-link",
]
[[package]] [[package]]
name = "windows-sys" name = "windows-sys"
version = "0.45.0" version = "0.45.0"
@ -6483,7 +6559,7 @@ dependencies = [
"webkit2gtk", "webkit2gtk",
"webkit2gtk-sys", "webkit2gtk-sys",
"webview2-com", "webview2-com",
"windows", "windows 0.60.0",
"windows-core 0.60.1", "windows-core 0.60.1",
"windows-version", "windows-version",
"x11-dl", "x11-dl",

View File

@ -39,6 +39,7 @@ tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter"] } tracing-subscriber = { version = "0.3", features = ["env-filter"] }
uuid = { version = "1", features = ["v7"] } uuid = { version = "1", features = ["v7"] }
walkdir = "2" walkdir = "2"
windows = { version = "0.61" }
[profile.release] [profile.release]
debug = true debug = true

View File

@ -34,3 +34,6 @@ tauri-plugin-shell = { workspace = true }
tauri-plugin-dialog = { workspace = true } tauri-plugin-dialog = { workspace = true }
tauri-plugin-store = { workspace = true } tauri-plugin-store = { workspace = true }
tokio = { workspace = true } tokio = { workspace = true }
[target.'cfg(windows)'.dependencies]
windows = { workspace = true }

View File

@ -1,3 +1,5 @@
#[cfg(target_os = "windows")]
use std::os::windows::ffi::OsStrExt;
use std::{ use std::{
collections::HashSet, collections::HashSet,
fs::File, fs::File,
@ -54,12 +56,31 @@ fn install_game(id: String, state: tauri::State<LanSpreadState>) -> bool {
true true
} }
#[cfg(target_os = "windows")]
fn run_as_admin(file: &str, params: &str, dir: &str) -> bool {
todo!();
let file_wide: Vec<u16> = OsStr::new(file).encode_wide().chain(Some(0)).collect();
let params_wide: Vec<u16> = OsStr::new(params).encode_wide().chain(Some(0)).collect();
let dir_wide: Vec<u16> = OsStr::new(dir).encode_wide().chain(Some(0)).collect();
let result = unsafe {
ShellExecuteW(
HWND(0),
Some("runas"),
&file_wide,
Some(&params_wide),
Some(&dir_wide),
windows::Win32::UI::WindowsAndMessaging::SW_SHOWNORMAL,
)
};
result.0 > 32 // Success if greater than 32
}
#[tauri::command] #[tauri::command]
fn run_game(id: String, state: tauri::State<LanSpreadState>) { fn run_game(id: String, state: tauri::State<LanSpreadState>) {
const FIRST_START_DONE_FILE: &str = ".softlan_first_start_done"; const FIRST_START_DONE_FILE: &str = ".softlan_first_start_done";
log::error!("run_game {id}");
let games_folder = let games_folder =
tauri::async_runtime::block_on(async { state.inner().games_folder.lock().await.clone() }); tauri::async_runtime::block_on(async { state.inner().games_folder.lock().await.clone() });