Query Details
let _EntraConnectSyncAccounts = toscalar(
_GetWatchlist("Activity-ExpectedSignificantActivity")
| where Activity == "EntraConnectSync"
| summarize make_list(ActorId)
);
let _ExpectedCrossTenantSynchronization =
_GetWatchlist("Activity-ExpectedSignificantActivity")
| where Activity == "CrossTenantSynchronization"
| project InitiatorId = tostring(ActorId), CrossSynchronizationDomain = tostring(Auxiliar)
;
AuditLogs
| where OperationName == "Add user" and Result == "success"
| extend
Initiator = iif(isnotempty(InitiatedBy["app"]), tostring(InitiatedBy["app"]["displayName"]), tostring(InitiatedBy["user"]["userPrincipalName"])),
InitiatorId = iif(isnotempty(InitiatedBy["app"]), tostring(InitiatedBy["app"]["servicePrincipalId"]), tostring(InitiatedBy["user"]["id"])),
IPAddress = tostring(InitiatedBy[tostring(bag_keys(InitiatedBy)[0])]["ipAddress"])
| where not(InitiatorId in (_EntraConnectSyncAccounts))
| mv-apply ModifiedProperty = TargetResources[0]["modifiedProperties"] on (
extend NewValue = todynamic(tostring(ModifiedProperty["newValue"]))
| summarize TargetUserProperties = make_bag(pack(tostring(ModifiedProperty["displayName"]), iff(array_length(NewValue) == 1, tostring(NewValue[0]), NewValue)))
)
| extend
TargetUserType = tostring(TargetUserProperties["UserType"]),
TargetUserPrincipalName = tostring(TargetResources[0]["userPrincipalName"]),
TargetId = tostring(TargetResources[0]["id"])
| where not(TargetUserType == "Guest")
| extend CrossSynchronizationDomain = extract(@"\_([^\_]+)\#EXT\#\@[^\@]+\.onmicrosoft\.com$", 1, TargetUserPrincipalName)
| join kind=leftanti _ExpectedCrossTenantSynchronization on InitiatorId, CrossSynchronizationDomain
| project
TimeGenerated,
LoggedByService,
Category,
AADOperationType,
Initiator,
IPAddress,
OperationName,
Result,
ResultDescription,
TargetUserType,
TargetUserPrincipalName,
CrossSynchronizationDomain,
TargetId,
TargetUserProperties,
AdditionalDetails,
InitiatorId,
InitiatedBy,
TargetResources,
CorrelationId
This KQL query is designed to analyze audit logs for user addition activities in a system, specifically focusing on identifying potentially unauthorized or unexpected user additions. Here's a simplified breakdown of what the query does:
Define Expected Accounts and Activities:
Filter Audit Logs:
Exclude Expected Accounts:
Analyze Modified Properties:
Exclude Guest Users:
Identify Cross-Tenant Synchronization:
Project Relevant Information:
In summary, this query is used to identify and list potentially unauthorized user additions by filtering out expected and authorized activities, focusing on unexpected or suspicious user additions in the audit logs.

Jose Sebastián Canós
Released: March 7, 2025
Tables
Keywords
Operators