Hi,
Thanks for your response. Please ensure you’re using Application permissions (not just Delegated). In Entra ID > App registrations > Your cloud App > API permissions:
1, Click Add a permission > APIs my organization uses > search Universal Print (resource: https://print.print.microsoft.com).
2, Select Application permissions (not Delegated) and add:
- PrinterProperties.ReadWrite (Application)
- Printers.ReadWrite (Application) (You can add PrintJob.ReadWriteBasic (Application) if you’ll touch jobs, but it’s not required for updating printer description attributes.)
3, Click Grant admin consent for your tenant (must show a green check).
4, Remove any redundant Delegated permissions if you’re not using user tokens in this flow, the presence of delegated items doesn’t hurt, but it can cause confusion when you inspect JWTs.
After that, please follow exactly those steps:
1, Re‑acquire an Application token and verify its claims
Use the v2 token endpoint with the resource .default:
curl -k \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "client_id=<CLIENT_ID>&client_secret=<CLIENT_SECRET>&grant_type=client_credentials&scope=https%3A%2F%2Fprint.print.microsoft.com%2F.default" \
https://login.microsoftonline.com/<TENANT_ID>/oauth2/v2.0/token
Decode the token at jwt.ms and confirm:
- aud =
https://print.print.microsoft.com
- tid = your tenant GUID (must match the tenant that owns the printer)
- roles includes:
-
PrinterProperties.ReadWrite
-
Printers.ReadWrite
- (optionally)
PrintJob.ReadWriteBasic
If roles is missing, go back to Step 1 and fix API permissions/admin consent.
2, Sanity‑check tenant alignment
The “Printer not found” error commonly occurs when:
- You registered the printer under Tenant A, but you’re requesting an app token using Tenant B.
- You used
common/organizations in the token URL instead of the exact tenant that owns the printer.
- The printer is in a different account (e.g., test vs prod) than the app registration.
Action: Confirm the tid claim in the application token equals the tenant that shows the printer in the Universal Print portal.
3, Confirm you’re calling the printer‑specific IPP endpoint correctly
Keep using the service IPP endpoint:
POST https://print.print.microsoft.com/printers/{cloudDeviceId}
Content-Type: application/ipp
Authorization: Bearer <APPLICATION_TOKEN>
Notes:
- Your IPP payload must contain a matching
printer-uri that points to the same printer (e.g., ipp://print.print.microsoft.com/printers/{cloudDeviceId}), otherwise the service can return “not found” when the payload and path don’t align.
- For management updates like
Update-Output-Device-Attributes (changing description/state reasons), use the application token. Device tokens are typically permitted to report state (telemetry) but not to write description attributes.
4, Quick cross‑check with Graph (optional)
Before sending IPP, validate that your application token can see the printer via Microsoft Graph:
# List printers (expect to see your printer; note both id and cloudDeviceId)
curl -H "Authorization: Bearer <APPLICATION_TOKEN>" \
https://graph.microsoft.com/v1.0/print/printers
# Get a specific printer by Graph "id" (not cloudDeviceId)
curl -H "Authorization: Bearer <APPLICATION_TOKEN>" \
If Graph returns 403/404 or the printer list is empty, your app token doesn’t have the right Application permissions or is not in the same tenant. Fix Steps 1–3 before proceeding.
5, Retest IPP update with application token
Example:
curl -k \
-H "Authorization: Bearer <APPLICATION_TOKEN>" \
-H "Content-Type: application/ipp" \
--data-binary @update-output-device-attributes.bin \
What to verify in your IPP payload:
- Operation:
Update-Output-Device-Attributes
- Attributes present/valid:
-
printer-uri = ipp://print.print.microsoft.com/printers/<cloudDeviceId>
- Only supported printer description/state attributes (e.g.,
printer-state-message, printer-state-reasons). Avoid unsupported vendor/private attributes in this call.
- No job attributes in this printer‑level update.
If you still see 403 with device token, that’s expected for management writes. Use the application token for Update-Output-Device-Attributes. Use the device token for telemetry/status reporting operations the service explicitly allows for devices.
Note: Common pitfalls to eliminate
- Wrong audience: app token
aud must be https://print.print.microsoft.com (not Graph) for IPP.
- Using
cloudDeviceId vs Graph id: The IPP service supports {cloudDeviceId}; Graph uses id. Don’t mix them in the same call.
- Admin consent not truly granted: The portal shows green, but the token still lacks
roles. Re‑grant admin consent, wait 1–2 minutes, then request a fresh token.
- Mismatched
printer-uri in IPP: Path and payload must point to the same printer.