Skip to main content

Hi everyone,

I’m trying to set a default font in Microsoft Outlook (macOS) using Jamf Pro, and I’m running into some trouble.

By default, Outlook uses Aptos, but I’d like to change it to Book Antique, which is already available on the device.

What I’ve tried: I attempted to use the 3rd-party tool OutlookFontPoke by Paul Bowden @ Microsoft. Here’s what I did:

• Deployed the OutlookFontPoke script and TemplateRegDB.reg via a package (both located in /private/tmp/OutlookFontPoke-master).

• Created a policy in Jamf that:

• Extracts the current logged-in user

• Fixes permissions

• Run the command as that user: sudo -u "$loggedInUser" /private/tmp/OutlookFontPoke-master/OutlookFontPoke 'Book Antique' '11.0pt' 'black'

 

Issue: Despite several variations of the above, I keep getting this error in the script logs:

WARNING: Registry DOES NOT exist at path /Library/Group Containers/UBF8T346G9.Office/MicrosoftRegistrationDB.reg. Attempting to create...

mkdir: USER/Library/Group Containers: No such file or directory

cp: /private/tmp/outlookfont/TemplateRegDB.reg: No such file or directory

ERROR: Registry could not be created.

Quitting Microsoft Outlook...

Outlook has quit.

Re-launching Microsoft Outlook...

 

What I’ve checked:

• The font Book Antique is available and installed system-wide.

• Tried different versions of the script and variations on paths.

• Ensured the app is fully quit and relaunched during the process.

 

Question: Has anyone successfully set a default Outlook font on macOS using Jamf Pro?

Is there an alternate method (other than OutlookFontPoke) that works in 2025?

Any ideas, workarounds, or insights would be appreciated.

 

Thanks in advance!

just off the top of mat head my recommendation would be to set the default font, and then go and look at the various .plist files that outlook creates when you do that. after you locate the proper preference domain and keys that select the correct font, you could be a managed app schema to have jamf set the font setting for outlook and then that setting, would be stuck that way.

 

you can use the managed app schema builder to assist in building the config.

 

https://github.com/BIG-RAT/Managed-App-Schema-Builder

 

then config in jamf. config profiles>Application & Custom Settings>Ext Apps>Custom Schema.

 

scope as necessary

 

hope that helps 


@mschlosser Thanks! I appreciate the suggestion about using .plist inspection and managed app schemas.

We’ve looked into this method before, setting the default font manually, then inspecting the .plist files Outlook generates (likely under ~/Library/Group Containers/UBF8T346G9.Office), hoping to identify the preference domain and keys for font settings.

However, we ran into a blocker:

Those .plist files appear to contain user-specific info, including credentials or auth tokens. That makes it tricky (and potentially insecure) to just grab the file and deploy it via Jamf.

I haven’t yet tried building a managed app schema, so that might be worth revisiting, assuming the font settings are separated from anything sensitive in the actual preference domain.

Before I go down that rabbit hole again:

Has anyone identified the exact domain/key combo that controls default font settings in Outlook for Mac? (for example, something like com.microsoft.Outlook, or within the Office container domain)

Any confirmed working examples with Custom Settings > Ext Apps > Custom Schema in Jamf would be amazing.

Thanks again!


I see, that is a good point, i was just thinking of this problem and figured you may be able to do it with a simple defaults command as long as you can identify the pref domain and the key, below is a script, that i worked up, thinking about the theory of the problem:

#!/bin/zsh --no-rcs

#!/bin/zsh --no-rcs
currentUser=$(echo "show State:/Users/ConsoleUser" | scutil \
| awk '/Name :/ && !/loginwindow/ {print $3}')
uid=$(id -u "$currentUser")

# --- helper: run *anything* in that user’s context
runAsUser() {
if f -n "$currentUser" && "$currentUser" != "loginwindow" ]]; then
launchctl asuser "$uid" sudo -u "$currentUser" "$@"
else
echo "No interactive user – aborting" >&2
exit 1
fi
}

# ----------- example: capture a defaults value -----------
comtorun=$(runAsUser defaults read com.apple.finder ShowStatusBar)

echo ${comtorun}

the script does the following:

 

identifies the current user,

any command you enter in the $comtorun variable, runs as the current user, so it should be able to effect user preferences; should just need to identify the preference domain that contains the font and a defaults write instead of read. the script also prints the value that was captured just for debug.

 

as far as a brief overview of managed app schema builder, add the app title and the pre domain, keys can be added on the right; as you are adding keys, values can be added based off the key type, if you select a ‘from list’ option,  As I understand it, the list of options box, sets how the selectable options appear in JAMF, the associated list of values must match the values in the actual plist. after uploading it will create a menu, allow you to easily set options. 

all that said given what you are trying ot do, defaults write runAsUser may be more straightforward. 

 

hope that helps.


@mschlosser Thank you! 

I’ve tried different methods, and now there’s more confusion than before. 

  1. Config Profile/Payload, however, this worked on a test device, but also didn’t work on another one.
    <?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">
    <plist version="1.0">
    <dict>
    <key>PayloadContent</key>
    <array>
    <dict>
    <key>PayloadType</key>
    <string>com.microsoft.Outlook</string>
    <key>PayloadVersion</key>
    <integer>1</integer>
    <key>PayloadIdentifier</key>
    <string>com.example.outlook.fontsettings</string>
    <key>PayloadUUID</key>
    <string>24e9d9e8-6d3e-4e0f-ac2f-6f086f0a2eee</string>
    <key>PayloadEnabled</key>
    <true/>
    <key>PayloadDisplayName</key>
    <string>Outlook Custom Settings</string>
    <key>UserPreference_RoosterEditorPreference.Compose.FontName</key>
    <string>Book Antique</string>
    <key>UserPreference_RoosterEditorPreference.Compose.FontSize</key>
    <integer>11</integer>
    <key>UserPreference_RoosterEditorPreference.Compose.TextColor</key>
    <string>#000000</string>
    </dict>
    </array>
    <key>PayloadDisplayName</key>
    <string>Set Default Outlook Font</string>
    <key>PayloadIdentifier</key>
    <string>com.example.outlook.font</string>
    <key>PayloadRemovalDisallowed</key>
    <false/>
    <key>PayloadType</key>
    <string>Configuration</string>
    <key>PayloadUUID</key>
    <string>3e0114fd-c601-43d5-ae20-c405b2dc9433</string>
    <key>PayloadVersion</key>
    <integer>1</integer>
    </dict>
    </plist>
    1. A script, this seems to work, but the same as the above.. 50/50 
      It does set the default font on the logs, but in Outlook it doesn’t
      #!/bin/zsh --no-rcs

      echo "Starting Outlook font preference script..."

      # Get currently logged-in user (excluding loginwindow)
      echo "Detecting logged-in user..."
      currentUser=$(/usr/sbin/scutil <<< "show State:/Users/ConsoleUser" | /usr/bin/awk '/Name :/ && !/loginwindow/ { print $3 }')

      if )< -z "$currentUser" || "$currentUser" == "loginwindow" ]]; then
      echo "No interactive user detected. Exiting."
      exit 1
      else
      echo "Logged-in user: $currentUser"
      fi

      # Get the user's UID
      uid=$(id -u "$currentUser")
      echo "UID for $currentUser is $uid"

      # Get home directory (fixed method)
      echo "Locating home directory..."
      homeDir=$(dscl . -read /Users/"$currentUser" NFSHomeDirectory | awk '{print $2}')

      if )< -z "$homeDir" ]]; then
      echo "Failed to find home directory. Exiting."
      exit 1
      else
      echo "Home directory: $homeDir"
      fi

      # Define Outlook plist path
      plistPath="$homeDir/Library/Containers/com.microsoft.Outlook/Data/Library/Preferences/com.microsoft.Outlook.plist"
      echo "Target Outlook plist: $plistPath"

      # Define runAsUser function
      runAsUser() {
      if ) -n "$currentUser" && "$currentUser" != "loginwindow" ]]; then
      launchctl asuser "$uid" sudo -u "$currentUser" "$@"
      else
      echo "No interactive user context — aborting runAsUser." >&2
      exit 1
      fi
      }

      # Quit Outlook before applying changes
      echo "Closing Microsoft Outlook if running..."
      runAsUser pkill -x "Microsoft Outlook"
      sleep 2

      # Apply font preferences
      echo "Writing font preferences..."

      runAsUser defaults write "$plistPath" UserPreference_RoosterEditorPreference.Compose.FontName -string "Book Antique" \
      && echo "FontName set" || echo "Failed to set FontName"

      runAsUser defaults write "$plistPath" UserPreference_RoosterEditorPreference.Compose.FontSize -float 11.0 \
      && echo "FontSize set" || echo "Failed to set FontSize"

      runAsUser defaults write "$plistPath" UserPreference_RoosterEditorPreference.Compose.TextColor -string "#000000" \
      && echo "TextColor set" || echo "Failed to set TextColor"

      # Reopen Outlook
      echo "Reopening Microsoft Outlook..."
      runAsUser open -a "Microsoft Outlook"

      echo "Script completed for user: $currentUser"

       


hmmmm, both the script and the profile look good to me. I'll be curious to hear what others have to say. assuming the prefs domain and keys that you reference are correct. all that said are there any differences between the test machine where it works and the actual targets, where issues arise?


Quick update: the results are inconsistent. 
On some test devices, it worked, but on others, it didn’t. 

Here’s the plist: 

<?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">
<plist version="1.0">
<dict>
<key>DefaultPreviewFontName</key>
<string>Book Antiqua</string>
<key>UserPreference_RoosterEditorPreference.Compose.FontName</key>
<string>Book Antiqua</string>
<key>UserPreference_RoosterEditorPreference.Compose.FontSize</key>
<integer>11</integer>
<key>UserPreference_RoosterEditorPreference.Compose.TextColor</key>
<string>#000000</string>
<key>UserPreference_RoosterEditorPreference.Reply.FontName</key>
<string>Book Antiqua</string>
<key>UserPreference_RoosterEditorPreference.Reply.FontSize</key>
<integer>11</integer>
<key>UserPreference_RoosterEditorPreference.Reply.TextColor</key>
<string>#000000</string>
</dict>
</plist>


 


Sorry to hear that. Are there any easily discernible differences, between machines where it does own, verses machines where it does not? i.e. versions go outlook, builds of the operating system, etc. Unfortunately it could just be that Microsoft does not intend for that to be an enforceable setting. 


Unfortunately, no.. all devices are on macOS 15.6 and also the latest version of Outlook (16.99).
Most probably, the issue is related strictly to Microsoft, and for now, there’s nothing else we can try.