Using /usr/libexec/mdmclient DumpManagementStatus to get information about MDM management

On macOS, you can use the DumpManagementStatus function of the mdmclient command line tool to provide a lot of useful information if your Mac is enrolled with an mobile device management (MDM) server. This function outputs information in a JSON-like format that looks similar to this:


Management status: {
DeviceIsSupervised = 1;
EnrolledInDEP = 0;
MDMDeniesActivationLock = 0;
MDMs = {
"95953F77-BD20-461B-87DE-41C96D796CF6" = {
AdminRemovalDisallowed = 0;
DeniesActivationLock = 0;
IsActivationLockManageable = 1;
IsAnyMDM = 1;
IsDEP = 0;
IsMDMv1 = 1;
IsManagementSeparated = 0;
IsSupervised = 1;
IsUserApproved = 1;
IsUserEnrollment = 0;
OrigInstallOSVersion = "15.3.2";
PayloadOrgName = "Company Name";
ProfileOrgName = "Company Name";
ServerType = 1;
ServerURL = "https://mdm.server.goes.here/mdm/ServerURL";
};
};
MajorOSUpdatesManaged = 1;
ManagedViaMDM = 1;
UserApprovedMDMs = (
"95953F77-BD20-461B-87DE-41C96D796CF6"
);
}

view raw

gistfile1.txt

hosted with ❤ by GitHub

 

The above output is how MDM management may look if a Mac was enrolled using a profile, as opposed to being enrolled via Automated Device Enrollment (ADE). A Mac which was enrolled via ADE may display information which looks like this:


Management status: {
DEPEnrolledMDMs = (
"FD6D884A-CE08-4136-BD84-00DB5A6DC786"
);
DeviceIsSupervised = 1;
EnrolledInDEP = 1;
MDMDeniesActivationLock = 1;
MDMs = {
"FD6D884A-CE08-4136-BD84-00DB5A6DC786" = {
AdminRemovalDisallowed = 0;
DeniesActivationLock = 1;
IsActivationLockManageable = 1;
IsAnyMDM = 1;
IsDEP = 1;
IsMDMv1 = 1;
IsManagementSeparated = 0;
IsSupervised = 1;
IsUserApproved = 1;
IsUserEnrollment = 0;
OrganizationInfo = {
OrganizationAddress = "1234 Main Street , Suite 548, Anytown, NJ 12345";
OrganizationAddressLine1 = "1234 Main Street";
OrganizationAddressLine2 = "Suite 548";
OrganizationCity = Anytown;
OrganizationCountry = USA;
OrganizationDepartment = "Information Technology";
OrganizationEmail = "info@company.com";
OrganizationMagic = F026E1B424194FA3B6DFCCB01983FB6F;
OrganizationName = "Company Name";
OrganizationPhone = "+1 (555) 867-5309";
OrganizationSupportEmail = "helpdesk@company.com";
OrganizationSupportPhone = ""+1 (555) 867-5309";
OrganizationZipCode = 12345;
};
OrigInstallOSVersion = "15.3.2";
PayloadOrgName = "Company Name";
ProfileOrgName = "Company Name";
ServerType = 1;
ServerURL = "https://mdm.server.goes.here/mdm/ServerURL";
};
};
MajorOSUpdatesManaged = 1;
ManagedViaMDM = 1;
UserApprovedMDMs = (
"FD6D884A-CE08-4136-BD84-00DB5A6DC786"
);
}

view raw

gistfile1.txt

hosted with ❤ by GitHub

 

Meanwhile, a Mac which is not enrolled with an MDM server may display output which looks like this:


Management status: (null)

view raw

gistfile1.txt

hosted with ❤ by GitHub

 

For more information, please see below the jump.

The information provided by this tool can be used in a variety of ways. For example, if you want to get the URL of your MDM server, you can run the following command:


/usr/libexec/mdmclient DumpManagementStatus | awk '/ServerURL/ {print $3}' | sed -e 's/"//g' -e 's|\(\(/[^/]*\)\{2\}\).*|\1|' 2>/dev/null

view raw

gistfile1.txt

hosted with ❤ by GitHub

 

You should get output which looks similar to this:


username@computername ~ % /usr/libexec/mdmclient DumpManagementStatus | awk '/ServerURL/ {print $3}' | sed -e 's/"//g' -e 's|\(\(/[^/]*\)\{2\}\).*|\1|' 2>/dev/null
https://mdm.server.goes.here
username@computername ~ %

view raw

gistfile1.txt

hosted with ❤ by GitHub

 

If you want to check if your Mac was enrolled via ADE, you can run the following command:


/usr/libexec/mdmclient DumpManagementStatus | awk '/IsDEP/ {print $NF}' | sed 's/;//'

view raw

gistfile1.txt

hosted with ❤ by GitHub

 

A Mac which is enrolled via ADE should return output which looks like this:


username@computername ~ % /usr/libexec/mdmclient DumpManagementStatus | awk '/IsDEP/ {print $NF}' | sed 's/;//'
1
username@computername ~ %

view raw

gistfile1.txt

hosted with ❤ by GitHub

 

A Mac which not is enrolled via ADE should return output which looks like this:


username@computername ~ % /usr/libexec/mdmclient DumpManagementStatus | awk '/IsDEP/ {print $NF}' | sed 's/;//'
0
username@computername ~ %

view raw

gistfile1.txt

hosted with ❤ by GitHub

 

 

If you want to check if your Mac was enrolled via Account Driven User Enrollment (ADUE) or via profile-based user enrollment, you can run the following command:


/usr/libexec/mdmclient DumpManagementStatus | awk '/IsUserEnrollment/ {print $NF}' | sed 's/;//'

view raw

gistfile1.txt

hosted with ❤ by GitHub

 

A Mac which is enrolled via ADUE or via profile-based user enrollment should return output which looks like this:


username@computername ~ % /usr/libexec/mdmclient DumpManagementStatus | awk '/IsUserEnrollment/ {print $NF}' | sed 's/;//'
1
username@computername ~ %

view raw

gistfile1.txt

hosted with ❤ by GitHub

 

A Mac which not is enrolled via ADUE or via profile-based user enrollment should return output which looks like this:


username@computername ~ % /usr/libexec/mdmclient DumpManagementStatus | awk '/IsUserEnrollment/ {print $NF}' | sed 's/;//'
0
username@computername ~ %

view raw

gistfile1.txt

hosted with ❤ by GitHub

 

If you want to check and see if your Mac was enrolled via Account Driven Device Enrollment (ADDE) vs being enrolled via ADE or a profile-based device enrollment, you can run the following command:


/usr/libexec/mdmclient DumpManagementStatus | awk '/ServerType/ {print $NF}' | sed 's/;//'

view raw

gistfile1.txt

hosted with ❤ by GitHub

 

A Mac which is enrolled via ADDE should return output which looks like this:


username@computername ~ % /usr/libexec/mdmclient DumpManagementStatus | awk '/ServerType/ {print $NF}' | sed 's/;//'
5
username@computername ~ %

view raw

gistfile1.txt

hosted with ❤ by GitHub

 

A Mac which is enrolled via via ADE or a profile-based device enrollment should return output which looks like this:


username@computername ~ % /usr/libexec/mdmclient DumpManagementStatus | awk '/ServerType/ {print $NF}' | sed 's/;//'
1
username@computername ~ %

view raw

gistfile1.txt

hosted with ❤ by GitHub

 

One thing to be aware of is that this output is not actually in JSON format, though it looks like it is. The output is in Apple’s property list (plist) format, which can be expressed in a JSON-like format. The reason I mention this is that trying to parse the output using tools like jq may result in errors similar to what’s shown below:


username@computername ~ % /usr/libexec/mdmclient DumpManagementStatus | jq .
jq: parse error: Invalid numeric literal at line 1, column 11
username@computername ~ %

view raw

gistfile1.txt

hosted with ❤ by GitHub

Determining update source for Microsoft Office 365 applications

On macOS, Microsoft has made its Office 365 applications available via three different channels:

  • Directly from Microsoft (available for folks via office.com and other Microsoft resources.)
  • Apple’s Mac App Store (available for folks using their personal Apple Accounts)
  • Apple’s Volume Purchase program (available via Apple Business Manager and Apple School Manager)

In turn, this means updates for these apps may be coming from a variety of sources:

Depending on how tightly an organization controls the ability of its users to install applications, it’s possible to have a scenario like this:

  • Microsoft Excel: Installed using an installer from Microsoft’s office.com site.
  • Microsoft Outlook: Installed using a personal Apple Account from the Mac App Store.
  • Microsoft Word: Installed by the organization’s MDM using a Volume Purchase license.

This can lead to challenges with keeping the apps updated, since there are three different update mechanisms for the three separate apps.

  • Microsoft Excel: Updates coming via Microsoft’s AutoUpdate application.
  • Microsoft Outlook: Updates coming via the Mac App Store.
  • Microsoft Word: Updates coming via commands sent by the organization’s MDM service to the managed device which tell the managed device to connect back to Apple and get the latest update.

To help with figuring this out, it’s possible to query the application’s metadata using the mdls command line tool to see if the app has an associated App Store receipt. If it does, it’s possible to further figure out if the App Store receipt in question is for a Volume Purchase program (VPP) license or for a Mac App Store (MAS) license.

To check, you can run the following command and examine the output you get back:


/usr/bin/mdls -name kMDItemAppStoreReceiptType /path/to/application_name_goes_here.app | awk '{print $3}' | tr -d '"'

view raw

gistfile1.txt

hosted with ❤ by GitHub

For example, here’s the output you should see for Microsoft Outlook.app installed using an installer from office.com or other Microsoft resources:


username@computername ~ % /usr/bin/mdls -name kMDItemAppStoreReceiptType "/Applications/Microsoft Outlook.app" | awk '{print $3}' | tr -d '"'
(null)
username@computername ~ %

Note: The (null) result is because the app does not have an associated App Store receipt.

Here’s the output you should see for Microsoft Outlook.app installed via the Mac App Store by someone using their personal Apple Account:


username@computername ~ % /usr/bin/mdls -name kMDItemAppStoreReceiptType "/Applications/Microsoft Outlook.app" | awk '{print $3}' | tr -d '"'
Production
username@computername ~ %

Here’s the output you should see for Microsoft Outlook.app installed by an organization’s MDM using a Volume Purchase license:


username@computername ~ % /usr/bin/mdls -name kMDItemAppStoreReceiptType "/Applications/Microsoft Outlook.app" | awk '{print $3}' | tr -d '"'
ProductionVPP
username@computername ~ %

For more information, please see below the jump.

Using this method, I’ve written several Jamf Pro Extension Attributes for the following Office 365 applications to assist with figuring out which tool should be updating a particular Microsoft Office 365 application:

  • Microsoft Excel
  • Microsoft OneDrive
  • Microsoft OneNote
  • Microsoft Outlook
  • Microsoft PowerPoint
  • Microsoft Windows App
  • Microsoft Word

All of the Extension Attributes should return output like that shown below:

If the app was installed using the Mac App Store with a person’s Apple Account, the Extension Attribute will return the following result:

MAS

If the app was licensed using the Volume Purchase program and installed by an MDM, the Extension Attribute will return the following result:

VPP

If the app was not installed via either the Mac App Store or the Volume Purchase program, the Extension Attribute will return the following result:

MAU

In all other cases, including where the app in question is not installed, the EA will return the following result:

NA

The Extension Attributes are available from GitHub via the following links:

Rotating the credentials for a Jamf Pro AWS cloud distribution point

As part of setting up an AWS-hosted cloud distribution point for Jamf Pro, you will need to set up a user in AWS and get an access key and secret access key. I describe that process as part of an earlier post on how to set up an AWS-hosted cloud distribution point. However, many shop’s security policies mandate rotating AWS credentials on a regular basis. For those with requirements like this, please see below the jump for how to rotate these credentials for an AWS-hosted cloud distribution point.

The following procedure will walk you through the process of setting up a new AWS access key and secret access key which can be used to update the credentials used for an AWS-hosted cloud distribution point. This process assumes the following:

  • A. You have an existing AWS-hosted cloud distribution point set up in Jamf Pro.
  • B. You have an existing AWS IAM programmatic user account set up with the correct permissions to access and manage the AWS-hosted cloud distribution point set up in Jamf Pro.
  • C. You can log into the AWS console using an account with console access with sufficient permissions to perform the following actions:
    • i. Access AWS’s IAM service for the account which has the existing AWS IAM programmatic user account referenced in pre-requisite B above.
    • ii. Change the security credentials for the existing AWS IAM programmatic user account referenced in pre-requisite B above.
  • D. You can log into your Jamf Pro admin console using an account with sufficient permissions to perform the following actions:
    • i. Access the cloud distribution point settings.
    • ii. Edit the cloud distribution point settings.

1. Log into the AWS console.

2. Select the IAM service.

3. Identify and select the existing AWS IAM programmatic user account referenced in pre-requisite B above.

4. For that user account, select Security Credentials.

5. See how many access keys (active and inactive) are currently associated with the account.

An AWS IAM user account can have up to two total access keys set up in it. This procedure assumes you have one active access key which is being used as credentials for the AWS-hosted cloud distribution point. You will need to set up a second active access key as part of rotating the credentials for the cloud distribution point and both sets of access keys must be active for the rotation process to successfully complete.

If you already have two active access keys showing for the existing AWS IAM programmatic user account, stop here. Before proceeding, you will need to identify if a) if second access key is being used by something else, b) what the second access key is being used for and c) get its functionality moved to another IAM programmatic user account.

The rest of the procedure assumes that you have one active access key associated with the account.

6. Click the Create Access Key button.

7. For use case, select Other. Once the Other case has been selected, click the Next button.

8. Set a description tag (if desired), then click the Create Access Key button.

9. The access key will be created, with an access key ID and secret access key.

This is the only time you will have access to both the access key ID and secret access key information. You can click the Show button to reveal the secret access key information.

You also have the option of downloading both the access key ID and secret access key information in a .csv file.

The information in the .csv file will look similar to what’s shown below:



Access key ID Secret access key
AKIATFL3V52CQ4EI54FA UtK4219dBAE0211497183b20aa2a6296/Dk7de

10. Once you have both the access key ID and secret access key information stored for later reference, click the Done button.

You should now see a second active access key appear in the AWS console. The access key ID is displayed, but the secret access key is never shown again following the access key’s creation (described in step 9.)

11. Log into the Jamf Pro admin console for the Jamf Pro instance which has the relevant AWS-hosted cloud distribution point.

12. Go to Settings: Server: Cloud Distribution Point.

13. In the Cloud distribution point window, verify that Content Delivery Network is set to the following:

Amazon Web Services

14. Click the Edit button to update the credentials for the AWS-hosted cloud distribution point.

15. In the Access Key ID entry field, put in the following information:

Access key ID

16. In the Secret Access Key and Verify Secret Access Key entry fields, put in the following information:

Secret access key

17. Once you’ve verified that the correct information has been entered into the Access Key ID, Secret Access Key and Verify Secret Access Key entry fields, click the Save button.

18. Once the changes have been saved, click the Test button.

19. In the Cloud distribution point test window, click the Test button.

If the credentials were successfully rotated, you should see a message that the cloud service was successfully contacted.

If you see anything other than a message that the cloud service was successfully contacted, contact Jamf Support.

Once the credentials have been successfully rotated, I would recommend going back into the AWS console to deactivate the previously-used access key. To do this, use the following procedure.

1. Log into the AWS console.

2. Select the IAM service.

3. Identify and select the existing AWS IAM programmatic user account referenced in pre-requisite B above.

4. For that user account, select Security Credentials.

5. Identify the previously-used access key.

6. Click the Actions menu. In the Actions menu, select Deactivate.

7. Confirm that you want to deactivate the previously-used access key.

Once deactivated, the previously-used access key should still be shown in the AWS console as a deactivated access key.

Note: This deactivated access key is still taking up a slot as one of the two access keys associated with the AWS IAM programmatic user account, so it will need to be deleted before you’ll be able to set up a new access key later. To delete a deactivated access key, use the procedure shown below:

1. Log into the AWS console.

2. Select the IAM service.

3. Identify and select the existing AWS IAM programmatic user account referenced in pre-requisite B above.

4. For that user account, select Security Credentials.

5. Identify the deactivated access key.

6. Click the Actions menu. In the Actions menu, select Delete.

7. Confirm that you want to delete the deactivated access key by entering the deactivated access key into the relevant text input field, then click the Delete button.

Once deleted, the deactivated access key’s listing is removed from the AWS console.

Allowing Notification Center notifications to appear during screen recordings on macOS Sequoia

As part of making some screen recordings of app behavior recently, I noticed that the Notification Center notifications I was expecting to see weren’t appearing. As soon as I stopped making the screen recordings and replicated what I was doing, I saw the Notification Center notifications appear like they should.

After verifying that I hadn’t somehow enabled Focus or done something else to stop Notification Center notifications from appearing, I did some research which uncovered the solution. For more details, please see below the jump.

As part of the Notifications preferences in the Settings app, there is the following option:

Allow notifications when mirroring or sharing the display

 

This setting also apparently includes making screen recordings, because enabling it allowed Notification Center notifications to appear during screen recordings. To enable this setting, please use the following procedure:

1. Open Settings

2. Go to Notifications.

3. Enable the Allow notifications when mirroring or sharing the display setting.

 

You should now see notifications appearing while mirroring, sharing the display, or when making screen recordings.

Managing Apple Intelligence features on macOS Sequoia 15.3

As a follow-up to my earlier posts on managing Apple Intelligence features on macOS Sequoia 15.1 and 15.2 , Apple has added a couple of new management options for Apple Intelligence as part of the release of macOS Sequoia 15.3. For more details, please see below the jump.

As of macOS 15.3, management options are available for the following Apple Intelligence functionality:

  • Genmoji
  • Image Playground
  • Writing Tools
  • Summarizing emails
  • Enabling Siri to connect to third party cloud-based intelligence services
  • Managing non-anonymous login to third party cloud-based intelligence services
  • Allowing third party cloud-based intelligence service workspace IDs
  • Notes transcription summaries

The relevant key values are below:



Restriction Setting available in version Description Key Key value Default setting in macOS
Allow Image Playground macOS 15.0.0 If key value is set to FALSE, prohibits the use of image generation. allowImagePlayground Boolean TRUE
Allow Writing Tools macOS 15.0.0 If key value is set to FALSE, allows only anonymous access to external services allowWritingTools Boolean TRUE
Allow Genmoji macOS 15.0.0 If key value is set to FALSE, disables Genmoji allowGenmoji Boolean TRUE
Allow Mail Summary macOS 15.1.0 If key value is set to FALSE, prohibits the ability to create email summaries allowMailSummary Boolean TRUE
Allow External Intelligence Integrations macOS 15.2.0 If key value is set to FALSE, prohibits integrations with external services including ChatGPT and Google Gemini allowExternalIntelligenceIntegrations Boolean TRUE
Allow External Intelligence Sign-Ins macOS 15.2.0 If key value is set to FALSE, prohibits the ability to create email summaries allowExternalIntelligenceIntegrationsSignIn Boolean TRUE
Allow External Intelligence Workspace IDs macOS 15.3.0 If key value is set to the correct workspace ID string, Apple Intelligence will only allow the given external integration workspace ID to be used and will require a sign-in in order to make requests allowedExternalIntelligenceWorkspaceIDs String None
Allow Notes Transcription Summary macOS 15.3.0 If key value is set to FALSE, disables transcription summarization in Notes. allowNotesTranscriptionSummary Boolean TRUE

It’s important to note that while all of the settings listed above work on macOS Sequoia 15.3, not all work on earlier versions of macOS Sequoia. Here’s the compatibility list:

macOS 15.0 and later:

  • allowGenmoji
  • allowImagePlayground
  • allowWritingTools

macOS 15.1 and later:

  • allowMailSummary

macOS 15.2 and later:

  • allowExternalIntelligenceIntegrations
  • allowExternalIntelligenceIntegrationsSignIn

macOS 15.3 and later:

  • allowedExternalIntelligenceWorkspaceIDs
  • allowNotesTranscriptionSummary

Most of these settings can be managed by a configuration profile, where setting a boolean value of false will disable the Apple Intelligence feature in question. The one exception at this point is the one for managing workspace IDs for allowed external intelligence integrations, which uses a string value. An example profile which allows one workspace ID is available below:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt;
<plist version="1.0">
<dict>
<key>PayloadContent</key>
<array>
<dict>
<key>PayloadDisplayName</key>
<string>Restrictions</string>
<key>PayloadIdentifier</key>
<string>com.apple.applicationaccess.CF921560-2717-4986-8885-4FC8002C6BF7</string>
<key>PayloadType</key>
<string>com.apple.applicationaccess</string>
<key>PayloadUUID</key>
<string>CF921560-2717-4986-8885-4FC8002C6BF7</string>
<key>PayloadVersion</key>
<integer>1</integer>
<key>allowedExternalIntelligenceWorkspaceIDs</key>
<array>
<string>workspace_id_goes_here</string>
</array>
</dict>
</array>
<key>PayloadDescription</key>
<string>Alows External Intelligence Integrations using specific Workspace ID</string>
<key>PayloadDisplayName</key>
<string>Apple Intelligence Allow External Intelligence Workspace ID</string>
<key>PayloadIdentifier</key>
<string>14A04D12-F054-4E11-8943-D55DA53A61E9</string>
<key>PayloadOrganization</key>
<string>Company Name</string>
<key>PayloadScope</key>
<string>System</string>
<key>PayloadType</key>
<string>Configuration</string>
<key>PayloadUUID</key>
<string>14A04D12-F054-4E11-8943-D55DA53A61E9</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</plist>

If you need to allow the use of multiple workspace IDs, an example profile which allows multiple workspace IDs is available below:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt;
<plist version="1.0">
<dict>
<key>PayloadContent</key>
<array>
<dict>
<key>PayloadDisplayName</key>
<string>Restrictions</string>
<key>PayloadIdentifier</key>
<string>com.apple.applicationaccess.CF921560-2717-4986-8885-4FC8002C6BF7</string>
<key>PayloadType</key>
<string>com.apple.applicationaccess</string>
<key>PayloadUUID</key>
<string>CF921560-2717-4986-8885-4FC8002C6BF7</string>
<key>PayloadVersion</key>
<integer>1</integer>
<key>allowedExternalIntelligenceWorkspaceIDs</key>
<array>
<string>first_workspace_id_goes_here</string>
<string>second_workspace_id_goes_here</string>
<string>third_workspace_id_goes_here</string>
</array>
</dict>
</array>
<key>PayloadDescription</key>
<string>Alows External Intelligence Integrations using specific Workspace ID</string>
<key>PayloadDisplayName</key>
<string>Apple Intelligence Allow External Intelligence Workspace ID</string>
<key>PayloadIdentifier</key>
<string>14A04D12-F054-4E11-8943-D55DA53A61E9</string>
<key>PayloadOrganization</key>
<string>Company Name</string>
<key>PayloadScope</key>
<string>System</string>
<key>PayloadType</key>
<string>Configuration</string>
<key>PayloadUUID</key>
<string>14A04D12-F054-4E11-8943-D55DA53A61E9</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</plist>

Please see below for example profiles. The example profiles are also available via the following links:

Note: If you’re planning to use the example profiles with Jamf Pro, it will need to be signed before it can be uploaded to Jamf Pro. If you’re not familiar with how to sign profiles, the post linked below is a good guide to how that process works:

https://macblog.org/sign-configuration-profiles/

Genmoji:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt;
<plist version="1.0">
<dict>
<key>PayloadContent</key>
<array>
<dict>
<key>PayloadDisplayName</key>
<string>Restrictions</string>
<key>PayloadIdentifier</key>
<string>com.apple.applicationaccess.1281701E-9695-4447-9028-4962C25162FF</string>
<key>PayloadType</key>
<string>com.apple.applicationaccess</string>
<key>PayloadUUID</key>
<string>1281701E-9695-4447-9028-4962C25162FF</string>
<key>PayloadVersion</key>
<integer>1</integer>
<key>allowGenmoji</key>
<false/>
</dict>
</array>
<key>PayloadDescription</key>
<string>Disables creation of new Genmoji</string>
<key>PayloadDisplayName</key>
<string>Apple Intelligence Disable Genmoji</string>
<key>PayloadIdentifier</key>
<string>B83678F5-B2CB-467C-A89F-73F2E2E1346C</string>
<key>PayloadOrganization</key>
<string>Company Name</string>
<key>PayloadScope</key>
<string>System</string>
<key>PayloadType</key>
<string>Configuration</string>
<key>PayloadUUID</key>
<string>B83678F5-B2CB-467C-A89F-73F2E2E1346C</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</plist>

Image Playground:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt;
<plist version="1.0">
<dict>
<key>PayloadContent</key>
<array>
<dict>
<key>PayloadDisplayName</key>
<string>Restrictions</string>
<key>PayloadIdentifier</key>
<string>com.apple.applicationaccess.4FDE23F1-2652-4653-813C-205C9B86C0F5</string>
<key>PayloadType</key>
<string>com.apple.applicationaccess</string>
<key>PayloadUUID</key>
<string>4FDE23F1-2652-4653-813C-205C9B86C0F5</string>
<key>PayloadVersion</key>
<integer>1</integer>
<key>allowImagePlayground</key>
<false/>
</dict>
</array>
<key>PayloadDescription</key>
<string>Disables Image Playground and prohibits the use of image generation</string>
<key>PayloadDisplayName</key>
<string>Apple Intelligence Disable Image Playground</string>
<key>PayloadIdentifier</key>
<string>5596EE02-5B47-4B4C-B3F0-AA531C1E9AEB</string>
<key>PayloadOrganization</key>
<string>Company Name</string>
<key>PayloadScope</key>
<string>System</string>
<key>PayloadType</key>
<string>Configuration</string>
<key>PayloadUUID</key>
<string>5596EE02-5B47-4B4C-B3F0-AA531C1E9AEB</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</plist>

Writing Tools:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt;
<plist version="1.0">
<dict>
<key>PayloadContent</key>
<array>
<dict>
<key>PayloadDisplayName</key>
<string>Restrictions</string>
<key>PayloadIdentifier</key>
<string>com.apple.applicationaccess.2C74FDD6-E3CD-4E3B-9193-CD4818452895</string>
<key>PayloadType</key>
<string>com.apple.applicationaccess</string>
<key>PayloadUUID</key>
<string>2C74FDD6-E3CD-4E3B-9193-CD4818452895</string>
<key>PayloadVersion</key>
<integer>1</integer>
<key>allowWritingTools</key>
<false/>
</dict>
</array>
<key>PayloadDescription</key>
<string>Disables Apple Intelligence writing tools</string>
<key>PayloadDisplayName</key>
<string>Apple Intelligence Disable Writing Tools</string>
<key>PayloadIdentifier</key>
<string>FDDB4857-545D-4538-9C0B-B8ED78FFCE3E</string>
<key>PayloadOrganization</key>
<string>Company Name</string>
<key>PayloadScope</key>
<string>System</string>
<key>PayloadType</key>
<string>Configuration</string>
<key>PayloadUUID</key>
<string>FDDB4857-545D-4538-9C0B-B8ED78FFCE3E</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</plist>

Summarize emails:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt;
<plist version="1.0">
<dict>
<key>PayloadContent</key>
<array>
<dict>
<key>PayloadDisplayName</key>
<string>Restrictions</string>
<key>PayloadIdentifier</key>
<string>com.apple.applicationaccess.6DD01B26-8368-45FE-A4F7-35F4CD153E5D</string>
<key>PayloadType</key>
<string>com.apple.applicationaccess</string>
<key>PayloadUUID</key>
<string>6DD01B26-8368-45FE-A4F7-35F4CD153E5D</string>
<key>PayloadVersion</key>
<integer>1</integer>
<key>allowMailSummary</key>
<false/>
</dict>
</array>
<key>PayloadDescription</key>
<string>Disables Mail Summary and prohibits the ability to create email summaries</string>
<key>PayloadDisplayName</key>
<string>Apple Intelligence Disable Mail Summary</string>
<key>PayloadIdentifier</key>
<string>45B76C44-A61D-4A1B-82B9-6118B18DB129</string>
<key>PayloadOrganization</key>
<string>Company Name</string>
<key>PayloadScope</key>
<string>System</string>
<key>PayloadType</key>
<string>Configuration</string>
<key>PayloadUUID</key>
<string>45B76C44-A61D-4A1B-82B9-6118B18DB129</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</plist>

Block Siri from connecting to third party cloud-based intelligence services:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt;
<plist version="1.0">
<dict>
<key>PayloadContent</key>
<array>
<dict>
<key>PayloadDisplayName</key>
<string>Restrictions</string>
<key>PayloadIdentifier</key>
<string>com.apple.applicationaccess.69140388-BF31-4C0E-A791-F8EFDCB54C49</string>
<key>PayloadType</key>
<string>com.apple.applicationaccess</string>
<key>PayloadUUID</key>
<string>69140388-BF31-4C0E-A791-F8EFDCB54C49</string>
<key>PayloadVersion</key>
<integer>1</integer>
<key>allowExternalIntelligenceIntegrations</key>
<false/>
</dict>
</array>
<key>PayloadDescription</key>
<string>Disables External Intelligence Integrations and prohibits integrations with external services including ChatGPT and Google Gemini</string>
<key>PayloadDisplayName</key>
<string>Apple Intelligence Disable External Intelligence Integrations</string>
<key>PayloadIdentifier</key>
<string>2B3EE9B6-249E-44DD-B9A6-1E71F72A7E34</string>
<key>PayloadOrganization</key>
<string>Company Name</string>
<key>PayloadScope</key>
<string>System</string>
<key>PayloadType</key>
<string>Configuration</string>
<key>PayloadUUID</key>
<string>2B3EE9B6-249E-44DD-B9A6-1E71F72A7E34</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</plist>

Disable non-anonymous login to third party cloud-based intelligence services:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt;
<plist version="1.0">
<dict>
<key>PayloadContent</key>
<array>
<dict>
<key>PayloadDisplayName</key>
<string>Restrictions</string>
<key>PayloadIdentifier</key>
<string>com.apple.applicationaccess.EB34F905-0ED5-4E29-9A4A-5AE77F4D6652</string>
<key>PayloadType</key>
<string>com.apple.applicationaccess</string>
<key>PayloadUUID</key>
<string>EB34F905-0ED5-4E29-9A4A-5AE77F4D6652</string>
<key>PayloadVersion</key>
<integer>1</integer>
<key>allowExternalIntelligenceIntegrationsSignIn</key>
<false/>
</dict>
</array>
<key>PayloadDescription</key>
<string>Disables External Intelligence Sign-in and allows only anonymous access to external services</string>
<key>PayloadDisplayName</key>
<string>Apple Intelligence Disable External Intelligence Logins</string>
<key>PayloadIdentifier</key>
<string>995CBF19-0AE8-4098-93A3-A87812366961</string>
<key>PayloadOrganization</key>
<string>Company Name</string>
<key>PayloadScope</key>
<string>System</string>
<key>PayloadType</key>
<string>Configuration</string>
<key>PayloadUUID</key>
<string>995CBF19-0AE8-4098-93A3-A87812366961</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</plist>

Allow external intelligence workspace IDs:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt;
<plist version="1.0">
<dict>
<key>PayloadContent</key>
<array>
<dict>
<key>PayloadDisplayName</key>
<string>Restrictions</string>
<key>PayloadIdentifier</key>
<string>com.apple.applicationaccess.CF921560-2717-4986-8885-4FC8002C6BF7</string>
<key>PayloadType</key>
<string>com.apple.applicationaccess</string>
<key>PayloadUUID</key>
<string>CF921560-2717-4986-8885-4FC8002C6BF7</string>
<key>PayloadVersion</key>
<integer>1</integer>
<key>allowedExternalIntelligenceWorkspaceIDs</key>
<array>
<string>workspace_id_goes_here</string>
</array>
</dict>
</array>
<key>PayloadDescription</key>
<string>Alows External Intelligence Integrations using specific Workspace ID</string>
<key>PayloadDisplayName</key>
<string>Apple Intelligence Allow External Intelligence Workspace ID</string>
<key>PayloadIdentifier</key>
<string>14A04D12-F054-4E11-8943-D55DA53A61E9</string>
<key>PayloadOrganization</key>
<string>Company Name</string>
<key>PayloadScope</key>
<string>System</string>
<key>PayloadType</key>
<string>Configuration</string>
<key>PayloadUUID</key>
<string>14A04D12-F054-4E11-8943-D55DA53A61E9</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</plist>

Notes transcription summaries:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt;
<plist version="1.0">
<dict>
<key>PayloadContent</key>
<array>
<dict>
<key>PayloadDisplayName</key>
<string>Restrictions</string>
<key>PayloadIdentifier</key>
<string>com.apple.applicationaccess.50642C07-6992-47E0-A0BB-A777068878B4</string>
<key>PayloadType</key>
<string>com.apple.applicationaccess</string>
<key>PayloadUUID</key>
<string>50642C07-6992-47E0-A0BB-A777068878B4</string>
<key>PayloadVersion</key>
<integer>1</integer>
<key>allowNotesTranscriptionSummary</key>
<false/>
</dict>
</array>
<key>PayloadDescription</key>
<string>Disables Apple Intelligence transcription summary for Notes</string>
<key>PayloadDisplayName</key>
<string>Apple Intelligence Disable Notes Transcription Summary</string>
<key>PayloadIdentifier</key>
<string>0FDA9EBB-31CF-40DD-84CF-1EF76B8992CF</string>
<key>PayloadOrganization</key>
<string>Company Name</string>
<key>PayloadScope</key>
<string>System</string>
<key>PayloadType</key>
<string>Configuration</string>
<key>PayloadUUID</key>
<string>0FDA9EBB-31CF-40DD-84CF-1EF76B8992CF</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</plist>

Generating randomized long usernames for Jamf Pro standard user accounts

One of the options available in Jamf Pro is creating user accounts which are specific to a Jamf Pro instance. These user accounts can be used for a variety of purposes, including service accounts and emergency use admin accounts for Jamf Pro’s failover functionality for SSO. One limitation of Jamf Pro standard user accounts is that as of this time the authentication option for Jamf Pro standard accounts is username and password. For Jamf Pro standard user accounts, you can set a password policy which allows you to configure the following options:

  • Number of login attempts allowed before a Jamf Pro user is locked out of the account
  • Password length and age
  • Password reuse limitations
  • Password complexity

However, the password is not the only option you’re setting when creating a Jamf Pro standard user. Assuming that this is an account not tied to a specific person (as would be the case for a service account or an emergency use admin account), you can set to the username to a long randomized string. This can help secure the account because an attacker needs both the username and password for an account in order to authenticate and the long randomized string should make it more difficult for an attacker to guess the username. For more details, please see below the jump.

The Jamf Pro standard user’s username field can support up to 255 characters. The username field itself supports using lowercase letters and numbers when creating usernames. Within this 255 character limit, you can set a very long randomized string as the username.

Note: The Jamf Pro standard user’s username field should be able to support more than lowercase letters and numbers, but in my experience usernames are normally set using lowercase letters and numbers, like this:

localadmin121

Usernames are usually not set using the following:

  • UPPPERCASE LETTERS
  • Special characters like the following: ! @ # $ % ^ & * ( ) – _ = + \ | [ ] { } ; : / ? . >

When folks historically don’t do something, it also usually means that there hasn’t been a lot of testing of those conditions. In turn, that may mean there’s yet-undiscovered problems which can crop up.

For this reason, I’m going to stick with only using lowercase letters and numbers in the examples used in this blog post. It’s possible the use of uppercase letters and special characters is just fine and setting a username like LOLRICHISWRONG!@()_ works without problems, but I’ll leave further experimentation on this topic to my readers and for this post stick with a format which I see the least problems with: lowercase letters and numbers.

To leave some room in the character limit, let’s generate a username which is 250 characters long which is a randomized string of lowercase letters and numbers. You can do this using the following command:


export LC_CTYPE=C.UTF-8; tr -dc 'a-z0-9' </dev/urandom | head -c 250

view raw

gistfile1.txt

hosted with ❤ by GitHub

Note: The export LC_CTYPE=C.UTF-8 part of the command is there because the tr command will otherwise return tr: Illegal byte sequence on macOS when working with /dev/urandom‘s output:

https://andres.jaimes.net/linux/random-string/

That command should return a 250 character string like the one shown below:


hvr91onhenfmk3jalcc2zopih2l7kqx3gx0i0dgb2cf8jdrm6kkvgo6h0z0039o0p5urvbccxsjhrn065n1k6ju7lo9m13isrtkgg1b1jp4519f7405last3gcxrdf0406725kbtfhxh2iln8loxtbu3iixqq6jn41i43tr76rrj556bg4a25jtg1818m0ugoxo0xns5wg7iutmwitkv4edyh14gborjjr16orn3tfdeeawx6uqx3dov4o

view raw

gistfile1.txt

hosted with ❤ by GitHub


username@computername ~ % export LC_CTYPE=C.UTF-8; tr -dc 'a-z0-9' </dev/urandom | head -c 250
hvr91onhenfmk3jalcc2zopih2l7kqx3gx0i0dgb2cf8jdrm6kkvgo6h0z0039o0p5urvbccxsjhrn065n1k6ju7lo9m13isrtkgg1b1jp4519f7405last3gcxrdf0406725kbtfhxh2iln8loxtbu3iixqq6jn41i43tr76rrj556bg4a25jtg1818m0ugoxo0xns5wg7iutmwitkv4edyh14gborjjr16orn3tfdeeawx6uqx3dov4o
username@computername ~ %

view raw

gistfile1.txt

hosted with ❤ by GitHub

You can then use that string when creating a Jamf Pro standard user.

Disabling Apple Mail website link previews compose option on macOS Sequoia

Beginning with macOS Ventura, Apple’s Mail app adds a rich link preview when you’re composing an email and paste a web address into the email window. For example, here’s how it looks when I paste the following URL into a new email:

https://wwww.apple.com

 

For those who find this behavior undesirable and wish to turn it off, it can be disabled using the following process:

 

1. Launch Mail

2. Under the Mail menu, select Settings.

3. In the Settings window, select the Composing option.

4. Uncheck the Add link previews option.

 

With this option disabled, here’s how it looks when I paste the following URL into a new email:

 

https://wwww.apple.com

 

 

I have not found a way to disable the Add link previews option in Apple’s Mail app on macOS Sequoia using a defaults command, but it is possible to disable the Add link previews option using a configuration profile. For more details, please see below the jump.

The relevant preference domain and key values are below:

  • Preference domain: com.apple.mail
  • Key: AddLinkPreviews
  • Value: Boolean

Setting a boolean value of false will disable the Add link previews option in Apple’s Mail app on macOS Sequoia. I’ve built a configuration profile with the boolean value of false set, where the profile is available on GitHub via the link below:

https://github.com/rtrouton/profiles/tree/main/AppleMailDisableLinkPreviews

Suppressing the Welcome to Mac screen with a configuration profile on macOS Sequoia

Over the years, Apple has introduced a number of screens which appear the first time you log into a Mac and sometimes also after an OS update. Apple added a new Welcome to Mac screen as part of macOS Sequoia. This screen appears before you are given access to the Desktop.

I have not found a way to suppress this screen using a defaults command, but it is possible to suppress the Welcome to Mac screen on macOS Sequoia using a configuration profile. For more details, please see below the jump.

The relevant preference domain and key values are below:

  • Preference domain: com.apple.SetupAssistant.managed
  • Key: SkipSetupItems
  • Value: Welcome

The profile is available on GitHub via the link below:

https://github.com/rtrouton/profiles/blob/main/SkipWelcomeToMacSetup

Detecting successful MDM command execution on macOS Sequoia

One of the challenges in figuring out why a Mac isn’t responding to MDM commands is sometimes just figuring out if the Mac is receiving MDM commands at all. Fortunately, this is possible to figure out via the unified system logging using the right predicates when searching. For more details, please see below the jump.

To start, send an MDM command to the device in question. If your MDM server says it sent successfully, see what shows up on the Mac’s end using the following command:


/usr/bin/log show –predicate 'process=="mdmclient" OR subsystem=="com.apple.ManagedClient"' –info –last 10m

view raw

gistfile1.txt

hosted with ❤ by GitHub

This will likely give you a large number of log entries, but it’s possible to filter for what you’re looking for. For example, a blank push remote command sent from a Jamf Pro MDM server will include a log entry that looks similar to this:


2024-12-21 13:04:21.263154-0500 0x4d0d Default 0x0 1738 7 mdmclient: [com.apple.ManagedClient:MDMDaemon] [*] [0:MDMDaemon:<0x4d0d>] Processing server request: DeclarativeManagement for: <Device> (3fb48527-9aaa-492d-94fc-efd999d812a3) PowerNap: no

view raw

gistfile1.txt

hosted with ❤ by GitHub

Since we can see from the log entry that the relevant process is mdmclient and the string to search for includes “Processing server request: DeclarativeManagement for“, then if you know you sent a blank push within the last ten minutes you can use the following command to see if the entry appears in the returned logs:


/usr/bin/log show –info –predicate 'process=="mdmclient" AND eventMessage contains "Processing server request: DeclarativeManagement for"' –last 10m

view raw

gistfile1.txt

hosted with ❤ by GitHub

That should pull up the relevant log entry:


username@computername ~ % /usr/bin/log show –info –predicate 'process=="mdmclient" AND eventMessage contains "Processing server request: DeclarativeManagement for"' –last 10m
Filtering the log data using "process == "mdmclient" AND composedMessage CONTAINS "Processing server request: DeclarativeManagement for""
Skipping debug messages, pass –debug to include.
Timestamp Thread Type Activity PID TTL
2024-12-21 14:18:44.084210-0500 0xb9d7 Default 0x0 2867 7 mdmclient: [com.apple.ManagedClient:MDMDaemon] [*] [0:MDMDaemon:<0xb9d7>] Processing server request: DeclarativeManagement for: <Device> (a3a16dd4-ba49-4d3e-bd67-39c48dc2fc32) PowerNap: no
——————————————————————————————————————–
Log – Default: 1, Info: 0, Debug: 0, Error: 0, Fault: 0
Activity – Create: 0, Transition: 0, Actions: 0
username@computername ~ %

view raw

gistfile1.txt

hosted with ❤ by GitHub

From there, we can see the UUID identifier of the MDM command. In this example, the UUID is the following:


a3a16dd4-ba49-4d3e-bd67-39c48dc2fc32

view raw

gistfile1.txt

hosted with ❤ by GitHub

We can then use that to figure out from the Mac’s side if the MDM command was successful by running the following command:


/usr/bin/log show –predicate 'process=="mdmclient" AND eventMessage contains "a3a16dd4-ba49-4d3e-bd67-39c48dc2fc32"' –info –last 10m

view raw

gistfile1.txt

hosted with ❤ by GitHub

From there, we should see output that looks similar to what’s shown below:


username@computername ~ % /usr/bin/log show –predicate 'process=="mdmclient" AND eventMessage contains "a3a16dd4-ba49-4d3e-bd67-39c48dc2fc32"' –info –last 10m
Filtering the log data using "process == "mdmclient" AND composedMessage CONTAINS "a3a16dd4-ba49-4d3e-bd67-39c48dc2fc32""
Skipping debug messages, pass –debug to include.
Timestamp Thread Type Activity PID TTL
2024-12-21 14:18:44.084210-0500 0xb9d7 Default 0x0 2867 7 mdmclient: [com.apple.ManagedClient:MDMDaemon] [*] [0:MDMDaemon:<0xb9d7>] Processing server request: DeclarativeManagement for: <Device> (a3a16dd4-ba49-4d3e-bd67-39c48dc2fc32) PowerNap: no
2024-12-21 14:18:44.256439-0500 0xb9d7 Default 0x0 2867 7 mdmclient: [com.apple.ManagedClient:HTTPUtil] [*] [0:MDMDaemon:HTTPUtil:<0xb9d7>] >>>>> Sending HTTP request (PUT) [Acknowledged(DeclarativeManagement):a3a16dd4-ba49-4d3e-bd67-39c48dc2fc32] >>>>>
2024-12-21 14:18:44.383839-0500 0xb9d7 Default 0x0 2867 7 mdmclient: [com.apple.ManagedClient:HTTPUtil] [*] [0:MDMDaemon:HTTPUtil:<0xb9d7>] <<<<< Received HTTP response (200) [Acknowledged(DeclarativeManagement):a3a16dd4-ba49-4d3e-bd67-39c48dc2fc32] <<<<<
——————————————————————————————————————–
Log – Default: 3, Info: 0, Debug: 0, Error: 0, Fault: 0
Activity – Create: 0, Transition: 0, Actions: 0
username@computername ~ %

view raw

gistfile1.txt

hosted with ❤ by GitHub

If the blank push command was successful, we should see three log entries like the ones that showed up in the output above:


2024-12-21 14:18:44.084210-0500 0xb9d7 Default 0x0 2867 7 mdmclient: [com.apple.ManagedClient:MDMDaemon] [*] [0:MDMDaemon:<0xb9d7>] Processing server request: DeclarativeManagement for: <Device> (a3a16dd4-ba49-4d3e-bd67-39c48dc2fc32) PowerNap: no
2024-12-21 14:18:44.256439-0500 0xb9d7 Default 0x0 2867 7 mdmclient: [com.apple.ManagedClient:HTTPUtil] [*] [0:MDMDaemon:HTTPUtil:<0xb9d7>] >>>>> Sending HTTP request (PUT) [Acknowledged(DeclarativeManagement):a3a16dd4-ba49-4d3e-bd67-39c48dc2fc32] >>>>>
2024-12-21 14:18:44.383839-0500 0xb9d7 Default 0x0 2867 7 mdmclient: [com.apple.ManagedClient:HTTPUtil] [*] [0:MDMDaemon:HTTPUtil:<0xb9d7>] <<<<< Received HTTP response (200) [Acknowledged(DeclarativeManagement):a3a16dd4-ba49-4d3e-bd67-39c48dc2fc32] <<<<<

view raw

gistfile1.txt

hosted with ❤ by GitHub

Different MDM commands will have different output, but if you’re using Jamf Pro and need to figure out if a particular Mac is receiving MDM commands successfully, the process described above should assist with this. If you want to stream the logs in real time, so that you can check the logs as you’re sending a blank push command, you can use the following:


/usr/bin/log stream –info –debug –predicate 'process=="mdmclient" AND eventMessage contains "Processing server request: DeclarativeManagement for"'

view raw

gistfile1.txt

hosted with ❤ by GitHub

That should provide output similar to what’s shown below when you send a blank push:


username@computername ~ % /usr/bin/log stream –info –debug –predicate 'process=="mdmclient" AND eventMessage contains "Processing server request: DeclarativeManagement for"'
Filtering the log data using "process == "mdmclient" AND composedMessage CONTAINS "Processing server request: DeclarativeManagement for""
Timestamp Thread Type Activity PID TTL
2024-12-21 14:36:11.577917-0500 0xdad8 Default 0x0 3139 7 mdmclient: [com.apple.ManagedClient:MDMDaemon] [*] [0:MDMDaemon:<0xdad8>] Processing server request: DeclarativeManagement for: <Device> (fe514cb5-cee6-44c5-88a2-e9247c89f1ba) PowerNap: no

view raw

gistfile1.txt

hosted with ❤ by GitHub

Hat tip to Bryson and his teammates for figuring out most of this and sharing it with me.

Jamf Pro 11.12 API testing page now accepts both password authentication and API client authentication

As part of supporting Jamf Pro‘s API functionality, Jamf has made interactive documentation pages available with every Jamf Pro installation via the following address:

https://jamf.pro.server.here/api

When choosing to view the Classic API or Jamf Pro API documentation, there’s an option to log in and authenticate, so that you can run API commands interactively to see how running the commands works in real time and what results you see. This functionality is also useful when setting up API accounts with least privileged access, as it allows testing to verify that all necessary privileges have been assigned to the accounts.

Up until now, this authentication mechanism only supported using username and password authentication but as of Jamf Pro 11.2.0, the authentication mechanism now supports both of the following authentication methods:

  • Username/Password authentication
  • API client authentication

To use your preferred authentication method, please select it from the relevant drop-down menu.