use windows::core::{PCWSTR, w};
use crate::{
error::ElevateError,
security::{ExecutionContext, InteractiveDesktop, 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, ElevateError> {
elevated_command_on(InteractiveDesktop::Default)
}
pub fn elevated_command_on(desktop: InteractiveDesktop) -> Result<TokenCommand, ElevateError> {
let strategy = TrustedInstallerStrategy::new(
std::time::Duration::from_secs(30),
ExecutionContext::Interactive(desktop.clone()),
);
let token = strategy.acquire_primary_token()?;
Ok(TokenCommand::new(token, Some(desktop)))
}
pub fn headless_command() -> Result<TokenCommand, ElevateError> {
let strategy = TrustedInstallerStrategy::new(
std::time::Duration::from_secs(30),
ExecutionContext::Headless,
);
let token = strategy.acquire_primary_token()?;
Ok(TokenCommand::new(token, None))
}
pub fn relaunch() -> Result<(), ElevateError> {
elevated_command()?.current_exe()?.spawn()
}