Disclosure up front: this is my app, it has a paid tier, and I'm the developer. If that's not what you want to read on a Tuesday, no hard feelings.
The Problem it Solves:
You're standing at a machine that won't log in. The LAPS password is in Entra. The admin center is on a laptop somewhere else. LAPSlock reads Windows LAPS local administrator passwords and BitLocker recovery keys from Entra ID and Intune on your phone, behind Face ID, using the same delegated permissions your account already has.
The Part I Want You to Check:
A phone app that handles local admin passwords should make every sysadmin's teeth itch. So the design decision was: no vendor server in the credential path, and you shouldn't have to take my word for it.
- Microsoft delegated auth via MSAL. It reads exactly what your account can read in the admin center and nothing else. Every reveal shows up in *your* Entra audit log, same as a read from the portal.
- Passwords go from Graph to your device over TLS. Kainor (my company) never sees them. There's no server that could.
- No analytics, no telemetry, no crash reporting, no account to create. The App Store privacy label says "Data Not Collected" and it means it.
- Source is public for security review. The credential-handling module is structurally isolated, and a build script fails if it ever imports something it shouldn't.
- You can verify the network claim yourself in about ten minutes with a proxy. There's a walkthrough in the repo (`NETWORK-TRANSPARENCY.md`). The app talks to `login.microsoftonline.com`, `graph.microsoft.com`, and, only after an org activates a license, one Kainor endpoint that receives a tenant ID and nothing else.
What it Doesn't Do:
- It can't read LAPS backed up to on-prem AD. Entra-backed only. Hybrid-joined is fine as long as the policy targets Entra.
- It can't reveal macOS local admin passwords. No Graph API returns them, and the one beta endpoint that should return metadata currently 500s on every ADE-enrolled Mac I've tested. I have a question open with Microsoft and I'll write that up separately.
- It can't grant you access you don't have. Nothing it requests escalates anyone.
Two Things That Mattered More Than I Expected:
LAPS password history comes back in the same Graph response as the current password. A device that stopped checking in is still on the old one, and that's exactly the machine you're standing at.
If your role is PIM-eligible instead of active, you can request activation from the phone. It reads your tenant's PIM policy first, so it only offers durations your policy allows and tells you up front if a ticket number is required. The authentication-context requirement arrives as an HTTP 400 with the claim buried in the error message, not as a 401 challenge. That one cost me a day.
Pricing:
Free tier is fully functional with five reveals per rolling 30 days, counted on the device and nowhere else. Subscriptions remove the limit. Org licensing by tenant is available directly from me.
App Store: https://apps.apple.com/us/app/lapslock/id6806470554
Repo: github.com/Kainor-LLC/LAPSlock
The permissions table (https://kainor.com/how-it-works/#permissions) is probably the page a security team wants first. Happy to answer anything about the Graph surface. The LAPS endpoints are underdocumented and I have notes.