From 566adf741ce6d39f934e6b3bfdfb7b1411e07368 Mon Sep 17 00:00:00 2001 From: Gangadhar Ravi Bandaru Date: Sun, 12 Oct 2025 19:58:50 -0400 Subject: [PATCH 1/2] Create cloneUserGroups.js Added new Background script to copy groups from one user to another user --- .../Clone User Groups/cloneUserGroups.js | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 Server-Side Components/Background Scripts/Clone User Groups/cloneUserGroups.js diff --git a/Server-Side Components/Background Scripts/Clone User Groups/cloneUserGroups.js b/Server-Side Components/Background Scripts/Clone User Groups/cloneUserGroups.js new file mode 100644 index 0000000000..6bc62b489b --- /dev/null +++ b/Server-Side Components/Background Scripts/Clone User Groups/cloneUserGroups.js @@ -0,0 +1,53 @@ + // Replace with the sys_ids of the users + var sourceUserSysId = 'SOURCE_USER_SYS_ID'; // Copy groups from this user + var targetUserSysId = 'TARGET_USER_SYS_ID'; // Copy groups to this user + + // Validate both users exist + var sourceUser = new GlideRecord('sys_user'); + if (!sourceUser.get(sourceUserSysId)) { + gs.error('Source user not found: ' + sourceUserSysId); + return; + } + + var targetUser = new GlideRecord('sys_user'); + if (!targetUser.get(targetUserSysId)) { + gs.error('Target user not found: ' + targetUserSysId); + return; + } + + gs.info('Cloning group memberships from ' + sourceUser.name + ' to ' + targetUser.name); + + var addedCount = 0; + var skippedCount = 0; + + var srcGroups = new GlideRecord('sys_user_grmember'); + srcGroups.addQuery('user', sourceUserSysId); + srcGroups.query(); + + while (srcGroups.next()) { + var groupId = srcGroups.group.toString(); + + // Check if target user is already in the group + var existing = new GlideRecord('sys_user_grmember'); + existing.addQuery('user', targetUserSysId); + existing.addQuery('group', groupId); + existing.query(); + + if (existing.next()) { + skippedCount++; + gs.info('Skipped: ' + targetUser.name + ' is already a member of group ' + srcGroups.group.name); + continue; + } + + // Add target user to the group + var newMember = new GlideRecord('sys_user_grmember'); + newMember.initialize(); + newMember.user = targetUserSysId; + newMember.group = groupId; + newMember.insert(); + + gs.info('Added ' + targetUser.name + ' to group ' + srcGroups.group.name); + addedCount++; + } + + gs.info('Group cloning complete. ' + addedCount + ' groups added, ' + skippedCount + ' skipped.'); From 30f57f1cb95ad9d43b15d84c2ede7f64ebe85784 Mon Sep 17 00:00:00 2001 From: Gangadhar Ravi Bandaru Date: Sun, 12 Oct 2025 20:00:13 -0400 Subject: [PATCH 2/2] Create readme.md adding readme file for new background script. --- .../Background Scripts/Clone User Groups/readme.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 Server-Side Components/Background Scripts/Clone User Groups/readme.md diff --git a/Server-Side Components/Background Scripts/Clone User Groups/readme.md b/Server-Side Components/Background Scripts/Clone User Groups/readme.md new file mode 100644 index 0000000000..b87efe067f --- /dev/null +++ b/Server-Side Components/Background Scripts/Clone User Groups/readme.md @@ -0,0 +1 @@ +This ServiceNow Background Script copies all group memberships from one user to another. It checks for duplicates and logs all actions.