Skip to main content
Question

Microsoft Outlook Default Font — Set via Jamf Pro?

  • August 6, 2025
  • 13 replies
  • 584 views

Forum|alt.badge.img+2

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!

13 replies

Forum|alt.badge.img+11
  • Contributor
  • August 6, 2025

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 


Forum|alt.badge.img+2
  • Author
  • New Contributor
  • August 6, 2025

@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!


Forum|alt.badge.img+11
  • Contributor
  • August 6, 2025

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 [[ -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.


Forum|alt.badge.img+2
  • Author
  • New Contributor
  • August 8, 2025

@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"

       


Forum|alt.badge.img+11
  • Contributor
  • August 8, 2025

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?


Forum|alt.badge.img+2
  • Author
  • New Contributor
  • August 12, 2025

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>


 


Forum|alt.badge.img+11
  • Contributor
  • August 12, 2025

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. 


Forum|alt.badge.img+2
  • Author
  • New Contributor
  • August 13, 2025

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.


Bretterson
Forum|alt.badge.img+4
  • New Contributor
  • April 2, 2026

I don’t even want to know how much time I’m wasted trying to do this. In the past I was able to get it working using that Paul Bowden script (though I modified it a little to retrieve the reg file), but ONLY if it was run after the user’s profile had been created in Outlook. You said it’s been 50/50 in your testing, any chance the instances where it has worked match my experience?

For some reason I decided to give it another shot and it seems like the info isn’t stored in MicrosoftRegistrationDB.reg anymore, but I could be wrong. It does appear to be saved in the plist buried in that Containers folder now. One thing I noticed in there is there are three keys for the compose preferences and three for the reply preferences... you’re only setting the compose prefs but somehow your sample plist has values for both (I’m not great at scripting but that doesn’t seem right).

I’ll see if I can get anywhere with that plist tomorrow and let you know.


Bretterson
Forum|alt.badge.img+4
  • New Contributor
  • April 3, 2026

I just tried it and it worked. I added the three reply keys to your script and reset Outlook using the tool at https://office-reset.com/. I’ll try again next week with a completely fresh macOS account.


avagrace
Forum|alt.badge.img
  • New Contributor
  • April 4, 2026

Setting the default font in Outlook for Mac is notoriously tricky because it’s stored in a binary registry database (MicrosoftRegistrationDB.reg) rather than a standard .plist file.

The error you’re seeing (mkdir: USER/Library/Group Containers: No such file or directory) usually happens because the script variable for the user's library path isn't resolving correctly when running through the Jamf agent.

Here are a few ways to fix this or bypass it entirely:

1. Fix the Pathing in your Script
The error suggests your script is literally trying to find a folder named USER instead of the actual username. Ensure your script defines the home directory properly. Instead of hardcoding paths, try:

Bash
# Get the logged in user and their home directory
loggedInUser=$(stat -f%Su /dev/console)
userHome=$(dscl . read /Users/"$loggedInUser" NFSHomeDirectory | awk '{print $2}')

# Then use the variable in your command
sudo -u "$loggedInUser" /private/tmp/OutlookFontPoke-master/OutlookFontPoke 'Book Antique' '11.0pt' 'black'


2. Check Permissions (TCC)
Starting with macOS 13/14, the Jamf binary needs Full Disk Access to touch files inside ~/Library/Group Containers. Even if you run as the user, the management process might be getting blocked.

Ensure your Jamf Management Framework has a Privacy Preferences Policy Control (PPPC) profile allowing Full Disk Access.

3. The "Template" Method (Alternative to FontPoke)
If FontPoke continues to fail, many admins use the "Golden Master" approach:

Set the font manually on a test Mac.

Grab the MicrosoftRegistrationDB.reg file from ~/Library/Group Containers/UBF8T346G9.Office/.

Package this file using Composer.

Deploy it to the same location on target Macs.

Warning: This method can be risky because that registry file also contains other user-specific settings. Only do this if you are deploying to fresh installs or don't mind overwriting other Outlook preferences.

4. Use App-Specific Configuration
Check if you can use a Managed App Configuration if you are using Outlook "New Experience." While Microsoft hasn't made font selection a simple key-value pair in a standard .plist yet, they are moving more settings toward the com.microsoft.Outlook domain.

Recommendation: Stick with OutlookFontPoke, but wrap it in a cleaner script that explicitly defines the user's path and verify that the files actually landed in /private/tmp/ before the script runs. Sometimes Jamf deletes tmp contents faster than the policy can execute. Moving your payload to /usr/local/bin/ is often more reliable.


Bretterson
Forum|alt.badge.img+4
  • New Contributor
  • April 6, 2026

I just tried it and it worked. I added the three reply keys to your script and reset Outlook using the tool at https://office-reset.com/. I’ll try again next week with a completely fresh macOS account.

Gave it another try with this same config on a fresh computer setup and it worked again!


Bretterson
Forum|alt.badge.img+4
  • New Contributor
  • April 6, 2026

@WhoisLucian I played with it a bit more and it seems like this is working for me:

#!/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 - commented out due to running during initial login w/ Baseline
# 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 "$4" \
&& echo "FontName set" || echo "Failed to set FontName"

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

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

runAsUser defaults write "$plistPath" UserPreference_RoosterEditorPreference.Reply.FontName -string "$4" \
&& echo "FontName set" || echo "Failed to set FontName"

runAsUser defaults write "$plistPath" UserPreference_RoosterEditorPreference.Reply.FontSize -integer "$5" \
&& echo "FontSize set" || echo "Failed to set FontSize"

runAsUser defaults write "$plistPath" UserPreference_RoosterEditorPreference.Reply.TextColor -string "$6" \
&& echo "TextColor set" || echo "Failed to set TextColor"

# Reopen Outlook - commented out due to running during initial login w/ Baseline
# echo "Reopening Microsoft Outlook..."
# runAsUser open -a "Microsoft Outlook"

echo "Script completed for user: $currentUser"

A few changes I made:

  • I commented out the sections to quit and reopen Outlook because I’m running it as part of the setup when the user initially logs in.
  • I replaced the actual settings with Jamf variables so you can set them in the policy.
  • I added the three reply keys.
  • I’m not familiar with float, but I noticed when I was using that it would label the value as <real>, which wasn’t working. I wanted to see what was actually supposed to be there so I deleted the plist and let Outlook recreate it. It was created with <integer>, so I changed that in the script.

Another note… e​​​ven though it’ll let you select larger sizes in the GUI, it seems to have some kind of ability to limit setting the value outside the range 8-14pt (might’ve been 13) externally. I have no idea how or why that’s happening, but it kept setting the size to 8 every time I tried to set it to any value outside that range.