@dyoung's suggestion works to report the image assigned to the ITM itself and is true when the button only contains a single ITM (or is the first assigned to a button) and the button's Icon has not been changed with the Set Icon option @steven.williams.as showed.

 

 

Thanks for pointing out this internal method because I had the same question today. It does work, returning the button's true icon path! The method "internal unsafe string GetImagePath()" can be used like this:

 

using Autodesk.Fabrication.DB;
using System;
using System.Reflection;

namespace MyNamespace
{
    public static class Methods
    {
        public static void GetIconPaths()
        {
            foreach (ServiceTemplate serviceTemplate in Autodesk.Fabrication.DB.Database.ServiceTemplates)
            {
                foreach (ServiceTab serviceTab in serviceTemplate.ServiceTabs)
                {
                    foreach (ServiceButton serviceButton in serviceTab.ServiceButtons)
                    {
                        Type buttonType = serviceButton.GetType();
                        MethodInfo methodInfo = buttonType.GetMethod("GetImagePath", BindingFlags.NonPublic | BindingFlags.Instance);
                        string iconPath = methodInfo.Invoke(serviceButton, null) as string;
                        //Do stuff here
                    }
                }
            }
        }
    }
}


Edit: I forgot to mention that unfortunately I haven't found a way to set this property but maybe you can do it by modifying the items in the button and selecting the one with the image you want first. Or setting all of them to the same image with @dyoung's method, if that doesn't affect other buttons.