use windows::core::{PCWSTR, w};
use crate::{
error::ElevateError,
security::{Token, TokenCommand},
strategy::{ElevationStrategy, TrustedInstallerStrategy},
};
const TRUSTED_INSTALLER_SID: PCWSTR =
w!("S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464");
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ElevationStatus {
Elevated,
RequiresElevation,
}
pub fn status() -> Result<ElevationStatus, ElevateError> {
let token = Token::current()?;
if token.has_sid(TRUSTED_INSTALLER_SID)? {
Ok(ElevationStatus::Elevated)
} else {
Ok(ElevationStatus::RequiresElevation)
}
}
pub fn elevated_command() -> Result<TokenCommand<'static>, ElevateError> {
let strategy = TrustedInstallerStrategy::default();
let token = Box::leak(Box::new(strategy.acquire_primary_token()?));
Ok(TokenCommand::new(token))
}
pub fn relaunch() -> Result<(), ElevateError> {
elevated_command()?.current_exe()?.spawn()
}