The User Wasn't in the Group Yesterday — Today They Could Access Everything
Yesterday the user could not access the application.
Today they could.
No application role had been assigned directly to the account.
No one remembered approving new access.
But one thing had changed.
The user was now a member of the group that granted it.
Agent Foskett needed to know:
Who added them — and what happened after the access changed?

The Access Changed Because the Membership Changed.
Microsoft Entra audit logs record group-management activity, including member additions. The investigation starts with the membership event, then follows the initiator, target group and subsequent sign-ins.
The permission was indirect
The group already had access.
Once the account became a member, the effective access changed with it.
The investigation was not only about what the user could access. It was about the identity change that made the access possible.
Start with the group-management audit event
Add member to group. Agent Foskett searched AuditLogs for successful member additions involving the affected user.- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
let User = "alex.wilson@contoso.com";
AuditLogs
| where TimeGenerated > ago(7d)
| where ActivityDisplayName == "Add member to group"
| where Result =~ "success"
| where tostring(TargetResources) has User
| project TimeGenerated,
ActivityDisplayName,
Result,
InitiatedBy,
TargetResources,
CorrelationId
| order by TimeGenerated ascThe event proved a membership change occurred
Add member to group operation involving the account.But that was only the first fact.
Agent Foskett still needed to identify the group, the initiator and the business reason for the change.
Membership was the mechanism. Attribution required the rest of the audit record.
Expand TargetResources instead of reading the JSON by eye
TargetResources can contain multiple objects associated with the operation. Agent Foskett expanded the array so the user and group information could be examined as separate rows.- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
let User = "alex.wilson@contoso.com";
AuditLogs
| where TimeGenerated > ago(7d)
| where ActivityDisplayName == "Add member to group"
| where tostring(TargetResources) has User
| mv-expand Target = TargetResources
| extend TargetType = tostring(Target.type),
TargetName = tostring(Target.displayName),
TargetUPN = tostring(Target.userPrincipalName),
TargetId = tostring(Target.id)
| project TimeGenerated,
TargetType,
TargetName,
TargetUPN,
TargetId,
InitiatedBy,
CorrelationId
| order by TimeGenerated ascWhich group changed the user's effective access?
Agent Foskett had to establish what the target group actually controlled. Was it tied to an enterprise application, a SharePoint site, an Azure role path, a licensing assignment or another resource?
A group membership event becomes security-relevant when you understand what membership grants.
Who initiated the membership change?
InitiatedBy field became the next pivot. Depending on the operation, the initiator may be represented as a user or an application.Agent Foskett extracted both possibilities instead of assuming that a human administrator had made the change.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
let User = "alex.wilson@contoso.com";
AuditLogs
| where TimeGenerated > ago(7d)
| where ActivityDisplayName == "Add member to group"
| where tostring(TargetResources) has User
| extend InitiatingUser =
tostring(InitiatedBy.user.userPrincipalName),
InitiatingApp =
tostring(InitiatedBy.app.displayName),
InitiatingIp =
tostring(InitiatedBy.user.ipAddress)
| project TimeGenerated,
Result,
InitiatingUser,
InitiatingApp,
InitiatingIp,
TargetResources,
CorrelationId
| order by TimeGenerated ascAn authorised administrator could still make an unauthorised change
That establishes capability — not intent.
Agent Foskett checked whether there was an approved access request, expected administrative workflow or automation process that explained the addition.
Permission explains how the change could happen. It does not explain why it happened.
Was the membership direct, automated or governed?
Agent Foskett preserved the exact audit evidence and initiator context before deciding which path applied.
Do not force every group change into a manual-admin narrative.
What happened after the user gained access?
Agent Foskett pivoted into
SigninLogs to examine authentication activity after the group addition and identify which applications the account accessed.- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
let User = "alex.wilson@contoso.com";
let MembershipTime = datetime(2026-10-01 22:14:00);
SigninLogs
| where TimeGenerated between
(MembershipTime .. MembershipTime + 6h)
| where UserPrincipalName =~ User
| project TimeGenerated,
AppDisplayName,
IPAddress,
Location,
ResultType,
ResultDescription,
ConditionalAccessStatus
| order by TimeGenerated ascA sign-in after the change was correlation — not automatic proof
It does not, by itself, prove that the newly granted group access was used during that sign-in.
Agent Foskett correlated the application, resource-specific telemetry and business context before drawing that conclusion.
Build the sequence first. Prove resource use with the telemetry that records it.
Did the same initiator add anyone else?
Agent Foskett scoped successful group additions performed by the same initiator.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
let Initiator = "helpdesk.admin@contoso.com";
AuditLogs
| where TimeGenerated > ago(30d)
| where ActivityDisplayName == "Add member to group"
| extend InitiatingUser =
tostring(InitiatedBy.user.userPrincipalName)
| where InitiatingUser =~ Initiator
| where Result =~ "success"
| project TimeGenerated,
TargetResources,
CorrelationId
| order by TimeGenerated descRemoval does not erase the access window
Agent Foskett searched for the corresponding
Remove member from group event and treated those timestamps as the boundaries of the potential access window.Fixing the membership closes the path. It does not erase what may have happened while the path was open.
Build the access timeline
What Agent Foskett checked
What the evidence can and cannot prove
They do not automatically establish malicious intent or prove that every permission associated with the group was exercised.
Likewise, sign-in telemetry can show account authentication activity after the membership change, but resource-specific evidence may be needed to prove exactly what data or service was accessed.
Prove the membership change. Establish what it granted. Then prove what was used.
The lesson
Today they could reach resources they could not reach before.
Agent Foskett followed the Entra audit trail, found the membership event, identified the initiator and reconstructed the access window around it.
Access does not always change because a permission was assigned directly. Sometimes one group membership changes everything.
Related investigations
Final thought
Sometimes the permission already exists — and the identity is simply moved into the path that grants it.
Find the membership event. Identify the initiator. Establish what the group grants. Then follow the account activity that came afterward.
Yesterday the user was outside the group.
Today they were inside it.
The audit trail knew who changed that.
Follow the evidence. Build the timeline.
The Logs Already Knew! 🔎

