use std::{mem, ptr};
use windows_sys::Win32::{
Foundation::{CloseHandle, HANDLE},
Security::{GetTokenInformation, TOKEN_ELEVATION, TOKEN_QUERY, TokenElevation},
System::Threading::{GetCurrentProcess, OpenProcessToken},
};
pub fn is_elevated() -> bool {
unsafe {
let mut token: HANDLE = ptr::null_mut();
if OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &mut token) == 0 {
return false;
}
let mut elevation = TOKEN_ELEVATION { TokenIsElevated: 0 };
let mut returned = 0u32;
let ok = GetTokenInformation(
token,
TokenElevation,
(&raw mut elevation).cast(),
mem::size_of::<TOKEN_ELEVATION>() as u32,
&mut returned,
);
CloseHandle(token);
ok != 0 && elevation.TokenIsElevated != 0
}
}