#[derive(Clone, Copy, Debug)]
pub struct Alias {
pub rid: u32,
pub name: &'static str,
pub edge: &'static str,
}
pub const ALIASES: &[Alias] = &[
Alias { rid: 544, name: "Administrators", edge: "AdminTo" },
Alias { rid: 555, name: "Remote Desktop Users", edge: "CanRDP" },
Alias { rid: 562, name: "Distributed COM Users", edge: "ExecuteDCOM" },
Alias { rid: 580, name: "Remote Management Users", edge: "CanPSRemote" },
];
pub struct AliasFinding {
pub group_sid: String,
pub group_name: &'static str,
pub members: Vec<String>,
pub collected: bool,
pub failure: Option<String>,
}
pub struct HostFindings {
pub computer_sid: String,
pub host: String,
pub is_dc: bool,
pub aliases: Vec<AliasFinding>,
pub errors: Vec<String>,
}
pub const IGNORED_NAME: &str = "IGNOREME";
pub fn group_display_name(group_name: &str, host: &str, is_dc: bool) -> String {
if is_dc {
IGNORED_NAME.to_string()
} else {
format!("{}@{}", group_name, host).to_uppercase()
}
}
pub fn group_object_id(rid: u32, domain: &str, is_dc: bool, computer_sid: &str) -> String {
if is_dc {
format!("{}-S-1-5-32-{rid}", domain.to_uppercase())
} else {
format!("{computer_sid}-{rid}")
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn group_display_name_member_vs_dc() {
assert_eq!(
group_display_name("Remote Desktop Users", "BRAAVOS.ESSOS.LOCAL", false),
"REMOTE DESKTOP USERS@BRAAVOS.ESSOS.LOCAL"
);
assert_eq!(
group_display_name("Remote Desktop Users", "MEEREEN.ESSOS.LOCAL", true),
"IGNOREME"
);
}
}