Forum Discussion

corbin_mccumber_donaldson_com's avatar
5 months ago
Solved

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

2 Replies

  • Maksym, 

    We currently use a "batch loader" to load the ID's to a matrix (the matrix is what holds the identity groups).

    However due to some changes in org, the names of the "id's", have changes. I am looking to use a batch loader script in order to "delete" those ID's from a "data file". Please advise the correct way to proceed to handle this situation. as I have identified the "source ID's" for the "ID's" that have "empty groups". I must admit my aml language is very "new", so any help or guidance to the correct format of the .bat script would be greatly appreciated. 

  • 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