mod safe_windows_bindings;
use crate::safe_windows_bindings::high_level::{
add_admin_privileges_to_token, create_process_with_token, get_current_user_token,
get_process_pid, get_process_token,
};
pub enum Elevation {
User,
Admin,
LocalSystem,
}
pub enum Desktop {
Default,
Secure,
}
pub fn run(
path: &str,
args: &str,
directory: &str,
desktop: Desktop,
elevation: Elevation,
) -> Result<(), String> {
let application_name = path;
let command_line = format!("{path} {args}");
let current_directory = directory;
let desktop = match desktop {
Desktop::Default => "",
Desktop::Secure => "WinSta0\\Winlogon",
};
let token = match elevation {
Elevation::User => get_current_user_token()?,
Elevation::Admin => {
let mut current_user_token = get_current_user_token()?;
current_user_token = add_admin_privileges_to_token(current_user_token)?;
current_user_token
}
Elevation::LocalSystem => {
let process_pid = get_process_pid("winlogon")?;
get_process_token(process_pid)?
}
};
create_process_with_token(
token,
application_name,
&command_line,
current_directory,
desktop,
)
}