Intune Preflight
Setup · about 3 minutes

Connect your tenant.

Intune Preflight runs entirely in your browser. To read your tenant it needs one read-only app registration in your own Entra directory — you create it, you own it, and you can remove it at any time. Nothing is installed and no client secret is ever created.

Start setup ↓ Just explore the sample tenant →
Before you start

You need an account in your tenant that can consent to Graph permissions on behalf of the organisation — Global Administrator, Privileged Role Administrator or Cloud Application Administrator.

An Intune Administrator alone cannot grant this consent. That is Entra's rule, not ours — every permission below is admin-consent-only, even though all of them are read-only.

You only do this once per tenant. Everyone else on your team just needs the client ID it produces.

1

Create the app registration

Open Azure Cloud Shell and pick PowerShell. It is already signed in as you and already has what it needs, so there is nothing to install. Paste this whole block and press enter.

Connect-MgGraph -Scopes "Application.ReadWrite.All"

$displayName = "Intune Preflight"
$redirectUri = "https://kevinmalinoski.github.io/intune-preflight/app/"

$wanted = @(
  "DeviceManagementConfiguration.Read.All",
  "Group.Read.All",
  "DeviceManagementServiceConfig.Read.All",
  "DeviceManagementScripts.Read.All",
  "DeviceManagementApps.Read.All"
)

$graphSp = Get-MgServicePrincipal -Filter "appId eq '00000003-0000-0000-c000-000000000000'"
$ids = $graphSp.Oauth2PermissionScopes | Where-Object { $wanted -contains $_.Value }

$app = New-MgApplication -DisplayName $displayName `
  -SignInAudience "AzureADMyOrg" `
  -Spa @{ RedirectUris = @($redirectUri) } `
  -RequiredResourceAccess @(@{
      ResourceAppId  = $graphSp.AppId
      ResourceAccess = @($ids | ForEach-Object { @{ Id = $_.Id; Type = "Scope" } })
    })

New-MgServicePrincipal -AppId $app.AppId | Out-Null
Start-Sleep -Seconds 5

$tenant  = (Get-MgContext).TenantId
$encoded = [System.Uri]::EscapeDataString($redirectUri)

Write-Host ""
Write-Host "TENANT_ID = $tenant"
Write-Host "CLIENT_ID = $($app.AppId)"
Write-Host ""
Write-Host "Consent URL:" -ForegroundColor Cyan
Write-Host "https://login.microsoftonline.com/$tenant/adminconsent?client_id=$($app.AppId)&redirect_uri=$encoded"

It prints two IDs and a consent link. Keep that output open — you need it in step 3.

The redirect URI is already filled in with this site's address, which is what tells Entra it is safe to hand a token to this page:
https://kevinmalinoski.github.io/intune-preflight/app/
2

Approve the permissions

Open the consent link the script printed. You will see exactly what you are approving — five read-only permissions, nothing else. Read them, then accept.

PermissionWhat it reads
DeviceManagementConfiguration.Read.AllConfiguration profiles, Compliance policies, Settings Catalog, Administrative Templates, Assignment Filters
Group.Read.AllGroup names, and the dynamic membership rules behind them
DeviceManagementServiceConfig.Read.AllWindows Autopilot deployment profiles
DeviceManagementScripts.Read.AllPlatform Scripts — Windows PowerShell and macOS shell
DeviceManagementApps.Read.AllApps and their assignments — what is Required, Available or set to Uninstall
Every one ends in .Read.All. There is no write permission in the list, so the tool cannot change anything in your tenant even if it wanted to.
After you accept, your browser lands back here with ?admin_consent=True in the address bar. If you see a connection error instead, that is fine — consent was already recorded before the redirect fired.
3

Paste the two IDs

Open the app. On first run it asks for the Directory (tenant) ID and Application (client) ID the script printed. Paste them in and sign in with your admin account.

Open Intune Preflight →
Neither ID is a secret — both appear in plain text in every sign-in URL. They are saved in your own browser so you only type them once. Your access token is the sensitive part, and that lives in the tab and disappears when you close it.
Sharing with your team? Send them …/app/?tenant=<id>&client=<id> and the page configures itself. Handy if you manage several tenants — one bookmark each.
Worth knowing

What it can and can't see

It sees your slice

You sign in as yourself, so the tool reads exactly what you could already read — no more. If your Intune role is limited by scope tags, the preflight is limited the same way. For most admins that is the whole tenant; for a scoped admin it is their part of it.

Nothing is stored

There is no server behind this page. Your tenant's data goes from Microsoft Graph straight into your browser tab and is gone when you close it. It is never sent anywhere else, and there is no telemetry.

Need the complete, unfiltered picture regardless of scope tags — or does your Conditional Access block browser apps? Intune Preflight also self-hosts with application credentials. Same tool, same engine, and it is not going anywhere.
If something goes wrong

Troubleshooting

The Apps tab says "Needs setup"

Your app registration predates the Apps view and is missing its permission. In the Entra portal, open the registration, go to API permissions, add DeviceManagementApps.Read.All as a Delegated Microsoft Graph permission, and click Grant admin consent. Then end the session here and sign in again.

Sign-in fails with AADSTS50011 — redirect URI mismatch

The address registered in step 1 has to match this site exactly, character for character — including the trailing slash. Check your app registration's Authentication page reads https://kevinmalinoski.github.io/intune-preflight/app/ and that it is listed under Single-page application.

An error about cross-origin token redemption (AADSTS9002326)

The redirect URI was registered under Web instead of Single-page application. It is the single most common slip. Delete it and re-add it under the SPA platform — the script does this correctly, so this usually means it was added by hand in the portal.

AADSTS65001 — consent not granted

Step 2 did not complete. Re-open the consent link the script printed, and make sure you are signed in as an account that can consent for the organisation. In the portal, all five permissions should show Granted with a green check.

Conditional Access blocks the sign-in (AADSTS53003)

Some tenants require a compliant or managed device before Graph will issue a token. If that is your policy, this page cannot work around it — and shouldn't. Use the self-hosted build instead, which authenticates as an application rather than as you.

It signs in, but shows fewer policies than I expect

Most likely your Intune role is scoped by scope tags, so you are seeing your slice rather than the whole tenant. That is working as intended — the token is bounded by your own permissions. The self-hosted build uses application credentials and is unscoped.

How do I remove it afterwards?

Delete the app registration in Entra, or remove the enterprise application under Enterprise applications. That revokes the consent with it. Nothing else was ever created in your tenant, and nothing was written at any point.

Ready when you are.

Three minutes to connect, or no setup at all if you just want to look around first.

Open Intune Preflight → View it on GitHub
Intune Preflight is an independent, community-built tool. Not affiliated with or endorsed by Microsoft. Home · Technical setup guide