nu_command/experimental/
is_admin.rs1use nu_engine::command_prelude::*;
2
3#[derive(Clone)]
4pub struct IsAdmin;
5
6impl Command for IsAdmin {
7 fn name(&self) -> &str {
8 "is-admin"
9 }
10
11 fn description(&self) -> &str {
12 "Check if nushell is running with administrator or root privileges."
13 }
14
15 fn signature(&self) -> nu_protocol::Signature {
16 Signature::build("is-admin")
17 .category(Category::Core)
18 .input_output_types(vec![(Type::Nothing, Type::Bool)])
19 .allow_variants_without_examples(true)
20 }
21
22 fn search_terms(&self) -> Vec<&str> {
23 vec!["root", "administrator", "superuser", "supervisor"]
24 }
25
26 fn run(
27 &self,
28 _engine_state: &EngineState,
29 _stack: &mut Stack,
30 call: &Call,
31 _input: PipelineData,
32 ) -> Result<PipelineData, ShellError> {
33 Ok(Value::bool(is_root(), call.head).into_pipeline_data())
34 }
35
36 fn examples(&self) -> Vec<Example> {
37 vec![
38 Example {
39 description: "Return 'iamroot' if nushell is running with admin/root privileges, and 'iamnotroot' if not.",
40 example: r#"if (is-admin) { "iamroot" } else { "iamnotroot" }"#,
41 result: Some(Value::test_string("iamnotroot")),
42 },
43 ]
44 }
45}
46
47fn is_root() -> bool {
49 is_root_impl()
50}
51
52#[cfg(unix)]
53fn is_root_impl() -> bool {
54 nix::unistd::Uid::current().is_root()
55}
56
57#[cfg(windows)]
58fn is_root_impl() -> bool {
59 use windows::Win32::{
60 Foundation::{CloseHandle, HANDLE},
61 Security::{GetTokenInformation, TokenElevation, TOKEN_ELEVATION, TOKEN_QUERY},
62 System::Threading::{GetCurrentProcess, OpenProcessToken},
63 };
64
65 let mut elevated = false;
66
67 unsafe {
72 let mut handle = HANDLE::default();
73
74 if OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &mut handle).is_ok() {
76 let mut elevation = TOKEN_ELEVATION::default();
77 let mut size = std::mem::size_of::<TOKEN_ELEVATION>() as u32;
78
79 if GetTokenInformation(
83 handle,
84 TokenElevation,
85 Some(&mut elevation as *mut TOKEN_ELEVATION as *mut _),
86 size,
87 &mut size,
88 )
89 .is_ok()
90 {
91 elevated = elevation.TokenIsElevated != 0;
95 }
96 }
97
98 if !handle.is_invalid() {
99 let _ = CloseHandle(handle);
101 }
102 }
103
104 elevated
105}
106
107#[cfg(target_arch = "wasm32")]
108fn is_root_impl() -> bool {
109 false
111}