framework_system/
is_elevated.rs1use anyhow::Result;
4
5#[cfg(unix)]
11pub fn is_elevated() -> Result<bool> {
12 Ok(unsafe { libc::geteuid() } == 0)
13}
14
15#[cfg(windows)]
17pub fn is_elevated() -> Result<bool> {
18 use windows_sys::Win32::Foundation::{CloseHandle, HANDLE};
19 use windows_sys::Win32::Security::{
20 GetTokenInformation, TOKEN_ELEVATION, TOKEN_QUERY, TokenElevation,
21 };
22 use windows_sys::Win32::System::Threading::{GetCurrentProcess, OpenProcessToken};
23
24 unsafe {
25 let mut token: HANDLE = std::ptr::null_mut();
26 if OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &mut token) == 0 {
27 return Err(std::io::Error::last_os_error().into());
28 }
29
30 let mut elevation = TOKEN_ELEVATION { TokenIsElevated: 0 };
31 let mut return_length = 0u32;
32 let result = GetTokenInformation(
33 token,
34 TokenElevation,
35 &mut elevation as *mut _ as *mut _,
36 size_of::<TOKEN_ELEVATION>() as u32,
37 &mut return_length,
38 );
39 let last_error = if result == 0 {
40 Some(std::io::Error::last_os_error())
41 } else {
42 None
43 };
44 CloseHandle(token);
46
47 if let Some(error) = last_error {
48 return Err(error.into());
49 }
50
51 Ok(elevation.TokenIsElevated != 0)
52 }
53}
54
55#[cfg(not(any(unix, windows)))]
57pub fn is_elevated() -> Result<bool> {
58 Ok(false)
59}