Batch Delete Identity Memberships
Hello,
We have used the batchloader utility to create new memberships in Innovator. It appears that removals are a bit more difficult due to safeguards in place for the system. What is an easy path forward in creating an AML script (or method) to accomplish this task? For example, we have 89 identities that had incorrect identity membership assignments. The goal is to remove existing memberships of an identity and add a different identity.
--Corbin
Hi Corbin,
I've recently had a task to synchronize identitiy assignments between two environments. Unfortunately I haven't found the easier way than to write a simple script (basically it was a .net console app). Here is the classes I've written.
using Aras.IOM; namespace PLM_Utilities.Identities { public class Identity { public string Id { get; private set; } public string KeyedName { get; private set; } public List<Member> Members { get; private set; } = new List<Member>(); // Constructor that builds Identity object from AML item public Identity(Item identityItem, Innovator inn) { Id = identityItem.getID(); KeyedName = identityItem.getProperty("keyed_name"); LoadMembers(identityItem); } private void LoadMembers(Item identityItem) { var members = identityItem.getRelationships(); for (int j = 0; j < members.getItemCount(); j++) { var memRelItem = members.getItemByIndex(j); var memberItem = memRelItem.getRelatedItem(); var member = new Member { RelationID = memRelItem.getID(), Id = memberItem.getID(), KeyedName = memberItem.getProperty("keyed_name") }; Members.Add(member); } } public bool SyncMemberWithOtherIdentity(Innovator inn, Identity identity) { foreach (var member in Members) { RemoveMember(inn, member.RelationID); } foreach (var member in identity.Members) { AddMember(inn, Id, member.KeyedName); } return true; } private void RemoveMember(Innovator inn, string memberId) { var aml = $@"<AML><Item type='Member' id='{memberId}' action='delete'/></AML>"; inn.applyAML(aml); } private void AddMember(Innovator inn, string identityId, string memberName) { Console.WriteLine(memberName); var aml = $@"<AML><Item type='Member' action='add'> <source_id>{identityId}</source_id> <related_id> <Item type='Identity' action='get'> <keyed_name>{System.Security.SecurityElement.Escape(memberName)}</keyed_name> </Item> </related_id> </Item></AML>"; inn.applyAML(aml); } } public class Member { public string Id { get; set; } public string RelationID { get; set; } public string KeyedName { get; set; } } }Hopefully it will help you to get the idea
Best regards, Maksym Archybasov