From 4373b601937f738ac425c271145ba2cf58465bcc Mon Sep 17 00:00:00 2001 From: DragonSlayer_14 Date: Thu, 21 Aug 2025 00:07:22 +0200 Subject: [PATCH] =?UTF-8?q?Feat:=20Implementiert=20Funktionen=20zum=20?= =?UTF-8?q?=C3=9Cberpr=C3=BCfen=20und=20Neustarten=20mit=20Root-/Admin-Rec?= =?UTF-8?q?hten?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 1 + src/main.rs | 1 + src/sudo.rs | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 src/sudo.rs diff --git a/Cargo.toml b/Cargo.toml index 6d65e2c..5eb0135 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,3 +8,4 @@ authors = ['DragonSlayer_14'] time = { version="0.3.41", features = ["formatting", "macros", "local-offset"] } serde = { version="1.0.219", features = ["derive"] } confy = "1.0.0" +libc = "1.0.0-alpha.1" diff --git a/src/main.rs b/src/main.rs index 83faca6..511cfa5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,6 +15,7 @@ mod network; mod config; mod program; mod filesystem; +mod sudo; fn main() { log("main", "========== PROGRAM START ==========", LogLevel::Info); diff --git a/src/sudo.rs b/src/sudo.rs new file mode 100644 index 0000000..1aa2489 --- /dev/null +++ b/src/sudo.rs @@ -0,0 +1,59 @@ +/// Prüft, ob das Programm mit Root-/Administrator-Rechten ausgeführt wird. +/// +/// # Returns +/// +/// * `true` - Das Programm läuft mit erhöhten Rechten +/// * `false` - Das Programm läuft mit normalen Benutzerrechten +pub fn is_run_as_root() -> bool { + #[cfg(any(target_os = "windows"))] + { + // Windows: Prüfen ob Admin-Rechte vorhanden + use std::process::Command; + Command::new("net") + .args(&["session"]) + .output() + .map(|output| output.status.success()) + .unwrap_or(false) + } + + #[cfg(not(any(target_os = "windows")))] + { + // Linux/Unix: Prüfen ob Root oder sudo + unsafe { libc::geteuid() == 0 } + } +} +/// Startet das Programm mit Root-/Administrator-Rechten neu. +/// +/// Diese Funktion versucht das Programm mit erhöhten Rechten neu zu starten. +/// +/// # Details +/// +/// - Unter Linux wird das Programm mit `sudo` neu gestartet +/// - Unter Windows wird der UAC-Dialog zur Rechteanfrage angezeigt +pub fn run_as_root() { + use std::process::Command; + + #[cfg(any(target_os = "windows"))] + { + use std::os::windows::process::CommandExt; + Command::new("powershell") + .args(&[ + "Start-Process", + &std::env::current_exe().unwrap().to_string_lossy(), + "-Verb", + "RunAs" + ]) + .spawn() + .expect("Fehler beim Neustarten mit Admin-Rechten"); + std::process::exit(0); + } + + #[cfg(not(any(target_os = "windows")))] + { + Command::new("sudo") + .arg(&std::env::current_exe().unwrap()) + .spawn() + .expect("Fehler beim Neustarten mit Root-Rechten"); + std::process::exit(0); + } +} \ No newline at end of file