Notifications
Announcements
No record found.
using Microsoft.Dynamics.AX.Metadata.MetaModel; class AOTFind { public static void main(Args _args) { str rootName = "SystemAdministration"; AxMenu sysAdminMenu = Microsoft.Dynamics.Ax.Xpp.MetadataSupport::GetMenu(rootName); if (sysAdminMenu) { AOTFind explorer = new AOTFind(); info(strFmt("Starting traversal of: %1", rootName)); explorer.traverseElements(sysAdminMenu.Elements.getEnumerator()); } else { error(strFmt("Menu '%1' not found in AOT.", rootName)); } } private void traverseElements(System.Collections.IEnumerator _enumerator) { while (_enumerator.MoveNext()) { AxMenuElement element = _enumerator.Current; if (element is AxMenuElementSubMenu) { AxMenuElementSubMenu subMenu = element as AxMenuElementSubMenu; info(strFmt("Folder: %1", subMenu.Name)); this.traverseElements(subMenu.Elements.getEnumerator()); } else if (element is AxMenuElementMenuItem) { AxMenuElementMenuItem menuItemRef = element as AxMenuElementMenuItem; this.processMenuItem(menuItemRef); } } } private void processMenuItem(AxMenuElementMenuItem _ref) { info(strFmt(" - Item: %1 (%2)", _ref.MenuItemName, _ref.MenuItemType)); } }
using Microsoft.Dynamics.AX.Metadata.MetaModel; using Microsoft.Dynamics.ApplicationPlatform.Environment; using Microsoft.Dynamics.AX.Metadata.Storage; using Microsoft.Dynamics.AX.Metadata.Storage.Runtime; using Microsoft.Dynamics.AX.Security; using Microsoft.Dynamics.AX.Security.Management.Domain; class AOTFind { public static void main(Args _args) { // Set root to the System Administration module menu str rootName = "SystemAdministration"; AxMenu sysAdminMenu = Microsoft.Dynamics.Ax.Xpp.MetadataSupport::GetMenu(rootName); if (sysAdminMenu) { AOTFind explorer = new AOTFind(); info(strFmt("Starting traversal of: %1", rootName)); // Begin recursion explorer.traverseElements(sysAdminMenu.Elements.getEnumerator()); } else { error(strFmt("Menu '%1' not found in AOT.", rootName)); } } private void traverseElements(System.Collections.IEnumerator _enumerator) { while (_enumerator.MoveNext()) { AxMenuElement element = _enumerator.Current; if (element is AxMenuElementSubMenu) { AxMenuElementSubMenu subMenu = element as AxMenuElementSubMenu; //info(strFmt("Folder: %1", subMenu.Name)); // Recurse into the sub-menu's elements this.traverseElements(subMenu.Elements.getEnumerator()); } else if (element is AxMenuElementMenuItem) { AxMenuElementMenuItem menuItemRef = element as AxMenuElementMenuItem; if(menuItemRef.MenuItemName=='SysUserInfoPage') { this.processMenuItem(menuItemRef); } } } } private void processMenuItem(AxMenuElementMenuItem _ref) { str targetMenuItem = _ref.ToString(); // Your menu item name here var securityRepository = SysSecurity::GetSecurityRepository(); var privilegesRepo = securityRepository.Privileges; var privEnumerator = privilegesRepo.LoadAll().GetEnumerator(); info(strFmt("Searching for privileges linked to: %1", targetMenuItem)); while (privEnumerator.MoveNext()) { Privilege privilege = privEnumerator.Current; if(privilege.ToString() == 'SysUserInfoMaintain') { if (AOTFind::hasMenuItemAccess(privilege, targetMenuItem)) { info(strFmt("Match Found: %1", privilege.Name)); } } } // Safe access to MenuItemName and Type info(strFmt(" - Item: %1 (%2)", _ref.MenuItemName, _ref.MenuItemType)); } private static boolean hasMenuItemAccess(Privilege _privilege, str _menuItemName) { // Check Display Menu Items var displayGrants = _privilege.DisplayMenuItemGrants.GetEnumerator(); while (displayGrants.MoveNext()) { if (displayGrants.Current.Name == _menuItemName) return true; } // Check Action Menu Items var actionGrants = _privilege.ActionMenuItemGrants.GetEnumerator(); while (actionGrants.MoveNext()) { if (actionGrants.Current.Name == _menuItemName) return true; } // Check Output Menu Items var outputGrants = _privilege.OutputMenuItemGrants.GetEnumerator(); while (outputGrants.MoveNext()) { if (outputGrants.Current.Name == _menuItemName) return true; } return false; } }
_ref.ToString() // change to _ref.MenuItemName;
Under review
Thank you for your reply! To ensure a great experience for everyone, your content is awaiting approval by our Community Managers. Please check back later.
As AI tools become more common, we’re introducing a Responsible AI Use…
We are honored to recognize Neeraj Kumar as our Community Spotlight honoree for…
These are the community rock stars!
Stay up to date on forum activity by subscribing.
Martin Dráb 451 Most Valuable Professional
André Arnaud de Cal... 428 Super User 2025 Season 2
BillurSamdancioglu 239 Most Valuable Professional