The Problem Nobody Wants to Talk About

Microsoft 365 Copilot is an amplifier. Whatever state your tenant permissions are in right now — the overshared SharePoint sites, the “Everyone Except External Users” grants from 2019, the shared mailboxes with fifteen people who left two years ago — Copilot will find all of it and cheerfully surface it to anyone who asks.

This isn’t a Copilot bug. Copilot respects your existing permissions model. The problem is that your existing permissions model is almost certainly a mess. Every tenant I’ve audited has had at least one “oh no” moment during the oversharing assessment. Most have had several.

The readiness work isn’t optional. Skip it and you’re handing every licensed user a turbocharged search engine across every permission mistake you’ve ever made.

This checklist is what I use for pre-enablement audits. Each item includes what to check, the risk if you skip it, what “good” looks like, and how to verify it programmatically. It’s exhaustive on purpose — you can skip sections that don’t apply to your environment, but you can’t fix what you haven’t checked.

A note on the PowerShell and Graph API examples: These were accurate at the time of writing (March 2026). Microsoft renames cmdlets, deprecates parameters, and shuffles module versions regularly. Test everything in a sandbox tenant before running it in production. If you find something that’s changed, let me know and I’ll update it.


1. Licensing and Prerequisites

The boring stuff first. Get this wrong and nothing else matters.

1.1 Base Licence Validation

What to checkEvery user targeted for Copilot has a qualifying base licence (M365 E3, E5, Business Standard, Business Premium, or equivalent).
Risk if missedCopilot licence assignment will fail or user will have degraded functionality.
What good looks like100% of pilot users have a qualifying base licence assigned and active.
# Graph PowerShell — list users and their assigned licence SKUs
Connect-MgGraph -Scopes "User.Read.All","Directory.Read.All"
Get-MgUser -All -Property DisplayName,AssignedLicenses |
  Select-Object DisplayName, @{N='Licences';E={($_.AssignedLicenses.SkuId -join ', ')}}
GET https://graph.microsoft.com/v1.0/users?$select=displayName,assignedLicenses

1.2 Copilot Add-On Licence Assignment

What to checkThe Microsoft 365 Copilot add-on SKU is assigned to each target user.
Risk if missedUser cannot access Copilot features despite having a base licence.
What good looks likeCopilot SKU (SKU ID: 639dec6b-bb19-468b-871c-c5c441c4b0cb for enterprise; verify current SKU for Business tier) assigned to all pilot users.
# Check for Copilot licence assignment
$copilotSkuId = "639dec6b-bb19-468b-871c-c5c441c4b0cb"
Get-MgUser -All -Property DisplayName,AssignedLicenses |
  Where-Object { $_.AssignedLicenses.SkuId -contains $copilotSkuId } |
  Select-Object DisplayName

1.3 Microsoft 365 Apps Update Channel

What to checkUsers are on Current Channel or Monthly Enterprise Channel for Microsoft 365 Apps.
Risk if missedCopilot features will not appear in Office desktop apps. Semi-Annual Channel is not supported.
What good looks likeAll Copilot-targeted devices report Current Channel or Monthly Enterprise Channel.
# Check via Intune device configuration or registry
# Registry path on device:
#   HKLM\SOFTWARE\Microsoft\Office\ClickToRun\Configuration
# Value: CDNBaseUrl
#   "492350f6-3a01-4f97-b9c0-c7c6ddf67d60" = Current Channel
#   "55336b82-a18d-4dd6-b5f6-9e5095c314a6" = Monthly Enterprise Channel

# Via Intune Graph API — get device configurations
GET https://graph.microsoft.com/v1.0/deviceManagement/managedDevices?$select=deviceName,operatingSystem

1.4 Network Connectivity

What to checkRequired Copilot endpoints are accessible (*.copilot.microsoft.com, substrate.office.com, etc.).
Risk if missedCopilot will fail silently or return errors.
What good looks likeAll required endpoints are whitelisted in firewalls/proxies per Microsoft’s published endpoint list.
# Test connectivity to key Copilot endpoints
$endpoints = @(
    "copilot.microsoft.com",
    "substrate.office.com",
    "graph.microsoft.com",
    "login.microsoftonline.com"
)
foreach ($ep in $endpoints) {
    Test-NetConnection -ComputerName $ep -Port 443 |
      Select-Object ComputerName, TcpTestSucceeded
}

1.5 Web Search and Grounding Configuration

What to checkDecision made on whether to allow Copilot to use web content for grounding responses.
Risk if missedUsers may unknowingly send prompts that include web-grounded data, or conversely miss useful context.
What good looks likeExplicit policy decision documented. Web search toggled on/off in M365 Admin Centre > Copilot settings per organisational preference.
M365 Admin Centre > Settings > Copilot > Manage how Copilot can reference web content

2. Entra ID Configuration

This is where the Copilot risk conversation really starts. A compromised account with Copilot access can summarise and exfiltrate data at machine speed. Your identity posture has to be solid.

2.1 Conditional Access — MFA Enforcement

What to checkMFA is enforced for all users via Conditional Access (not legacy per-user MFA).
Risk if missedCompromised account = attacker gets Copilot access to summarise and exfiltrate data at machine speed.
What good looks likeCA policy requiring MFA for all cloud apps, applied to all users (excluding break-glass accounts). Per-user MFA disabled in favour of CA-based MFA.
Connect-MgGraph -Scopes "Policy.Read.All"
# List all Conditional Access policies and their state
Get-MgIdentityConditionalAccessPolicy -All |
  Select-Object DisplayName, State,
    @{N='GrantControls';E={$_.GrantControls.BuiltInControls -join ', '}},
    @{N='IncludeUsers';E={$_.Conditions.Users.IncludeUsers -join ', '}}
GET https://graph.microsoft.com/v1.0/identity/conditionalAccess/policies

2.2 MFA Registration Completeness

What to checkAll licensed users have registered MFA methods (not just that the policy exists, but that users have actually enrolled).
Risk if missedPolicy exists but users haven’t registered = MFA not actually protecting them.
What good looks like100% of licensed users show isMfaRegistered = true.
# Requires Microsoft.Graph.Beta module
Connect-MgGraph -Scopes "AuditLog.Read.All","UserAuthenticationMethod.Read.All"
Get-MgBetaReportAuthenticationMethodUserRegistrationDetail -All |
  Where-Object { $_.IsMfaRegistered -eq $false } |
  Select-Object UserPrincipalName, IsMfaRegistered, MethodsRegistered

2.3 Conditional Access — Device Compliance

What to checkCA policies require compliant or Entra-joined devices for access to M365 services.
Risk if missedCopilot accessible from unmanaged/compromised devices.
What good looks likeCA policy requiring compliant device or Hybrid Azure AD Join for M365 apps access.
Get-MgIdentityConditionalAccessPolicy -All |
  Where-Object { $_.GrantControls.BuiltInControls -contains 'compliantDevice' } |
  Select-Object DisplayName, State

2.4 Conditional Access — Location-Based Policies

What to checkNamed locations configured; risky sign-in locations blocked or require additional auth.
Risk if missedCopilot access from untrusted locations/countries increases data exfiltration risk.
What good looks likeNamed locations defined. CA policy blocking or requiring MFA from untrusted locations.
Get-MgIdentityConditionalAccessNamedLocation -All |
  Select-Object DisplayName, @{N='Type';E={$_.AdditionalProperties.'@odata.type'}}

2.5 Guest and External User Access

What to checkGuest users’ access to tenant resources is restricted. External collaboration settings reviewed.
Risk if missedIf guests are assigned Copilot licences (or have broad SharePoint access), Copilot will surface internal data to external parties.
What good looks likeGuest access limited to specific resources. External collaboration settings restrict guest invitations to admins/specific roles. Guest users cannot be assigned Copilot licences.
# List all guest users
Connect-MgGraph -Scopes "User.Read.All"
Get-MgUser -Filter "userType eq 'Guest'" -All |
  Select-Object DisplayName, UserPrincipalName, CreatedDateTime, AccountEnabled

# Check external collaboration settings
GET https://graph.microsoft.com/v1.0/policies/authorizationPolicy
# Review: allowInvitesFrom, guestUserRoleId, allowedToSignUpEmailBasedSubscriptions

2.6 Admin Role Assignments and Privileged Access

What to checkExcessive admin role assignments reviewed. Global Admin count minimised. PIM enabled if available (Entra P2).
Risk if missedAdmin accounts with Copilot can access and summarise data across the entire tenant. Compromised admin + Copilot = full data breach at speed.
What good looks likeMax 2-4 Global Admins. Least-privilege role assignments. PIM for just-in-time elevation where available.
# List Global Admin role members
$globalAdminRoleId = (Get-MgDirectoryRole -Filter "displayName eq 'Global Administrator'").Id
Get-MgDirectoryRoleMember -DirectoryRoleId $globalAdminRoleId |
  Select-Object @{N='UPN';E={$_.AdditionalProperties.userPrincipalName}}
What to checkReview app registrations with broad Graph API permissions. Review admin consent grants. User consent settings restricted.
Risk if missedApps with broad permissions (e.g., Mail.Read, Files.Read.All) can access data that Copilot also surfaces — combined with a malicious app, this amplifies exposure.
What good looks likeUser consent disabled or restricted to verified publishers. No stale app registrations with overly broad permissions. Admin consent workflow enabled.
# List all OAuth2 permission grants (admin consent)
Connect-MgGraph -Scopes "Directory.Read.All"
Get-MgOAuth2PermissionGrant -All |
  Select-Object ClientId, ConsentType, Scope, ResourceId

# List app registrations with broad permissions
Get-MgApplication -All |
  Select-Object DisplayName, @{N='Permissions';E={
    $_.RequiredResourceAccess.ResourceAccess.Id -join ', '
  }}

2.8 Security Defaults vs Conditional Access

What to checkDetermine whether the tenant uses Security Defaults or Conditional Access. They cannot be active simultaneously.
Risk if missedSecurity Defaults provide basic MFA but lack granularity needed for Copilot governance (e.g., device compliance, location policies).
What good looks likeConditional Access enabled (Security Defaults disabled). At minimum: MFA for all users, block legacy auth, device compliance policies.
# Check Security Defaults status
(Get-MgPolicyIdentitySecurityDefaultEnforcementPolicy).IsEnabled

2.9 Break-Glass Account Configuration

What to checkEmergency access (break-glass) accounts exist, are excluded from CA policies, and are monitored.
Risk if missedIf CA policies lock out all admins, there’s no recovery path. Not Copilot-specific but critical for any CA deployment.
What good looks like2 break-glass accounts, cloud-only, excluded from all CA policies, strong passwords stored securely, sign-in activity monitored via alert rule.
# Verify break-glass accounts exist and check their exclusion in CA policies
# Manual review: ensure break-glass UPNs appear in Conditions.Users.ExcludeUsers
# for all CA policies retrieved in 2.1

3. SharePoint and OneDrive Sharing and Permissions

This is the big one. SharePoint permissions are where the oversharing lives, and Copilot will find every single over-permissioned site, library, and file. If you only have time for one section, make it this one.

3.1 Tenant-Level Sharing Settings

What to checkSharePoint and OneDrive external sharing level.
Risk if missedIf set to “Anyone” (anonymous links), Copilot can surface content from sites where anonymous sharing has created unintended access.
What good looks likeSharePoint: “New and existing guests” or “Existing guests only”. OneDrive: same or more restrictive than SharePoint. “Anyone” links disabled at the tenant level.
Connect-SPOService -Url https://<tenant>-admin.sharepoint.com
Get-SPOTenant | Select-Object SharingCapability, OneDriveSharingCapability,
  DefaultSharingLinkType, DefaultLinkPermission,
  PreventExternalUsersFromResharing
# SharingCapability values:
#   Disabled = no external sharing
#   ExistingExternalUserSharingOnly = existing guests only
#   ExternalUserSharingOnly = new and existing guests
#   ExternalUserAndGuestSharing = anyone (anonymous links)
What to checkIdentify all active “Anyone” sharing links across all sites.
Risk if missedCopilot can reference any content the user has access to. If anonymous links grant broad access, Copilot will surface that content in responses — and users may not realise the content was externally shared.
What good looks likeZero “Anyone” links on sensitive sites. Remaining anonymous links have expiry dates set.
# SharePoint Advanced Management — Site permissions report
# Run from SharePoint Admin Centre > Reports > Data access governance
# Or via PowerShell:
Get-SPOSite -Limit All | ForEach-Object {
    Get-SPOSiteFileVersionExpirationReportJobProgress -ReportUrl $_.Url
}
# Note: The full "sharing links" audit typically requires SharePoint Advanced Management
# or the SharePoint admin centre Data Access Governance reports

3.3 Site-Level Sharing Overrides

What to checkIndividual sites that have sharing settings more permissive than the tenant default.
Risk if missedEven if tenant-level sharing is restrictive, individual sites can be overridden to allow broader sharing.
What good looks likeNo site-level overrides that exceed tenant defaults. Or, overrides are documented and justified.
Get-SPOSite -Limit All |
  Where-Object { $_.SharingCapability -ne (Get-SPOTenant).SharingCapability } |
  Select-Object Url, SharingCapability, Owner

3.4 SharePoint Site Permissions — Broad Access Groups

What to checkSites where “Everyone”, “Everyone Except External Users” (EEEU), or “All Users” groups have been granted permissions.
Risk if missedThese groups give every user in the tenant access. Copilot will surface content from these sites to any licensed user — this is the number one oversharing vector.
What good looks likeZero sites with EEEU/Everyone/All Users in site permissions (other than intentionally public resources like the intranet).
# SharePoint Advanced Management — "Site permissions for the organization" report
# Scans all sites and lists:
#   - Total permissioned users
#   - Content shared with "Everyone"
#   - Content shared with EEEU
#   - Guest user access count
# Available via SharePoint Admin Centre or:
# Start-SPODataAccessGovernanceReport (SAM required)

3.5 OneDrive Default Sharing Scope

What to checkDefault sharing link type for OneDrive (Organisation vs Specific People).
Risk if missedIf default is “People in your organisation”, users unknowingly create org-wide links when sharing from OneDrive — Copilot then surfaces this to everyone.
What good looks likeDefault link type set to “Specific people”. Link permission set to “View” (not Edit).
Get-SPOTenant | Select-Object DefaultSharingLinkType, DefaultLinkPermission,
  OneDriveDefaultShareLinkScope, OneDriveDefaultShareLinkRole
# DefaultSharingLinkType: None, Direct (specific people), Internal (org), AnonymousAccess

3.6 SharePoint Site Classification and Sensitivity

What to checkSites are classified by sensitivity. Container-level sensitivity labels applied to sites/Teams.
Risk if missedWithout classification, there’s no way to programmatically identify which sites contain sensitive data that needs tighter controls before Copilot rollout.
What good looks likeAll active sites have a sensitivity label or classification applied. High-sensitivity sites have Restricted Access Control (RAC) enabled.
Get-SPOSite -Limit All |
  Select-Object Url, SensitivityLabel, Template |
  Where-Object { [string]::IsNullOrEmpty($_.SensitivityLabel) }
# Returns sites WITHOUT a sensitivity label — these are your gaps

3.7 Orphaned and Stale Sites

What to checkInactive sites, sites with no owner, or sites with stale content that still have broad permissions.
Risk if missedAbandoned sites with legacy broad permissions are a hidden oversharing risk. Copilot will surface content from them if the user has access.
What good looks likeInactive site policy enforced (SAM). Sites with no activity in 12+ months reviewed and archived or deleted. All sites have at least one active owner.
Get-SPOSite -Limit All |
  Where-Object { $_.LastContentModifiedDate -lt (Get-Date).AddMonths(-12) } |
  Select-Object Url, LastContentModifiedDate, Owner, StorageUsageCurrent

3.8 Restricted Content Discovery (RCD)

What to checkWhether Restricted Content Discovery is enabled for sensitive sites.
Risk if missedWithout RCD, Copilot and Search will surface content from overshared sites even if the user hasn’t previously interacted with it.
What good looks likeRCD enabled on high-sensitivity sites. Users only see content in Copilot/Search from sites they’ve previously visited (within 30-day window).
# RCD is configured via SharePoint Advanced Management
# Check restricted search mode:
Get-SPOTenant | Select-Object IsRestrictedSearchEnabled
# Check site-level RCD:
Get-SPOSite -Identity <siteUrl> | Select-Object RestrictContentOrgWideSearch

3.9 Restricted Access Control (RAC) for Critical Sites

What to checkRAC policies applied to sensitive sites to restrict access to specified security groups only.
Risk if missedEven users with inherited or legacy permissions can access the site. RAC overrides all other access.
What good looks likeRAC enabled on sites containing HR, finance, legal, executive, or other sensitive data.
# RAC is configured per-site via SAM
Get-SPOSite -Identity <siteUrl> | Select-Object RestrictedAccessControl
# Or set via:
# Set-SPOSite -Identity <siteUrl> -RestrictedAccessControl $true

4. Sensitivity Labels and Microsoft Information Protection

Labels are your mechanism for telling Copilot “don’t touch this”. Without them, you’re relying entirely on permissions — and we’ve already established that permissions are probably a mess.

4.1 Sensitivity Label Taxonomy

What to checkA sensitivity label taxonomy has been designed and published.
Risk if missedWithout labels, there’s no mechanism to control Copilot’s access to specific documents via DLP rules, and no label inheritance for Copilot-generated content.
What good looks likeMinimum taxonomy: Public, Internal, Confidential, Highly Confidential. Labels published to all users.
# Security & Compliance PowerShell
Connect-IPPSSession
Get-Label | Select-Object DisplayName, Priority, Disabled, ParentId,
  @{N='Encryption';E={$_.EncryptionEnabled}}

4.2 Label Adoption Rate

What to checkWhat percentage of content actually has labels applied (vs the taxonomy just existing).
Risk if missedTaxonomy exists but adoption is low = labels aren’t protecting anything. Copilot-generated content won’t inherit labels if source content is unlabelled.
What good looks like>80% of documents in SharePoint/OneDrive have a label applied. High-sensitivity content (HR, finance, legal) at 100%.
# Microsoft Purview > Information Protection > Content Explorer
# Or via:
# M365 Admin Centre > Reports > Microsoft Purview > Label activity
# Data Access Governance reports in SharePoint Admin Centre also show labelling rates

4.3 Default Sensitivity Label for Libraries

What to checkDefault labels configured for SharePoint libraries so new documents automatically receive a label.
Risk if missedNew content created in SharePoint (including by Copilot) may be unlabelled, creating a governance gap.
What good looks likeDefault label set on all document libraries. Users can upgrade but not downgrade.
# Check library-level default label via PnP PowerShell
Connect-PnPOnline -Url <siteUrl> -Interactive
Get-PnPList | Select-Object Title, DefaultSensitivityLabelForLibrary

4.4 Encryption and Usage Rights on Labels

What to checkLabels that apply encryption have correct usage rights. Copilot requires EXTRACT and VIEW rights to process content.
Risk if missedIf a label applies encryption but doesn’t grant EXTRACT right, Copilot cannot summarise or reference the document — which may be intentional for highly sensitive content, or may be an oversight that confuses users.
What good looks likeClear documentation of which labels allow Copilot access (EXTRACT + VIEW) and which intentionally block it.
Get-Label | Where-Object { $_.EncryptionEnabled -eq $true } |
  Select-Object DisplayName,
    @{N='RightsDefinitions';E={$_.EncryptionRightsDefinitions}}
# Review for "EXTRACT" right in the rights definitions

4.5 User-Defined Permissions (UDP) Labels

What to checkLabels that use user-defined permissions — where the user chooses who can access at time of labelling.
Risk if missedCopilot agents and some Copilot features cannot read files with UDP-based encryption. Users may be confused when Copilot can’t access documents they can see.
What good looks likeUDP labels documented. Users trained to understand that Copilot won’t access UDP-protected content.
Get-Label | Where-Object { $_.EncryptionEnabled -eq $true } |
  Select-Object DisplayName, EncryptionProtectionType
# EncryptionProtectionType: Template = admin-defined, UserDefined = UDP

4.6 Auto-Labelling Policies

What to checkAuto-labelling policies configured to detect and label sensitive content (e.g., documents containing PII, financial data, health records).
Risk if missedSensitive content remains unlabelled and unprotected. Copilot can freely surface it.
What good looks likeAuto-labelling policies active for common sensitive information types (SSN, credit cards, health records). Simulation run before enforcement. Requires E5 or E5 Compliance add-on.
Get-AutoSensitivityLabelPolicy | Select-Object Name, Mode, Enabled,
  @{N='Rules';E={$_.AutoSensitivityLabelPolicyRuleLinks.Count}}
# Mode: Enable (enforcing) or TestWithNotifications (simulation)

4.7 Container Labels for Teams, Groups, and Sites

What to checkSensitivity labels applied at the container level (Teams, M365 Groups, SharePoint sites) to govern privacy, guest access, and sharing settings.
Risk if missedContainer labels are not inherited by items within the container. Teams chat messages summarised by Copilot won’t display the container label. This is a known gap.
What good looks likeContainer labels applied to all Teams and M365 Groups. Understanding documented that item-level labels are still needed for content protection.
# List M365 Groups with their sensitivity labels
Connect-MgGraph -Scopes "Group.Read.All"
Get-MgGroup -Filter "groupTypes/any(g:g eq 'Unified')" -All |
  Select-Object DisplayName, @{N='SensitivityLabel';E={$_.AssignedLabels.LabelId}}

5. Data Loss Prevention (DLP)

DLP is the runtime control layer. Sensitivity labels classify content; DLP policies enforce what happens when that classified content interacts with Copilot.

5.1 DLP Policies for the Copilot Location

What to checkDLP policies created using the “Microsoft 365 Copilot and Copilot Chat” policy location.
Risk if missedWithout Copilot-specific DLP, Copilot can freely reference documents containing sensitive data types in its responses.
What good looks likeDLP policy targeting the Copilot location, with rules for sensitivity-labelled content and sensitive information types (separate rules — they cannot be combined in the same rule).
Connect-IPPSSession
Get-DlpCompliancePolicy |
  Where-Object { $_.Workload -match 'Copilot' -or $_.CopilotLocation -ne $null } |
  Select-Object Name, Mode, Enabled

5.2 Sensitivity Label Exclusion Rules

What to checkDLP rules that prevent Copilot from processing content with specific sensitivity labels (e.g., “Highly Confidential”).
Risk if missedHighly confidential documents will appear in Copilot citations and may be summarised.
What good looks likeRule in Copilot DLP policy: “Content contains > Sensitivity labels > Highly Confidential” with action to block Copilot processing. Items still appear in citations but content is not used.
Get-DlpComplianceRule |
  Where-Object { $_.ParentPolicyName -match 'Copilot' } |
  Select-Object Name, ContentContainsSensitiveInformation,
    @{N='LabelConditions';E={$_.ContentContainsSensitivityLabel}}

5.3 Sensitive Information Type (SIT) Rules

What to checkDLP rules that detect when users include sensitive information types (SSN, credit card numbers, etc.) in Copilot prompts.
Risk if missedUsers could paste or type sensitive data into Copilot prompts. Copilot processes the prompt including the SIT.
What good looks likeSIT-based DLP rule in the Copilot location. Cannot be in the same rule as label-based conditions — must be a separate rule.

Check as per 5.2 — review rules for SIT conditions vs label conditions.

5.4 Existing DLP Policies — Exchange, SharePoint, OneDrive, Teams

What to checkExisting DLP policies covering traditional workloads are functional and not in test-only mode.
Risk if missedEven without Copilot-specific DLP, existing DLP policies reduce the likelihood of sensitive content being broadly accessible (and therefore Copilot-surfaceable).
What good looks likeDLP policies active (not in simulation mode) for Exchange, SharePoint, OneDrive, and Teams. Policy tips enabled to warn users.
Get-DlpCompliancePolicy |
  Select-Object Name, Mode, Enabled, Workload,
    @{N='RuleCount';E={(Get-DlpComplianceRule -Policy $_.Name).Count}}

5.5 Data Security Posture Management (DSPM) for AI

What to checkMicrosoft Purview DSPM for AI is configured to monitor Copilot interactions and detect risky usage patterns.
Risk if missedNo visibility into how users are interacting with Copilot, what data is being surfaced, or whether sensitive data is being exfiltrated via Copilot responses.
What good looks likeDSPM for AI enabled. Alerts configured for sensitive content exposure through Copilot. Requires E5 Compliance or E5 + Copilot.
# Microsoft Purview portal > AI Hub > Data Security Posture Management
# Review: Oversharing alerts, sensitive content in Copilot interactions, user risk scores

6. Exchange Online

Email is the other massive data store Copilot can access. Every forwarding rule, shared mailbox, and stale permission is a potential data leak vector.

6.1 Mailbox Forwarding Rules Audit

What to checkAudit all mailbox forwarding (admin-configured and user Inbox rules) that forward to external addresses.
Risk if missedIf email is being forwarded externally, Copilot-generated summaries of mailbox content are also effectively exposed to external parties through the forwarded copies.
What good looks likeExternal forwarding disabled by default (anti-spam policy setting = “Off” or “Automatic”). Any exceptions documented and justified.
Connect-ExchangeOnline
# Admin-configured forwarding
Get-Mailbox -ResultSize Unlimited |
  Where-Object { $_.ForwardingSmtpAddress -or $_.ForwardingAddress } |
  Select-Object DisplayName, ForwardingSmtpAddress, ForwardingAddress

# User Inbox rules with forwarding
Get-Mailbox -ResultSize Unlimited | ForEach-Object {
    Get-InboxRule -Mailbox $_.UserPrincipalName |
      Where-Object { $_.ForwardTo -or $_.ForwardAsAttachmentTo -or $_.RedirectTo } |
      Select-Object MailboxOwnerId, Name, ForwardTo, RedirectTo, Enabled
}

6.2 Anti-Spam Policy — External Forwarding

What to checkOutbound anti-spam policy automatic forwarding setting.
Risk if missedIf set to “On”, any user can configure external forwarding without admin knowledge.
What good looks likeSet to “Off” or “Automatic” (which currently behaves as Off). Exceptions handled via per-user policy if required.
Get-HostedOutboundSpamFilterPolicy |
  Select-Object Name, AutoForwardingMode
# AutoForwardingMode: Automatic, On, Off

6.3 Mailbox Permissions — Full Access, Send As, Send on Behalf

What to checkAudit who has Full Access, Send As, and Send on Behalf permissions on mailboxes.
Risk if missedUsers with Full Access to shared mailboxes can have Copilot summarise the entire shared mailbox contents — including data they may not normally review.
What good looks likeFull Access grants are documented and limited to legitimate need. No stale grants from former employees or role changes.
# Full Access permissions
Get-Mailbox -ResultSize Unlimited | Get-MailboxPermission |
  Where-Object { $_.User -ne 'NT AUTHORITY\SELF' -and $_.IsInherited -eq $false } |
  Select-Object Identity, User, AccessRights

# Send As permissions
Get-Mailbox -ResultSize Unlimited | Get-RecipientPermission |
  Where-Object { $_.Trustee -ne 'NT AUTHORITY\SELF' } |
  Select-Object Identity, Trustee, AccessRights

6.4 Shared Mailbox Access Review

What to checkShared mailbox membership is current and follows least-privilege.
Risk if missedShared mailboxes often accumulate members over time. Copilot can summarise all content in a shared mailbox that a user has access to — even content they’ve never opened.
What good looks likeShared mailbox membership reviewed quarterly. Members limited to active role holders.
Get-Mailbox -RecipientTypeDetails SharedMailbox -ResultSize Unlimited |
  ForEach-Object {
    $mbx = $_
    Get-MailboxPermission -Identity $mbx.Identity |
      Where-Object { $_.User -ne 'NT AUTHORITY\SELF' -and $_.IsInherited -eq $false } |
      Select-Object @{N='SharedMailbox';E={$mbx.DisplayName}}, User, AccessRights
  }

6.5 Mailbox Audit Logging

What to checkMailbox auditing is enabled organisation-wide and not overridden at individual mailbox level.
Risk if missedCan’t track what Copilot accessed or what mailbox operations occurred.
What good looks likeAuditDisabled = False at org level. No individual mailbox overrides.
# Org-level check
Get-OrganizationConfig | Select-Object AuditDisabled
# Should be False

# Find any individual overrides
Get-Mailbox -ResultSize Unlimited |
  Where-Object { $_.AuditEnabled -eq $false } |
  Select-Object DisplayName, UserPrincipalName, AuditEnabled

6.6 Transport Rules and Mail Flow Rules

What to checkReview mail flow rules for any that auto-forward, redirect, or BCC to external addresses.
Risk if missedOrganisation-wide transport rules can silently copy mail externally, amplifying Copilot data exposure.
What good looks likeNo transport rules forwarding to external recipients without documented justification.
Get-TransportRule | Where-Object {
    $_.BlindCopyTo -or $_.CopyTo -or $_.RedirectMessageTo
} | Select-Object Name, State, BlindCopyTo, CopyTo, RedirectMessageTo

7. Microsoft Teams Governance

Teams sprawl is the second-biggest oversharing vector after SharePoint permissions. Every Team is a data container, and Copilot can surface content from all of them.

7.1 Teams Creation Policy

What to checkWho can create Teams/M365 Groups.
Risk if missedUncontrolled Teams creation = sprawl of data containers with default (often broad) permissions. Copilot surfaces content from all Teams the user is a member of.
What good looks likeTeams creation restricted to a security group (e.g., IT admins, team leads). Self-service requests via a managed process.
# Check M365 Group creation restriction
Connect-MgGraph -Scopes "Directory.Read.All"
$settings = Get-MgDirectorySetting |
  Where-Object { $_.DisplayName -eq 'Group.Unified' }
$settings.Values | Where-Object { $_.Name -eq 'EnableGroupCreation' } |
  Select-Object Name, Value
# Value = false means creation is restricted
# Also check GroupCreationAllowedGroupId for the allowed security group

7.2 Guest Access in Teams

What to checkGuest access settings for Teams — whether guests can be added, and what they can access.
Risk if missedGuest users added to Teams get access to channel conversations, files, and meeting notes. While guests can’t use Copilot, internal users’ Copilot can surface content from Teams that include guest members — which may contain guest-contributed content that shouldn’t propagate.
What good looks likeGuest access policy reviewed. Guest additions require owner approval. Guest access expires (access reviews configured if Entra P2 available).
# Teams admin settings
Connect-MicrosoftTeams
Get-CsTeamsGuestMeetingConfiguration
Get-CsTeamsGuestCallingConfiguration
Get-CsTeamsGuestMessagingConfiguration
# Also check org-wide Teams settings:
Get-CsTeamsClientConfiguration | Select-Object AllowGuestUser

7.3 External Access (Federation)

What to checkWhich external domains can communicate with your users via Teams chat/calls.
Risk if missedOpen federation allows any external Teams user to contact your users. Chat content may be indexed and surfaceable by Copilot.
What good looks likeExternal access restricted to specific trusted domains (not “open to all”).
Get-CsTenantFederationConfiguration |
  Select-Object AllowFederatedUsers, AllowedDomains, BlockedDomains,
    AllowTeamsConsumer, AllowTeamsConsumerInbound

7.4 Channel Types and Permissions

What to checkAudit use of Standard channels (visible to all team members) vs Private/Shared channels (restricted).
Risk if missedStandard channels expose all content to all team members. Copilot surfaces standard channel content to anyone in the team.
What good looks likeSensitive discussions use Private channels. Shared channels reviewed for cross-team access scope.
# List all teams and their channels with type
Connect-MicrosoftTeams
Get-Team -All | ForEach-Object {
    $team = $_
    Get-TeamChannel -GroupId $team.GroupId |
      Select-Object @{N='Team';E={$team.DisplayName}}, DisplayName, MembershipType
}
# MembershipType: Standard, Private, Shared

7.5 Teams App Permissions

What to checkThird-party Teams apps with data access permissions.
Risk if missedOverly permissive third-party apps can access Teams data. Combined with Copilot, this increases the attack surface.
What good looks likeApp permission policy restricts which apps users can install. Only approved apps allowed.
Get-CsTeamsAppPermissionPolicy |
  Select-Object Identity, DefaultCatalogAppsType, GlobalCatalogAppsType,
    PrivateCatalogAppsType

7.6 Meeting Copilot Controls

What to checkCopilot in Teams meetings settings — whether meeting transcription and Copilot summarisation are enabled.
Risk if missedCopilot can summarise meeting content, generate action items, and reference meeting transcripts. Sensitive meetings may need Copilot disabled.
What good looks likeOrg-wide default set. Sensitivity-label-based meeting policies restrict Copilot in confidential meetings. Meeting organisers can toggle Copilot per meeting.
Get-CsTeamsMeetingPolicy |
  Select-Object Identity, AllowTranscription, AllowCartCaptionsAndTranscriptions,
    CopilotWithoutTranscript
# Note: Specific Copilot meeting policy settings may vary by release channel

8. Compliance and Audit Logging

You need to be able to see what Copilot is doing. If you can’t audit it, you can’t govern it.

8.1 Unified Audit Log

What to checkUnified Audit Log is enabled for the tenant.
Risk if missedNo visibility into Copilot interactions, data access, or security events. Cannot investigate incidents.
What good looks likeAudit logging enabled. Audit (Standard) active at minimum. Audit (Premium) for Copilot-specific events if E5.
Connect-ExchangeOnline
Get-AdminAuditLogConfig | Select-Object UnifiedAuditLogIngestionEnabled
# Must be True

8.2 Copilot Interaction Audit Events

What to checkCopilot-specific audit events are being captured (requires Audit Premium with E5 + Copilot).
Risk if missedCan’t see what users prompted, what Copilot returned, or which documents were referenced.
What good looks likeAudit (Premium) enabled. Copilot interaction events (CopilotInteraction) searchable in audit log. Retention policy set to 1+ year.
# Search for Copilot interaction events
Search-UnifiedAuditLog -StartDate (Get-Date).AddDays(-7) -EndDate (Get-Date) `
  -RecordType CopilotInteraction -ResultSize 10 |
  Select-Object CreationDate, UserIds, Operations

8.3 Audit Log Retention

What to checkAudit log retention period configured (default 180 days for E5, 90 days for E3).
Risk if missedCopilot interaction logs expire before they can be reviewed for compliance or incident investigation.
What good looks likeCustom retention policy for Copilot events set to 1 year (or as required by compliance).
Get-UnifiedAuditLogRetentionPolicy |
  Select-Object Name, Priority, RetentionDuration, RecordTypes

8.4 eDiscovery Readiness for Copilot Content

What to checkCopilot interactions are discoverable via eDiscovery (Standard or Premium).
Risk if missedCopilot-generated content may be subject to legal hold or discovery obligations. If not capturable, the organisation may face compliance risk.
What good looks likeCopilot prompts and responses are searchable in Content Search and eDiscovery. Legal hold policies can capture Copilot interaction data.
# Microsoft Purview portal > eDiscovery > Content Search
# Search for Copilot interaction data using the "Copilot interactions" item type
# Requires E5 + Copilot for full Copilot audit data in eDiscovery

8.5 Communication Compliance (Optional)

What to checkCommunication compliance policies that monitor Copilot interactions for regulatory violations (e.g., financial services, healthcare).
Risk if missedUsers may use Copilot to draft or summarise content that violates regulatory requirements without detection.
What good looks likeCommunication compliance policy targeting Microsoft 365 Copilot location. Requires E5 Compliance.
# Microsoft Purview portal > Communication Compliance > Policies
# Check for policies targeting the "Microsoft 365 Copilot" location

9. Oversharing Risk Assessment

This section pulls together the highest-risk oversharing vectors into a focused assessment. If your stakeholder needs a “top 5 scariest things” summary, start here.

9.1 “Everyone Except External Users” (EEEU) Permission Sweep

What to checkAll SharePoint sites, OneDrive files, and Teams where EEEU (or equivalent broad groups) have been granted access.
Risk if missedSingle highest-impact oversharing vector. EEEU means every internal user — and therefore every internal user’s Copilot — can access the content.
What good looks likeEEEU removed from all sites except intentionally public ones (e.g., corporate intranet, all-staff announcements).
# Requires SharePoint Advanced Management
# SharePoint Admin Centre > Reports > Data access governance > Sharing links
# Filter for "Everyone except external users" permissions
# Alternatively use the site permissions report (see 3.4)

9.2 Org-Wide Teams

What to checkAny Teams that use org-wide membership (auto-adds all users in the tenant).
Risk if missedAll content in org-wide Teams is accessible to every user’s Copilot.
What good looks likeOrg-wide Teams used only for truly public announcements. No sensitive data in org-wide Teams.
Get-Team -All | Where-Object { $_.Visibility -eq 'Public' } |
  Select-Object DisplayName, GroupId, MemberCount, Visibility
# Review public Teams — especially any with "org-wide" in the name or description

9.3 Public M365 Groups

What to checkM365 Groups set to “Public” visibility (anyone in the org can join without approval).
Risk if missedPublic groups allow any user to self-join and access all content. Copilot surfaces content from groups the user is a member of.
What good looks likeDefault group privacy set to “Private”. Existing public groups reviewed and converted where appropriate.
Get-MgGroup -Filter "groupTypes/any(g:g eq 'Unified') and visibility eq 'Public'" -All |
  Select-Object DisplayName, Id, Visibility, CreatedDateTime

9.4 SharePoint Hub Site Permissions

What to checkHub sites that propagate navigation and permissions to associated sites.
Risk if missedHub association can create implicit access paths if not configured carefully.
What good looks likeHub sites documented. Permissions inheritance from hub reviewed.
Get-SPOHubSite | Select-Object Title, SiteUrl, Permissions

9.5 OneDrive “Shared with Everyone” Files

What to checkIndividual OneDrive files shared with broad audiences (org-wide links, EEEU).
Risk if missedUsers often share OneDrive files with “People in your organisation” without realising the scope. These files then appear in other users’ Copilot results.
What good looks likeDefault OneDrive sharing set to “Specific people”. Existing org-wide links identified and remediated.
# This requires per-user OneDrive enumeration
# Large-scale audit typically needs SharePoint Advanced Management reports
# Or third-party tools (Syskit, ShareGate, etc.)

9.6 Cross-Tenant and B2B Access

What to checkCross-tenant access policies (B2B collaboration and B2B direct connect).
Risk if missedExternal organisations with B2B direct connect can participate in shared channels. Content from these channels may be surfaced by Copilot for internal users.
What good looks likeCross-tenant access policies explicitly configured. B2B direct connect limited to trusted organisations.
Connect-MgGraph -Scopes "Policy.Read.All"
Get-MgPolicyCrossTenantAccessPolicyPartner -All |
  Select-Object TenantId,
    @{N='B2BCollab';E={$_.B2bCollaborationInbound.Applications.AccessType}},
    @{N='B2BDirectConnect';E={$_.B2bDirectConnectInbound.Applications.AccessType}}

The governance and people stuff. Less exciting than PowerShell, but this is where rollouts actually succeed or fail.

10.1 Run the Copilot Readiness Report

What to checkUse the built-in readiness report in the M365 Admin Centre.
Risk if missedMay miss users who lack prerequisites or who are strong pilot candidates.
What good looks likeReport reviewed. Prerequisite licence gaps identified. Top 25% suggested candidates used for pilot selection.
M365 Admin Centre > Reports > Usage > Microsoft 365 Copilot > Readiness tab

10.2 SharePoint Advanced Management (SAM) Activation

What to checkSAM is activated (included with E5 or available as add-on).
Risk if missedWithout SAM, you lack access to: site permissions reports, data access governance reports, Restricted Content Discovery, Restricted Access Control, and inactive site policies. These are the primary Copilot oversharing remediation tools.
What good looks likeSAM active. Data access governance reports scheduled.
SharePoint Admin Centre > Settings > SharePoint Advanced Management
# Or check licence assignment for the SAM add-on SKU

10.3 Pilot Group Definition

What to checkA defined pilot group with clear selection criteria.
Risk if missedBroad rollout without pilot = uncontrolled exposure.
What good looks like5-10% of users in pilot. Mix of roles (exec, sales, ops, IT). Users with high M365 usage. Access reviewed specifically for pilot users using the SAM “site permissions for a user” report.
# Use M365 Admin Centre Copilot readiness report "Suggested candidates" column

10.4 AI Usage Policy

What to checkAn Acceptable Use Policy for AI/Copilot has been drafted, approved, and communicated.
Risk if missedUsers may paste confidential data into prompts, share Copilot outputs externally, or rely on Copilot for regulated decisions without oversight.
What good looks likeWritten policy covering: what data can be used in prompts, how to handle Copilot output, prohibited uses, escalation for concerns. Acknowledged by all Copilot users.

10.5 User Training and Change Management

What to checkTraining plan and materials prepared for Copilot users.
Risk if missedLow adoption, misuse, or user frustration leading to abandoned licences (wasted spend).
What good looks likeRole-specific training. Quick-start guides. “Prompt of the week” programme. Champions network. Feedback channel.

10.6 Success Metrics and ROI Tracking

What to checkDefined KPIs for measuring Copilot success.
Risk if missedCan’t demonstrate value, leading to licence churn at renewal.
What good looks likeBaseline metrics captured pre-deployment. Viva Insights or M365 Usage Reports configured to track Copilot adoption, time saved, and user satisfaction.
M365 Admin Centre > Reports > Usage > Microsoft 365 Copilot > Usage tab
# Also: Viva Insights Copilot Dashboard (requires Viva Insights licence)

Appendix A: Required PowerShell Modules

ModuleInstall CommandUsed For
Microsoft.GraphInstall-Module Microsoft.GraphEntra ID, Groups, Users, Policies
Microsoft.Graph.BetaInstall-Module Microsoft.Graph.BetaMFA registration details, beta APIs
ExchangeOnlineManagementInstall-Module ExchangeOnlineManagementMailbox settings, forwarding, transport rules
Microsoft.Online.SharePoint.PowerShellInstall-Module Microsoft.Online.SharePoint.PowerShellSharePoint tenant/site settings
PnP.PowerShellInstall-Module PnP.PowerShellSharePoint library-level settings
MicrosoftTeamsInstall-Module MicrosoftTeamsTeams policies and settings
ExchangeOnlineManagement (IPPSSession)Connect-IPPSSessionSensitivity labels, DLP policies

Appendix B: Required Graph API Permissions (Application)

PermissionScopeUsed For
User.Read.AllApplicationUser enumeration, licence checks
Directory.Read.AllApplicationRoles, groups, policies
Policy.Read.AllApplicationConditional access, cross-tenant policies
Group.Read.AllApplicationM365 Groups, Teams membership
AuditLog.Read.AllDelegatedMFA registration status
Sites.Read.AllApplicationSharePoint site enumeration
Mail.ReadDelegatedMailbox access (use cautiously)
SecurityEvents.Read.AllApplicationSecurity alerts

Appendix C: Licence Matrix for Readiness Features

FeatureE3E5E3 + E5 ComplianceBusiness Premium
Manual sensitivity labelsYesYesYesYes
Auto-labellingNoYesYesNo
DLP (Exchange, SPO, OD)YesYesYesYes
DLP (Copilot location)YesYesYesYes
Audit (Standard)YesYesYesYes
Audit (Premium) + Copilot eventsNoYesYesNo
eDiscovery (Premium)NoYesYesNo
SharePoint Advanced ManagementNoYesAdd-onNo
Conditional AccessP1 incl.P2 incl.P1 incl.P1 incl.
PIM (just-in-time admin)NoP2 incl.NoNo
DSPM for AINoYesYesNo
Communication ComplianceNoYesYesNo
Entra Access ReviewsNoP2 incl.NoNo

References

This checklist was built from hands-on audit work and cross-referenced against these resources: