cli_or_gui/
is_elevated.rs1#[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 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 unsafe { libc::geteuid() == 0 }
50}