Как исключить функцию, которая не возвращает журналы в Sentinel?
Я пишу запрос, который подсчитывает, сколько компьютеров пользователь вошел в систему за последние 30 дней. Мне нужен ежедневный подсчет входа каждого пользователя на другой компьютер для КАЖДОГО за последние 30 дней, чтобы получить точное дневное среднее значение из журналов, позже я сравню его с пороговым значением для обнаружения аномалии.
Моя проблема в том, что запрос исключает все результаты пользователя в моей таблице, если только 1 из 30 дней от пользователя не возвращает никаких журналов, а остальные 29 - нет. Я хочу иметь возможность сказать что-то вроде: если нет результатов (isnull? Iff?), Пропустите этот день и переходите к следующему или сможете установить значения таблицы как пустые /0, поэтому, когда я делаю avg, он просто добавляет 0 к средний.
Финальный стол должен вернуться TargetUserName
, Avg
(сумма каждого дня /30, исключая текущий день).
Код здесь отображает все дни для тестирования и только 10 дней вместо 30, чтобы сократить его.
Прямо сейчас он будет правильно отображать пользователей, у которых есть журналы за последние 30 дней, но если у пользователя нет журналов даже в течение 1 дня, они исключаются из окончательных результатов.
let Event=(){SecurityEvent | where EventID == 4624 or EventID==528};
let d1=(){Event | where TimeGenerated between(ago(2d) .. ago(1d))| summarize DT1=dcount(WorkstationName) by TargetUserName};
let d2=(){Event | where TimeGenerated between(ago(3d) .. ago(2d)) | summarize DT2=dcount(WorkstationName) by TargetUserName};
let d3=(){Event | where TimeGenerated between(ago(4d) .. ago(3d)) | summarize DT3=dcount(WorkstationName) by TargetUserName};
let d4=(){Event | where TimeGenerated between(ago(5d) .. ago(4d)) | summarize DT4=dcount(WorkstationName) by TargetUserName};
let d5=(){Event | where TimeGenerated between(ago(6d) .. ago(5d)) | summarize DT5=dcount(WorkstationName) by TargetUserName};
let d6=(){Event | where TimeGenerated between(ago(7d) .. ago(6d)) | summarize DT6=dcount(WorkstationName) by TargetUserName};
let d7=(){Event | where TimeGenerated between(ago(8d) .. ago(7d)) | summarize DT7=dcount(WorkstationName) by TargetUserName};
let d8=(){Event | where TimeGenerated between(ago(9d) .. ago(8d)) | summarize DT8=dcount(WorkstationName) by TargetUserName};
let d9=(){Event | where TimeGenerated between(ago(10d) .. ago(9d)) | summarize DT9=dcount(WorkstationName) by TargetUserName};
let d10=(){Event | where TimeGenerated between(ago(11d) .. ago(10d)) | summarize DT10=dcount(WorkstationName) by TargetUserName};
d1 | join (d2) on TargetUserName | join (d3) on TargetUserName | join (d4) on TargetUserName | join (d5) on TargetUserName | join (d6) on TargetUserName | join (d7) on TargetUserName | join (d8) on TargetUserName | join (d9) on TargetUserName | join (d10) on TargetUserName | extend Avg = ((DT1+DT2+DT3+DT4+DT5+DT6+DT7+DT8+DT9+DT10)/10) | summarize by TargetUserName, Avg, DT1, DT2, DT3, DT4, DT5, DT6, DT7, DT8, DT9, DT10
0 ответов
Попробуйте использовать соединение kind = outer.
Таким образом, когда совпадений нет, вы все равно будете получать ряды из других дней.