Docs Get started
Get started
Partner Center Bridge ships as one signed Windows desktop app. Download it, double-click it, create a local account (or skip it on an already-secured machine), and add a Microsoft 365 tenant with its admin account. There is no server, database or identity provider to set up first. If your team wants one shared instance instead, see Run as a server.
Partner Center Bridge v0.10.0 for Windows
PartnerCenterBridge-v0.10.0-win-x64.zip · about 107 MB · signed by Joseph Spillers · SHA-256 checksum published next to it
Requirements
- 64-bit Windows (x64). The release is self-contained, so you do not need to
install .NET. Only a
win-x64build is published. There is no macOS or Linux executable. - Microsoft Edge WebView2 Runtime. The desktop window uses it to show the app. If missing, the app shows an installation hint. A current browser remains useful for Microsoft account sign-in and the optional browser/tray mode.
- To connect a tenant: its Microsoft 365 admin account, the roles needed for your operations, and permission to consent under that organization's policy. The Windows app includes its sign-in registration. CSP/GDAP is an optional alternative. See Connect Microsoft.
- For mailbox features only: PowerShell 7, the
ExchangeOnlineManagementmodule and an app-only certificate. Everything else works without them. See Exchange Online.
1. Download and verify
From the latest
release, download PartnerCenterBridge-v0.10.0-win-x64.zip and the
.sha256 file published next to it. Before you unzip, check that the hash matches. In
PowerShell, from the download folder:
$zip = "PartnerCenterBridge-v0.10.0-win-x64.zip"
$expected = (Get-Content "$zip.sha256" -Raw).Trim().Split()[0]
(Get-FileHash $zip -Algorithm SHA256).Hash -eq $expected # True means the zip is intact
The executable is Authenticode-signed by Joseph Spillers. After unzipping you can confirm the signature in the file's Properties › Digital Signatures tab, or run:
Get-AuthenticodeSignature .\PartnerCenterBridge.exe | Format-List Status, SignerCertificate
If you would rather build it yourself, ./scripts/publish-local.ps1 produces the same
single-file exe from source. See Local Workbench: building it.
2. Run it
Unzip to a folder of your choice and start the program:
.\PartnerCenterBridge.exe
On first launch it creates its data folder, sets up its SQLite database, and opens the workbench
in its desktop window. Close the window to stop the local API. Launching the exe a second time
brings the existing window forward. Use --browser for the classic browser/tray mode.
| Good to know | Detail |
|---|---|
| Where your data lives | %LOCALAPPDATA%\PartnerCenterBridge: the database, encryption keys, logs and uploaded app packages. Change it with --data-dir. |
| Who can reach it | Only this machine. It listens on the loopback address unless you pass --listen. |
| Another port | Desktop mode picks an available loopback port automatically. .\PartnerCenterBridge.exe --port 5090 starts the CLI host on a chosen port. |
| Check dependencies | .\PartnerCenterBridge.exe doctor prints every check with its fix and exits (exit code 1 if anything is an error). |
| All options | .\PartnerCenterBridge.exe --help, or see Local Workbench: running it. |
3. First launch: create the administrator
A new install has no accounts, so the first screen asks how you want to use it:
- Create an administrator account (recommended). The first account you register becomes the instance Administrator. After that you sign in with a passkey (once you register one under your account's Security settings) or your password, and you can add TOTP two-factor authentication. Anyone else who registers later starts with no access until you share tenants with them. See Authentication.
- Skip — use without an account on this computer. An explicit choice
for a machine that is already secured: screen lock, disk encryption, and no shared Windows
account. The desktop window receives a single-use setup link. After choosing this
option, it uses a single-use sign-in link that expires after two minutes; run the exe again
for a fresh one. Opening a bookmark later just tells you to start it from
PartnerCenterBridge.exeagain. Registering a password, a passkey, or TOTP is blocked until then; MCP access tokens still work. Add a password anytime from Settings > Account & security > Protect with an account.
--listen address. See
Using it without an account for the
full detail.
You land on Home. Its Finish setting up card lists only what still needs attention, such as the Microsoft connection, a tenant without GDAP delegation or the Exchange module, and links each item to the screen that fixes it.
4. Connect Microsoft
Add a tenant with its admin account
The Windows desktop app can connect directly to one Microsoft 365 organization, or several. You do not need Partner Center, a CSP membership, a GDAP relationship, or your own app registration for this flow. The publisher's multitenant sign-in registration is included.
- Open Tenants and choose Add tenant with Microsoft. The same button is in Settings > Microsoft connections.
- Sign in through Microsoft's system-browser prompt with the organization's admin account, complete MFA if requested, and approve consent according to its policies.
- Return to the desktop app. The connected tenant is now available to administer. Repeat Add tenant with Microsoft for another organization.
Each account's token cache is protected locally and survives restarts. Tokens renew silently when possible. If Microsoft requires interaction again, use that connection's reconnect action to sign back in with the remembered account. Access still depends on consent, tenant policy, and the signed-in admin's roles. Some organizations restrict unverified publishers.
Direct sign-in covers Microsoft Graph operations. Exchange Online certificate authentication remains separate; see Exchange Online setup below.
Optional: connect your partner organization
If you use CSP, the bridge also supports your existing partner setup. It reaches each tenant through your GDAP relationship and a multi-tenant app under the Secure Application Model. Nothing is installed in the customer tenant.
| Requirement | Why |
|---|---|
A multi-tenant Entra app registration in your partner tenant
(client id + secret in the Partner config section) |
This is the Secure Application Model app that acts on your behalf. |
| GDAP relationship per customer, with roles covering what you use (Intune administration, user management, Exchange recipient management) | Scopes partner-delegated access in each tenant. Without GDAP, this partner connection cannot administer it: the tenant shows as NoDelegation. |
| Per-customer admin consent for the app | Standard multi-tenant app consent in each customer tenant. |
| A one-time SAM bootstrap by an MFA'd admin agent | Seeds the encrypted, auto-rotating refresh token the bridge exchanges for per-tenant Graph tokens. |
(Exchange workflows only) an app-only certificate for Exchange
Online PowerShell (Exchange config section) |
Mailbox configuration is not fully exposed by Graph; the bridge shells out to the EXO V3 module with certificate auth. |
Partner app configuration, SAM bootstrap, and delegated permissions
Tell the bridge about your partner app registration
The Windows build reads optional settings from pcb.local.json in its data folder.
Create %LOCALAPPDATA%\PartnerCenterBridge\pcb.local.json with your app's details, then
restart the program:
{
"Partner": {
"ClientId": "<application (client) id of the multi-tenant app>",
"ClientSecret": "<client secret>",
"PartnerTenantId": "<your partner tenant id>"
}
}
This file is plain JSON in your per-user data folder, which the program restricts to your Windows
account where it can. If you would rather not
keep the secret in a file, set it as an environment variable (Partner__ClientSecret)
or pass it on the command line (--Partner:ClientSecret=...). Both take precedence over
pcb.local.json.
Run the one-time SAM bootstrap
.\PartnerCenterBridge.exe bootstrap-sam
It prints a sign-in URL and code. Sign in with an MFA'd admin-agent account from your partner tenant. The bridge stores the refresh token encrypted in its data folder and rotates it on every use. The command exits when it is done and does not start the web app. Other ways to seed the token are described in SAM bootstrap.
App registration permissions
The Secure Application Model uses delegated (App+User) permissions: the bridge acts as the admin agent whose refresh token you seed at bootstrap. Grant these delegated permissions on the multi-tenant app registration and admin-consent them in your partner tenant. Effective access in each customer tenant is the intersection of this list with the roles on that customer's GDAP relationship.
| API | Delegated permission | Used for |
|---|---|---|
Partner Center (https://api.partnercenter.microsoft.com) |
user_impersonation |
Customer list sync; the SAM token exchange itself. |
| Microsoft Graph | DeviceManagementApps.ReadWrite.All |
Win32 app templates: create, upload and assign Intune apps. |
| Microsoft Graph | User.ReadWrite.All |
New hire, offboard (block sign-in, revoke sessions), license assignment, user lookups. |
| Microsoft Graph | Group.ReadWrite.All |
Adding/removing group membership during provisioning and offboarding. |
| Microsoft Graph | UserAuthenticationMethod.ReadWrite.All |
MFA reset and compromised-account lockdown (enumerating and deleting auth methods). |
| Microsoft Graph | User-PasswordProfile.ReadWrite.All |
Password reset workflow. |
| Microsoft Graph | Organization.Read.All |
Reading subscribed SKUs for the license pickers and license repair. |
| Microsoft Graph | Policy.Read.All |
Config snapshots: reading Conditional Access Policies and Named Locations. |
| Microsoft Graph | DeviceManagementConfiguration.Read.All |
Config snapshots: reading Device Compliance Policies. |
| Microsoft Graph | AuditLog.Read.All (optional) |
Tenant audits: sign-in activity and MFA registration (dormant, stale and inactive-admin checks). |
| Microsoft Graph | Directory.Read.All (optional) |
Tenant audits: directory roles, app consent grants and Conditional Access exclusion names. |
| Microsoft Graph | DeviceManagementManagedDevices.Read.All (optional) |
Tenant audits: Intune device hygiene, compliance and encryption. |
/.default, the bridge can only ever use what is consented on the app. Adding a
permission later may require renewed consent. Verify consent and GDAP roles for each affected
customer; a partner-side permission change alone does not establish customer access.5. Add your customer tenants
Open Tenants and choose Add tenant with Microsoft to connect an organization through its admin account. If you configured the optional partner integration, choose Sync from Partner Center to pull in your customer list. Adding tenants is an Administrator task, and the Administrator who adds a tenant becomes its Owner. Each tenant shows its connection status. GDAP delegation applies to partner-connected tenants; directly connected tenants use the signed-in admin's consent and roles.
To give colleagues access on the same instance, share a tenant with them as Viewer, Operator or Owner. Even an instance Administrator cannot bypass these per-tenant grants.
Optional: Exchange Online
Mailbox operations (mailbox archive repair, and converting or forwarding a leaver's mailbox during offboarding) run through Exchange Online PowerShell, out of process. They need three things, and the app says which one is missing instead of failing silently. In the Windows Local Workbench, an instance Administrator can install the first two from the Home setup checklist or Settings after confirming; the commands below remain available for manual setup:
- PowerShell 7 (
pwsh) on PATH, or its path inExchange:PwshPath. - The ExchangeOnlineManagement module installed for it:
pwsh -c "Install-Module ExchangeOnlineManagement -Scope CurrentUser" - An app-only certificate: set
Exchange:AppIdinpcb.local.json, then either import the certificate intoCert:\CurrentUser\Myand setExchange:CertificateThumbprint(preferred on Windows -- no certificate secret is handled by the app), or place the PFX atcerts\exo.pfxin the data folder and setExchange:CertificatePath(plusExchange:CertificatePasswordif it's protected; that password reachespwshonly over standard input, never a temporary file). The app needsExchange.ManageAsAppand the Exchange Administrator role.
Run .\PartnerCenterBridge.exe doctor afterwards. The pwsh,
exchange-module and exchange-app checks should all pass. Full detail:
Exchange Online as an optional dependency.
The Exchange organization is read from Microsoft Graph for that tenant (its verified initial
*.onmicrosoft.com domain, checked against the tenant's own Entra id) the first time
an Exchange operation runs, so the Graph connection has to work for that tenant too. If the
connection ever answers for a different organization, the operation is refused and nothing is
changed.
Your first session
- Find a person. Search from Home or People across every active tenant and open their workspace: summary, access, licensing, authentication, mailbox, devices and history.
- Run a known fix. MFA reset, password reset, compromised-account lockdown, license repair or mailbox archive repair. Each one shows its diagnosis before anything changes. See Workflows.
- Mirror access or offboard someone. Review the plan, apply what you choose, and copy the ticket notes from the evidence view. See Operations.
- Set up a contract. Group tenants into a contract, add an app template (an
.intunewinfrom the Microsoft Win32 Content Prep Tool) or provisioning defaults (licenses, groups, UPN domain), and deploy. - Take a config snapshot (optional). Back up Conditional Access, Named Locations and Device Compliance policies for a tenant and diff any two captures. See Config snapshots.
Prefer Docker or a shared server?
The same app also runs as containers (Postgres, the API and the web app) for teams that want one
shared instance, with sign-in through your own OIDC provider or local accounts. Docker Compose
with the published ghcr.io images is the quickest way to evaluate it, and the
repository includes a Kustomize template for Kubernetes. See
Run as a server.