is_root/
lib.rs

1#![deny(warnings, clippy::all)]
2#![warn(missing_docs)]
3//! A simple library to detect whether you are root/admin or not
4//! ## Usage
5//! ```no_run
6//! use is_root::is_root;
7//!
8//! if is_root() {
9//!     println!("Doing something dangerous")
10//! } else {
11//!     eprintln!("Run me as root")
12//! }
13//! ```
14
15/// Returns `true` if user is root; `false` otherwise
16/// ```no_run
17/// use is_root::is_root;
18///
19/// if is_root() {
20///     println!("Doing something dangerous")
21/// } else {
22///     eprintln!("Run me as root")
23/// }
24/// ```
25#[must_use]
26pub fn is_root() -> bool {
27    is_root_internal()
28}
29
30#[cfg(windows)]
31#[must_use]
32fn is_root_internal() -> bool {
33    use std::mem;
34    use winapi::{
35        ctypes::c_void,
36        shared::minwindef::{DWORD, TRUE},
37        um::{
38            handleapi::{CloseHandle, INVALID_HANDLE_VALUE},
39            processthreadsapi::{GetCurrentProcess, OpenProcessToken},
40            securitybaseapi::GetTokenInformation,
41            winnt::{TokenElevation, TOKEN_ELEVATION, TOKEN_QUERY},
42        },
43    };
44    let mut token = INVALID_HANDLE_VALUE;
45    let mut elevated = false;
46    unsafe {
47        if OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &mut token) == TRUE {
48            let mut elevation: TOKEN_ELEVATION = mem::zeroed();
49            let mut size = mem::size_of::<TOKEN_ELEVATION>() as DWORD;
50            if GetTokenInformation(
51                token,
52                TokenElevation,
53                &mut elevation as *mut TOKEN_ELEVATION as *mut c_void,
54                size,
55                &mut size,
56            ) == TRUE
57            {
58                elevated = elevation.TokenIsElevated != 0;
59            }
60        }
61        if token != INVALID_HANDLE_VALUE {
62            CloseHandle(token);
63        }
64    }
65    elevated
66}
67#[cfg(unix)]
68#[must_use]
69fn is_root_internal() -> bool {
70    users::get_current_uid() == 0
71}