Hey all!
After a ‘short’ break I think it’s time to get back into some blogging action. Still wondering what’s wrong with some people in this world, but I’ll leave further politics out of this blog. Way above my cognitive capacity to understand, so let’s try Intune related matter instead.
For this post I’d like to discuss a topic I still see popping up quite often, being: ‘we are seeing -repetitive- jamfAAD prompts on our Intune registered Macs’.
The reason I want to discuss this is because, although there may be an issue on those ‘affected’ devices, there are a few scenarios or factors which may make those prompts 100% expected behaviour. And because I see a lot of people who have some misunderstanding on how the Intune registration for macOS via JPRO works, I think/hope this post may clarify a few things.
First of all, let me drop the relevant articles on how to configure the Intune integration in JPRO here:
- https://docs.microsoft.com/en-us/mem/intune/protect/conditional-access-integrate-jamf
- https://docs.jamf.com/technical-papers/jamf-pro/microsoft-intune/10.34.0/Manually_Configure_the_Connection_Between_Jamf_Pro_and_Microsoft_Intune.html
Now, there seems to be some mismatch in view of the documentation regarding the required permission changes. The following document states the required changes which has to be made following some enhancements done by Microsoft:
However, looking at the 2 articles above, there is some mismatch in view of the MS article stating “After the app is registered successfully, the API permissions should only contain one permission called update_device_attributes“. This while the same document actually states to add permissions for Intune, MS Graph and Azure AD…
I’m currently working on getting those articles adjusted where needed, and have my permissions set as follows (for the manual configuration), as per the steps mentioned in https://docs.microsoft.com/en-us/mem/intune/protect/conditional-access-integrate-jamf#create-an-application-in-azure-active-directory, which works fine but in view of the recent/upcoming changes regarding Graph and Azure AD API, I think the articles may need some update (at the time of writing this post).

Apart from the discussion on the required permissions here above, I’ll leave the configuration out of today’s post as I want to focus on the real matter I want to discuss, being the ‘jamfAAD prompts’.
However, there is one additional reminder I do want to drop here:
You can only add 1 on-prem JPRO server to an Intune tenant for this integration. This because for on-prem JPRO servers you need to use the manual configuration. For JamfCloud instances you can use the Cloud Connector which does allow multiple JamfCloud instances to be integrated with the SAME Intune tenant. The Cloud Connector is not available for on-prem JPRO servers.
Now, let’s focus on the ‘jamfAAD prompts’. To do so, let’s discuss the process which happens when a device is being registered to Intune via JPRO first.
As we know we need:
Best Practice: For Execution Frequency, Jamf recommends that you select Once per computer. This prevents the policy from running multiple times on the same computer which can cause duplicate Azure AD records
Best Practice: Do Not Enable Conditional Access
Best practice workflows cover common scenarios; however, the following recommendations may not apply in your environment.
Jamf recommends that you do not enable Conditional Access for computers with multiple user accounts. Microsoft Endpoint Manager assigns one User Principal Name (UPN) to a device record. As a result, Jamf Pro will only send active data for one AAD ID per device at a time.
When an end user runs the registration policy in Self Service, the following happens (as per: https://docs.jamf.com/technical-papers/jamf-pro/microsoft-intune/10.36.0/Computer_Regisration_for_End_Users.html)
- Company Portal opens and prompts the user to authenticate to MS Azure
- If all goes well, the Azure registration happens and the user is presented with a message ‘You’re all set’
- After clicking ‘done’ in the Company Portal, it closes, and the jamfAAD prompt appears
At this point a record in Azure AD should have been created already:

Important to highlight here is that this is in AZURE AD and not in Intune/MEM (yet). The device will also report as Compliant – N/A at this stage.
Furthermore, a keychain entry is added containing the “Microsoft Workplace Join Key”. More about this below.
The next step is the jamfAAD prompt, and it’s important to understand what this jamfAAD actually does. To keep it short, the ONLY thing it does is authenticate to Azure AD in order to fetch the Azure Device ID of the registered Mac. Nothing more!
jamfAAD does NOT submit any information to Azure or MEM !

When clicking ‘Continue’ the end user will be prompted again to authenticate to Azure and will be asked to grant access to the macOS Keychain. Important here – as stated in the instructions window – is to click on ALWAYS ALLOW. This because jamfAAD will need access to the keychain items for ongoing checks happening in the background as from now. Both the WPJ key (see above) as the cached credentials for the authentication to Azure:

Once the end user completed this jamfAAD prompt, the registration to Intune is complete. At this point we should have:
- Azure AD record (still reporting as Compliant – N/A)
- WPJ key in the macOS keychain
- Cached credentials for Azure authentication in macOS keychain
- Still no device record in Intune/MEM
- Some additional keychain items related to Company Portal and some macOS preference files which are not really relevant for this post
Now, the fact that we don’t have an entry in MEM yet, is totally normal. Even more, it can take time for this to process and for the entry to be created. Why? Well, this is because it’s NOT the device or jamfAAD which is submitting data to Intune/MEM but JPRO (on-prem) or the Cloud Connector (Jamf Cloud). Let’s have a look at this.
Shamelessly stealing a diagram made by a colleague (all credits to Kyle):

Whether it is JPRO directly or via the Cloud Connector is in se irrelevant. The important part here is that jamfAAD is only fetching the Azure Device ID, and submitting that ID to JPRO. What happens next is JPRO (directly or via the Cloud Connector) is then receiving the Azure ID and submitting the inventory data for this device to Intune. The data which is actually send can be found here: https://docs.jamf.com/technical-papers/jamf-pro/microsoft-intune/10.36.0/Appendix_Inventory_Information_Shared_with_Microsoft_Intune.html
In JPRO we can check this data submission in the inventory of the device => History => “macOS Intune Integration Logs” :


Once this data has been sent, JPRO’s job is done, the device should appear in Intune/MEM and -subject to the compliance policies in MEM – be reported as Compliant or Non-Compliant.
That said, it can take quite some time for Intune to process the data submitted by JPRO. This can take up to an hour or even more. Subject to how busy your Azure tenant is, how many Compliance Policies you have, etc…
Once the data from JPRO has been processed by Intune, the device shows up in MEM:

Now, that brings us to the main goal of this post, the jamfAAD prompts. Once we have our device in Azure and MEM, we’re good right? The end user should not get any jamfAAD prompts anymore?
Well, NO ! Even if there is nothing ‘wrong’ with the device or it’s Intune registration, it is entire normal – after some period and/or even repetitively – that jamfAAD will prompt the end user again like this:

The reason for this is per design and actually how jamfAAD works!
Once the initial registration is completed jamfAAD continues to run in the background and has to authenticate every 24 hours to Azure to confirm the Azure AD record is still intact and confirm the AAD Device ID. Why? Well, because it has to report it to JPRO as proof of the integrity of the registration, and the activity of the device.
This is why we have the WPJ key and cached credentials. jamfAAD actually authenticates silently to Azure and uses the items in the keychain to do so. As long as the WPJ key is ok, the Azure AD record is intact, the device is online (to contact Azure), the cached password is valid…. all is well. jamfAAD silently authenticates, gets the Device ID, reports it to JPRO, JPRO sends inventory data to Intune… everyone happy. (Quick note: JPRO only sends an inventory update to MEM when something changed..)
However, whenever this silent authentications fails, for whatever reason, jamfAAD will go into interactive mode and prompt the end user to authenticate again! This is 100% normal and expected behaviour. Furthermore, there are other situations where Azure may even instruct jamfAAD to go in interactive mode, such as an expired MFA lifetime.
In any case, when troubleshooting such scenario, the jamfAAD logs will provide more information:
log show --predicate 'subsystem CONTAINS "jamfAAD"'
I’m not gonna go too much in detail here but in any case where the silent flow fails, you’ll see entries like below and jamfAAD going into interactive mode:
Refresh token wasn't found, user interaction is required.
Creating Error with description: User interaction is required
The token cannot be obtained in a silent mode; the non-silent methods need to be called instead
...
Jamf Support is the place to go in case you need further assistance with identifying why this is happening, but a quick summary of potential reasons are:
- Device offline for more than 24h
- Azure AD password changed (hence cached credential invalid)
- End user created multiple Azure AD records by registering the device multiple times
- MFA is being triggered because of the MFA token lifetime which expired
- Keychain issue (corrupted or user did not select always allow when registering…)
- …
Or any issue with the Mac not being able to contact JPRO and/or Azure… but in a lot of cases the jamfAAD prompts / pop-ups are totally expected!
That said it is mandatory that the end-user does react to the prompt and authenticates to Azure when asked to do so! Failing to do so will result in repetitive prompts (every 2 hours), the device going into unresponsive state and being marked as non-compliant after a certain amount of time (days). More about this below.
I also want to highlight the importance of educating the end-user not to blindly attempt to register their device again to Intune. (see best practice mentioned above, set the registration policy to once per computer). This can result into duplicate Azure AD/MEM device records and break the registration. Unless the device has been moved to State 1 – desactivated as per the JPRO Conditional Access settings.
For all Intune registered devices there are 3 different states a device can be in:
- State 0 – calculated
- State 1 – desactivated
- State 2 – unresponsive
State 0 is the state all devices should normally be in. This means that the device is checking into JPRO every 24h and jamfAAD submitting the Device ID.
State 2 is when a device has not checked in during the last 24 hours and/or JPRO did not get the Device ID. To fix this, the only thing the end user has to do is act on the jamfAAD popup and authenticate while the device is online.
State 1 is either because the device was removed from JPRO (inventory record deleted), or the device stayed in state 2 – unreponsive for more than x days.
And this brings us to the final thing I want to discuss, being ‘the amount of days of inactivity to flag a device as non-compliant’.
In Intune/MEM we have a setting referring to this concept:

However, this setting does not apply to device registered via ‘Partner Device Management’, like our integration with JPRO !
Instead, JPRO has it’s own setting to manage this:

Here in my test setup I’ve set it to 3 days, which means that whenever a devices fails to check in with JPRO for more than 3 days, so 3 days in state 2, JPRO will send and inventory update message to Intune/MEM with STATE 1. Typically around midnight the next day. This however will not just flag the device as ‘non-compliant’, it will remove the device record in Intune/MEM. Hence the device will need to be registered again via Self Service.
Very last thing I really want to highlight is the fact that, whenever you need some clean up of device records in either Intune or Azure AD (for instance when duplicate entries are causing trouble), there are a few things to keep in mind:
- When deleting device records in Azure/MEM it can take some time for the deletion to process. Make sure to wait until they are really gone prior to attempting a new registration.
- In some cases it may be good to do a full clean up on the device as well. For this there is the following script available on Github: https://github.com/macbuddy-howto/jamfAAD-and-WPJ-scripts/blob/8464642ba0e959f3572ca83de3b6faf41081e6bc/jamf-wpj-clean-up
Hope this clarifies a few of the things I see some people struggling with. Let me know if I missed anything or if there are any inaccuracies you’d like to see corrected.
That’s it! As always, if you liked the post, hit the like button, tell your friends about it and leave a comment down below!
Brgds,
TTG

Apple ecosystem enthusiast, geek, tech gadget freak, Belgian living in the Netherlands
Manager Technical Support | Jamf
Very interesting article. Thanks again!
What I would like to know from your experience is how you need to rerun the proces from Self Service without manually clearing the policy (since it’s set to once per computer).
Hey Martin. Seems I missed this comment. I’m afraid following the best practise to not set it as ongoing (avoid users doing multi registrations), their may not be much else than manually flushing it for a user who needs to register again (with help from the internal IT team). Unless you scope it via a Smart Group based on CA 1 or none?
Intune Conditional Access is broke broke broke at our 30,000 Mac company and now Intune is strangling Adobe, not allowing it to launch and displaying intune like ‘register your device’ messages. Intune is garbage with no purpose.
For sure there is a technical reason for it which support can assist with isolating.
I’m getting this “JamfAAD” wants to use… prompt… But neither the Continue or the Cancel button do anything, leaving the prompt stuck on the screen untill a reboot-re-login-of-the-account.
???
Too many possible reasons. Please open a support ticket and include jamfAAD logs
But – although it may sound crazy – any chance this was during screensharing and/or an external monitor attached. Yes I know how crazy this may sound, but try without if this was the case.
It WAS during screen-sharing..
So that is now fixed.
But wait… does this also happen when an external screen is connected???
Oh dear…
“how to confuse end-uers…”
Maybe it could have a note in the documentation somewhere…
Thanks Again!
🤦♂️ indeed. It’s just something I found in some internal discussions. Will pursue the reporting.
Hi
I know a bit offtopic. I am testing the new feature in jamf pro for device compliance instead of conditional access (intune integration)
I am testing on 4 devices.
One device works, the other three not.
All devices are enrolled with jamf pro prestage (same profile) and the user account is created on all with jamf connect.
When deploying the policy for registering the devices with company portal (Company Portal is installed before with a policy) and i start the registering process through selfservice only one device (my productive) is working from a-z. This means that the jamfaad starts after company portal has done his job. On the other devices jamfaad is not installed and never starts. Checking in terminal, says the the domain com.jamf.management.jamfaad does not exist.
one of the devices which not working i am testing also with my user.
The only difference between this two devices are, that i have some jamf admin apps installed on my productive macbook and on the other not. Do yu have an idea, how to force the installation of jamfaad? Is this a part of the jamf framework on the macbook?
Sounds like the Jamf Framework is not complete for some reason as jamfaad is part of that.
If you have those two devices in the Apple Bussiness Manager and associated to your Jamf MDM instance, then I would suggest re-enrolling them via the super-handy terminal command “sudo profiles renew -type enrollment”
But before you do that, you’ll need to uninstall all the current MDM profiles. first (removing the profiles in system preferences/settings).
For more information I suggest:
https://learn.jamf.com/en-US/bundle/jamf-now-documentation/page/Re-enrolling_a_Computer_Using_Automated_Device_Enrollment.html
Hi Mick,
thx for answering. I was able to find the jamfaad. It has changed the name: New name is jamf conditional access app and its installed on both machines.
https://learn.jamf.com/bundle/jamf-pro-documentation-current/page/Components_Installed_on_Managed_Computers.html
/Library/Application Support/JAMF/JAMF.app/Contents/MacOS/Jamf Conditional Access.app—App bundle used for integration with Azure Active Directory (AD).
But I do not have any idea why this doesnt start on some devices.
On my device that work checkin in terminal shows everything correct
On the other device it shows (when gathering AADInfo) that no tenant is set up.
Update: Temporary here are some issues in the jamf framework
Temporary solution is:
sudo jamf manage
command, before starting the company portal registration process