Notifications
Announcements
using System; using System.Linq; using System.Text; using Microsoft.Dynamics.AX.Metadata.MetaModel; using Microsoft.Dynamics.AX.Metadata.Storage; using Microsoft.Dynamics.AX.Metadata.Storage.Runtime; using System.IO; using System.Collections.Generic; namespace DummyAppForD365FoMetadata { class Program { static void Main(string[] args) { Program program = new Program(); program.Run(); } Microsoft.Dynamics.AX.Metadata.Providers.IMetadataProvider metadataProviderGlobal; StringBuilder strBuildGlobal = new StringBuilder(); Dictionary> menuItemPrivilegesMap = new Dictionary>(); Dictionary> privilegesDutiesMap = new Dictionary>(); void Run() { //string packagesDir = @"K:\AosService\PackagesLocalDirectory"; //var runtimeConfiguration = new RuntimeProviderConfiguration(packagesDir); //var metadataProvider = new MetadataProviderFactory().CreateRuntimeProviderWithExtensions(runtimeConfiguration); var environment = Microsoft.Dynamics.ApplicationPlatform.Environment.EnvironmentFactory.GetApplicationEnvironment(); var runtimeConfiguration = new RuntimeProviderConfiguration(environment.Aos.PackageDirectory); metadataProviderGlobal = new MetadataProviderFactory().CreateRuntimeProviderWithExtensions(runtimeConfiguration); strBuildGlobal.AppendLine("MenuItemPath" "\t" "ConfigKey" "\t" "MenuItemPrivileges" "\t" "Duties"); foreach (String securityPrivilegePkStr in metadataProviderGlobal.SecurityPrivileges.GetPrimaryKeys() ) //foreach (String securityPrivilegePkStr in metadataProviderGlobal.SecurityPrivileges.GetPrimaryKeys().Where(n => n == "CustTableMaintain" //|| n == "CustTableView" || n == "AuditPolicyCaseDetailMaintain")) { var securityPrivilege = metadataProviderGlobal.SecurityPrivileges.Read(securityPrivilegePkStr); foreach(var securityPrivilegeEntryPoints in securityPrivilege.EntryPoints .Where(n => n.ObjectType == Microsoft.Dynamics.AX.Metadata.Core.MetaModel.EntryPointType.MenuItemAction || n.ObjectType == Microsoft.Dynamics.AX.Metadata.Core.MetaModel.EntryPointType.MenuItemDisplay || n.ObjectType == Microsoft.Dynamics.AX.Metadata.Core.MetaModel.EntryPointType.MenuItemOutput)) { String securityPrivilegeEntryPointsMapKey; securityPrivilegeEntryPointsMapKey = securityPrivilegeEntryPoints.ObjectType "_" securityPrivilegeEntryPoints.ObjectName; if (!menuItemPrivilegesMap.ContainsKey(securityPrivilegeEntryPointsMapKey)) { List privileges = new List(); privileges.Add(securityPrivilege.Name); menuItemPrivilegesMap.Add(securityPrivilegeEntryPointsMapKey, privileges); } else { menuItemPrivilegesMap[securityPrivilegeEntryPointsMapKey].Add(securityPrivilege.Name); } } } //foreach (var menuItemItem in menuItemPrivilegesMap) //{ // strBuildGlobal.AppendLine(menuItemItem.Key); // foreach (var securityPrivilegeItem in menuItemItem.Value) // { // strBuildGlobal.AppendLine("\t" securityPrivilegeItem); // } //} //File.WriteAllText("menuItemPrivilegesMap.txt", strBuildGlobal.ToString()); //strBuildGlobal.Clear(); foreach (String securityDutyPkStr in metadataProviderGlobal.SecurityDuties.GetPrimaryKeys()) { var securityDuty = metadataProviderGlobal.SecurityDuties.Read(securityDutyPkStr); foreach (var securityPrivilegeAssignedToDuty in securityDuty.Privileges) { String securityPrivilegeMapKey; securityPrivilegeMapKey = securityPrivilegeAssignedToDuty.Name; if (!privilegesDutiesMap.ContainsKey(securityPrivilegeMapKey)) { List duties = new List(); duties.Add(securityDuty.Name); privilegesDutiesMap.Add(securityPrivilegeMapKey, duties); } else { privilegesDutiesMap[securityPrivilegeMapKey].Add(securityDuty.Name); } } } //foreach (var privilegeItem in privilegesDutiesMap) //{ // strBuildGlobal.AppendLine(privilegeItem.Key); // foreach (var dutyItem in privilegeItem.Value) // { // strBuildGlobal.AppendLine("\t" dutyItem); // } //} //File.WriteAllText("menuItemDutiesMap.txt", strBuildGlobal.ToString()); //strBuildGlobal.Clear(); //foreach (String rootMenuPkStr in metadataProviderGlobal.Menus.GetPrimaryKeys().Where(n => n == "AccountsPayable")) foreach (String rootMenuPkStr in metadataProviderGlobal.Menus.GetPrimaryKeys()) { //strBuild.AppendLine(rootMenuPkStr); //AccountsPayable AxMenu axMenuRoot = metadataProviderGlobal.Menus.Read(rootMenuPkStr); foreach (var item in axMenuRoot.Elements) { GetNodes(rootMenuPkStr, item); } } File.WriteAllText("WriteText.txt", strBuildGlobal.ToString()); //Console.Write("test"); //Console.Read(); } public void GetNodes(String _prefix, AxMenuElement _axMenuElement) { if (_axMenuElement == null) { return; } //if (_axMenuElement is AxMenuElementMenuItem) //{ // //_strBuild.AppendLine(_prefix ">" ((AxMenuElementMenuItem)_axMenuElement).Name); // AppendAxMenuElementMenuItemInfo(_prefix , (AxMenuElementMenuItem)_axMenuElement); //} if (_axMenuElement is AxMenuElementSubMenu) { foreach (var item in ((AxMenuElementSubMenu)_axMenuElement).Elements) { if (item is AxMenuElementSubMenu) { //GetNodes(_prefix ">" item.Name, item); GetNodes(_prefix ">" GetLabel(item.Name, false), item); } else if (item is AxMenuElementMenuItem) { //AppendAxMenuElementMenuItemInfo(_prefix ">" _axMenuElement.Name, (AxMenuElementMenuItem)item); AppendAxMenuElementMenuItemInfo(_prefix ">" GetLabel(_axMenuElement, false), (AxMenuElementMenuItem)item); } } } } private String GetLabel(T _object, Boolean _showSysName) { String labelValue = ""; String nameValue = ""; String retValue = ""; var type = _object.GetType(); if (type.GetProperty("Label") != null) { String label = type.GetProperty("Label").GetValue(_object).ToString(); labelValue = Microsoft.Dynamics.Ax.Xpp.LabelHelper.GetLabel(label); } if (_showSysName && type.GetProperty("Name") != null) { nameValue = type.GetProperty("Name").GetValue(_object).ToString(); } retValue = labelValue (nameValue.Length>0 ? " (" nameValue ")" : ""); return retValue; } private void AppendAxMenuElementMenuItemInfo(String _prefix, AxMenuElementMenuItem _axMenuElementMenuItem) { AxMenuItem resolvedMenuItem = null; String menuItemType = ""; switch (_axMenuElementMenuItem.MenuItemType) { case Microsoft.Dynamics.AX.Metadata.Core.MetaModel.MenuItemType.Display: resolvedMenuItem = metadataProviderGlobal.MenuItemDisplays.Read(_axMenuElementMenuItem.MenuItemName); menuItemType = Enum.GetName(typeof(Microsoft.Dynamics.AX.Metadata.Core.MetaModel.EntryPointType), Microsoft.Dynamics.AX.Metadata.Core.MetaModel.EntryPointType.MenuItemDisplay); break; case Microsoft.Dynamics.AX.Metadata.Core.MetaModel.MenuItemType.Output: resolvedMenuItem = metadataProviderGlobal.MenuItemOutputs.Read(_axMenuElementMenuItem.MenuItemName); menuItemType = Enum.GetName(typeof(Microsoft.Dynamics.AX.Metadata.Core.MetaModel.EntryPointType), Microsoft.Dynamics.AX.Metadata.Core.MetaModel.EntryPointType.MenuItemOutput); break; case Microsoft.Dynamics.AX.Metadata.Core.MetaModel.MenuItemType.Action: resolvedMenuItem = metadataProviderGlobal.MenuItemActions.Read(_axMenuElementMenuItem.MenuItemName); menuItemType = Enum.GetName(typeof(Microsoft.Dynamics.AX.Metadata.Core.MetaModel.EntryPointType), Microsoft.Dynamics.AX.Metadata.Core.MetaModel.EntryPointType.MenuItemAction); break; default: break; } String securityPrivilegeEntryPointsMapKey = menuItemType "_" resolvedMenuItem.Name; StringBuilder formedAppendLineStrBuilder = new StringBuilder(); StringBuilder strBuildSecurityPrivileges = new StringBuilder(); StringBuilder strBuildSecurityDuties = new StringBuilder(); //formedAppendLineStrBuilder.Append(_prefix ">" _axMenuElementMenuItem.Name); formedAppendLineStrBuilder.Append(_prefix ">" GetLabel(resolvedMenuItem, true)); formedAppendLineStrBuilder.Append("\t");//ConfigKey if (resolvedMenuItem.ConfigurationKey.Length > 0) { var configKey = metadataProviderGlobal.ConfigurationKeys.Read(resolvedMenuItem.ConfigurationKey); //formedAppendLineStrBuilder.Append(" (ConfigKey:" configKey.Label ")"); formedAppendLineStrBuilder.Append(GetLabel(configKey, true)); } var duties = new HashSet(); if (menuItemPrivilegesMap.ContainsKey(securityPrivilegeEntryPointsMapKey)) { foreach (var securityPrivilegeItem in menuItemPrivilegesMap[securityPrivilegeEntryPointsMapKey]) { //strBuildGlobal.AppendLine("\t" securityPrivilegeItem); strBuildSecurityPrivileges.Append(strBuildSecurityPrivileges.Length > 0 ? "," : ""); //strBuildSecurityPrivileges.Append(securityPrivilegeItem); var secPrivilege = metadataProviderGlobal.SecurityPrivileges.Read(securityPrivilegeItem); strBuildSecurityPrivileges.Append(GetLabel(secPrivilege, true) ); if (privilegesDutiesMap.ContainsKey(securityPrivilegeItem)) { foreach (var dutyItem in privilegesDutiesMap[securityPrivilegeItem]) { duties.Add(dutyItem); } } } } if (duties.Count > 0) { foreach (var dutyItem in duties) { strBuildSecurityDuties.Append(strBuildSecurityDuties.Length > 0 ? "," : ""); //strBuildSecurityDuties.Append(dutyItem); var secDuty = metadataProviderGlobal.SecurityDuties.Read(dutyItem); strBuildSecurityDuties.Append(GetLabel(secDuty, true)); } } formedAppendLineStrBuilder.Append("\t");//SecurityPrivileges if (strBuildSecurityPrivileges.Length > 0) { //formedAppendLineStrBuilder.Append("(SecurityPrivileges: " strBuildSecurityPrivileges.ToString() ")"); formedAppendLineStrBuilder.Append(strBuildSecurityPrivileges.ToString()); } formedAppendLineStrBuilder.Append("\t");//SecurityDuties if (strBuildSecurityDuties.Length > 0) { //formedAppendLineStrBuilder.Append("(SecurityDuties: " strBuildSecurityDuties.ToString() ")"); formedAppendLineStrBuilder.Append(strBuildSecurityDuties.ToString()); } strBuildGlobal.AppendLine(formedAppendLineStrBuilder.ToString()); } } }