Watchtower Docs
Reference

Permissions we request

Every permission Watchtower's app registration asks for at admin consent, what it reads, and how many checks depend on it.

When you onboard a tenant, a Global Administrator grants admin consent to Watchtower's multi-tenant app registration. Microsoft's consent prompt is all-or-nothing, so this page lists everything that prompt contains - read-only application permissions plus the standard sign-in scopes - and, for each one, exactly what Watchtower reads with it. This page is generated from the same code that declares the app registration and runs the collectors, and CI fails if they diverge.

Two standing commitments:

  • Read-only scanning. The scan path never writes to your tenant. The single write permission in the manifest exists for the opt-in Intune restore feature and stays dormant unless a tenant admin enables restore - see its row below.
  • Evidence minimisation. Collectors project only the fields that checks consume - counts instead of identities where a count answers the question, and never credential material or message content.

Sign-in scopes (delegated)

Standard OpenID Connect scopes used only to sign your users into the dashboard. They grant no access to tenant configuration.

ScopePurpose
openidOpenID Connect sign-in
profileDisplay name on the signed-in account
emailEmail address on the signed-in account
offline_accessRefresh tokens so sessions survive token expiry
User.ReadRead the signed-in user's own profile

Application permissions (what the scanner reads)

One row per permission in the consent prompt. "Data read" names the collected data sources (each is a minimised projection, not a raw export); "Checks" counts the built-in checks whose evaluation depends on that permission today.

PermissionResourceData readChecks
AuditLog.Read.AllMicrosoft GraphguestUserActivity, servicePrincipalSignInActivities, userRegistrationDetails7
DeviceManagementApps.Read.AllMicrosoft GraphandroidAppProtectionPolicies, iosAppProtectionPolicies, windowsAppProtectionPolicies47
DeviceManagementConfiguration.Read.AllMicrosoft GraphandroidCompliancePolicies, androidConfigurationProfiles, deviceManagementSettings, intuneCompliancePolicies, intuneConfigurationPolicies, iosCompliancePolicies, iosConfigurationProfiles, macosCompliancePolicies, macosConfigurationProfiles, securityBaselineIntents, windowsCompliancePolicies, windowsConfigurationProfiles464
DeviceManagementConfiguration.ReadWrite.AllMicrosoft GraphWrite permission for the opt-in Intune settings restore feature. The scan path never uses it; it stays dormant unless a tenant admin explicitly enables restore in the dashboard, and that gate lives in Watchtower's database, not in the token.-
DeviceManagementManagedDevices.Read.AllMicrosoft GraphdeviceCleanupRules, managedDeviceOverview. Also read once per scan to decide platform applicability: when Windows, macOS, or iOS has zero enrolled devices, every check for that platform is marked not applicable instead of counting against the posture score.1
DeviceManagementRBAC.Read.AllMicrosoft GraphroleScopeTags1
DeviceManagementServiceConfig.Read.AllMicrosoft GraphdepEnrollmentProfiles, deviceEnrollmentConfigurations, enrollmentNotificationConfigurations, intuneBrandingProfiles, mobileThreatDefenseConnectors, termsAndConditionsPolicies, windowsHelloEnrollmentConfigurations7
Directory.Read.AllMicrosoft Graphapplications, copilotLicensing, emergencyAccessProfile, entraConnectSyncAccounts, gaGsaRoleAssignments, gsaForwardingProfiles, gsaTaggedApps, gsaUsageReports, guestOwnedObjects, passwordProtectionSettings, passwordRuleSettings, servicePrincipals36
DirectoryRecommendations.Read.AllMicrosoft GraphdirectoryRecommendations3
Domain.Read.AllMicrosoft Graphdomains1
EntitlementManagement.Read.AllMicrosoft GraphentitlementAssignmentPolicies4
Exchange.ManageAsAppOffice 365 Exchange OnlineadminAuditLogConfig, antiPhishPolicies, atpPolicyForO365, atpProtectionPolicyRules, dkimSigningConfig, emailTenantSettings, eopProtectionPolicyRules, externalInOutlook, hostedConnectionFilterPolicies, hostedContentFilterPolicies, hostedOutboundSpamFilterPolicies, mailFlowConnectors, mailboxAuditBypassAssociations, mailboxForwarding, malwareFilterPolicies, malwareFilterRules, organizationConfig, owaMailboxPolicies, roleAssignmentPolicies, safeAttachmentPolicies, safeLinksPolicies, sharingPolicies, teamsProtectionPolicies, transportConfig, transportRules, userMailboxes33
Group.Read.AllMicrosoft GraphcopilotLicensing, groups5
IdentityRiskEvent.Read.AllMicrosoft GraphuserRiskState, workloadIdentityRiskState4
IdentityRiskyServicePrincipal.Read.AllMicrosoft GraphworkloadIdentityRiskState2
IdentityRiskyUser.Read.AllMicrosoft GraphuserRiskState2
InformationProtectionPolicy.Read.AllMicrosoft GraphlabelPolicies1
NetworkAccess.Read.AllMicrosoft GraphgsaFilteringPosture, gsaForwardingProfiles, gsaSettings, gsaTlsInspection, gsaUsageReports22
OnPremDirectorySynchronization.Read.AllMicrosoft GraphonPremisesSynchronization1
Organization.Read.AllMicrosoft GraphcopilotLicensing, subscribedSkus, teamsClientConfiguration, teamsExternalAccessPolicy, teamsFederationConfiguration, teamsMeetingPolicy, teamsMessagingPolicy20
OrgSettings-AppsAndServices.Read.AllMicrosoft GraphappsAndServices3
OrgSettings-Forms.Read.AllMicrosoft GraphformsSettings1
Policy.Read.AllMicrosoft GraphadminConsentRequestPolicy, authMethodsPolicy, authenticationFlowsPolicy, authorizationPolicy, b2bPolicy, conditionalAccessPolicies, crossTenantAccessPolicyDefault, defaultAppManagementPolicy, mobileDeviceManagementPolicies, namedLocations, protectedActions, securityDefaults, userConsentSettings63
Policy.Read.DeviceConfigurationMicrosoft GraphdeviceRegistrationPolicy5
PrivilegedAccess.Read.AzureADMicrosoft GraphpraRoleManagementPolicyRules1
RoleAssignmentSchedule.Read.DirectoryMicrosoft GraphdirectoryRoles, privilegedUsers11
RoleEligibilitySchedule.Read.DirectoryMicrosoft GraphdirectoryRoles, privilegedUsers11
RoleManagement.Read.DirectoryMicrosoft GraphdirectoryRoles, emergencyAccessProfile, gaGsaRoleAssignments, pimNotificationRules, praRoleManagementPolicyRules, privilegedRoleDefinitions, privilegedUsers, protectedActions19
SecurityEvents.Read.AllMicrosoft GraphsecureScores0
SharePointTenantSettings.Read.AllMicrosoft GraphspoTenant12
Sites.FullControl.AllOffice 365 SharePoint OnlinespoSites, spoTenant12
Synchronization.Read.AllMicrosoft GraphspProvisioning2
User.Read.AllMicrosoft GraphcopilotLicensing, emergencyAccessProfile, guestOwnedObjects, guestSponsors, guestUserActivity, perUserMfaStates, privilegedUsers17
UserAuthenticationMethod.Read.AllMicrosoft GraphemergencyAccessProfile, userRegistrationDetails5

Optional, best-effort permissions

Not part of the default consent prompt. The checks that read them report indeterminate on tenants where they are not granted:

PermissionWhy it is optional
CopilotSettings-LimitedMode.ReadCopilot admin "limited mode" setting. Microsoft's endpoint currently supports delegated access only, so the app-only call is refused and the one check reading it reports indeterminate; the permission is deliberately left out of the default consent prompt until Microsoft enables application access.
DataLossPreventionPolicy.Read.AllPurview DLP policies, part of the optional Purview scan surface configured during onboarding. Tenants that skip it get indeterminate results on the DLP checks instead of invented verdicts.

Some Microsoft surfaces are not readable through Graph application permissions alone:

  • Exchange Online admin API: an Exchange Online resource permission (not a Graph scope), plus an Entra role granting Exchange read access.
  • SharePoint REST/CSOM: a SharePoint resource permission (not a Graph scope), plus the SharePoint Administrator Entra role.
  • Teams admin API: the Global Reader or Teams Administrator Entra role, assigned to Watchtower's service principal during onboarding.
  • Public DNS: email-security checks (SPF/DKIM/DMARC) resolve your domains' public DNS records - no tenant permission involved.

If a permission has not been consented (for example a tenant onboarded before a permission was added to the manifest), the affected data sources fail closed and their checks report indeterminate - never a pass or fail invented without evidence. Re-running admin consent updates the grant.

See also: Check catalog - the same mapping, seen from the check side.

On this page