Skip to main content

cli_or_gui/
is_elevated.rs

1#[cfg(target_os = "windows")]
2pub fn is_elevated() -> bool {
3    use windows::Win32::{
4        Foundation::{CloseHandle, HANDLE},
5        Security::{
6            GetTokenInformation, TOKEN_ACCESS_MASK, TOKEN_ELEVATION, TOKEN_QUERY, TokenElevation,
7        },
8        System::Threading::{GetCurrentProcess, OpenProcessToken},
9    };
10
11    let mut h_token: HANDLE = HANDLE(0 as _);
12    unsafe {
13        if OpenProcessToken(
14            GetCurrentProcess(),
15            TOKEN_ACCESS_MASK(TOKEN_QUERY.0),
16            &raw mut h_token,
17        )
18        .is_err()
19        {
20            return false;
21        }
22
23        let mut token_elevation: TOKEN_ELEVATION = core::mem::zeroed();
24        let mut return_length = 0;
25
26        let info_result = GetTokenInformation(
27            h_token,
28            TokenElevation,
29            Some((&raw mut token_elevation).cast()),
30            core::mem::size_of::<TOKEN_ELEVATION>() as u32,
31            &raw mut return_length,
32        );
33
34        // Safely close the token handle when done to prevent handle leaks
35        let _ = CloseHandle(h_token);
36
37        if info_result.is_ok() {
38            token_elevation.TokenIsElevated != 0
39        } else {
40            false
41        }
42    }
43}
44
45#[cfg(not(target_os = "windows"))]
46#[must_use]
47pub fn is_elevated() -> bool {
48    // Under Unix/macOS, "elevated" means running as root (effective UID 0)
49    unsafe { libc::geteuid() == 0 }
50}