use chrono::{DateTime, Utc};
use crate::error::Result;
use crate::event::Event;
use crate::query::{EventLog, QueryDirection};
pub fn security_audit_by_id(ids: &[u32], since: DateTime<Utc>) -> Result<Vec<Event>> {
let xpath = build_event_id_xpath(ids, since);
let iter = EventLog::query("Security", &xpath, QueryDirection::Reverse)?;
let mut out = Vec::new();
for evt in iter {
out.push(evt?);
}
Ok(out)
}
pub(crate) fn build_event_id_xpath(ids: &[u32], since: DateTime<Utc>) -> String {
let ts = since.format("%Y-%m-%dT%H:%M:%S%.3fZ");
if ids.is_empty() {
return format!("*[System[TimeCreated[@SystemTime>='{ts}']]]");
}
let mut clause = String::from("(");
for (i, id) in ids.iter().enumerate() {
if i > 0 {
clause.push_str(" or ");
}
clause.push_str(&format!("EventID={id}"));
}
clause.push(')');
format!("*[System[{clause} and TimeCreated[@SystemTime>='{ts}']]]")
}