Skip to content

Commit 17533e7

Browse files
authored
Merge pull request #1972 from WillemZeiler/improve/add-link-ootb
Refactor existing "Compare roles"-script and update readme to link to OOTB functionality
2 parents 4b43ae4 + 5b77fbf commit 17533e7

File tree

2 files changed

+95
-49
lines changed

2 files changed

+95
-49
lines changed
Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,25 @@
11
# Compare Roles of Two Users
2+
23
Provide the usernames of two users and this script will print out the roles they share and the roles they don't share.
34

4-
## Usage
5-
Run script in **compare-roles-2-users.js** in Scripts - Background
5+
> ⚠️ **Note:** ServiceNow provides out-of-the-box functionality for comparing user access via the **Access Analyzer** . You can learn more here: https://www.servicenow.com/docs/bundle/zurich-platform-security/page/integrate/identity/task/comparing-access-controlss**
6+
>
7+
**Parameters:**
8+
- **includeInheritedRoles:**
9+
- `false` – only directly assigned roles
10+
- `true` – include roles inherited from other roles or groups
11+
12+
- **usernameA**
13+
- Username of a `sys_user`
14+
15+
- **usernameB**
16+
- Username of a `sys_user`
17+
18+
The script will output:
19+
- Roles exclusive to user A
20+
- Roles exclusive to user B
21+
- Shared roles
622

7-
* **Parameters:**
8-
- **include_inherited_roles:**
9-
- False - only directly assigned roles
10-
- True - roles inherited from other roles or groups
11-
- **username_a:** Unsername of a sys_user
12-
- **username_b:** Unsername of a sys_user
1323

1424
## Example Result
1525
![compare-roles](example-output.PNG)
Lines changed: 77 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,79 @@
1-
(function(){
2-
3-
// false - only directly assigned roles
4-
// true - roles inherited from other roles or groups
5-
var include_inherited_roles = false;
6-
7-
// Username of the two users we want to compare roles agaist
8-
var username_a = "abel.tuter";
9-
var username_b = "abraham.lincoln";
1+
(function() {
2+
// Configuration: Set to true to include inherited roles, false for directly assigned roles only
3+
var includeInheritedRoles = false;
104

11-
var set_a = [];
12-
var set_b = [];
13-
14-
// Query for user A's roles
15-
var gr_user_a = new GlideRecord("sys_user_has_role");
16-
gr_user_a.addQuery("user.user_name", username_a);
17-
if(!include_inherited_roles)
18-
gr_user_a.addQuery("inherited", false);
19-
gr_user_a.addQuery("state","active");
20-
gr_user_a.query();
21-
while(gr_user_a.next())
22-
set_a.push(gr_user_a.role.name.toString());
23-
24-
25-
// Query for user B's roles
26-
var gr_user_b = new GlideRecord("sys_user_has_role");
27-
gr_user_b.addQuery("user.user_name", username_b);
28-
if(!include_inherited_roles)
29-
gr_user_b.addQuery("inherited", false);
30-
gr_user_b.addQuery("state","active");
31-
gr_user_b.query();
32-
while(gr_user_b.next())
33-
set_b.push(gr_user_b.role.name.toString());
34-
35-
// Roles that A has that B does not have
36-
var a_not_b = set_a.concat(set_b).filter( function(value, index, self){return set_b.indexOf(value) < 0;} );
37-
// Roles that B has that A does not have
38-
var b_not_a = set_a.concat(set_b).filter( function(value, index, self){return set_a.indexOf(value) < 0;} );
39-
// Roles that both A and B have
40-
var a_intersect_b = set_a.concat(set_b).filter( function(value, index, self){return set_b.indexOf(value) >= 0 && set_a.indexOf(value) >= 0;} ).filter(function(value, index, self){return self.indexOf(value) === index;});
41-
42-
gs.print("\n-Exclusive Role(s) to " + username_a + ":\n\t" + a_not_b.join("\n\t") + "\n\n-Exclusive Role(s) to " + username_b + ":\n\t" + b_not_a.join("\n\t") + "\n\n-Shared Roles:\n\t" + a_intersect_b.join("\n\t"));
5+
// Usernames to compare replace abel.tuter and abraham.lincoln with the user names you want to compare
6+
var usernameA = "abel.tuter";
7+
var usernameB = "abraham.lincoln";
8+
9+
/**
10+
* Fetch active roles for a given user.
11+
* @param {string} username - The username to query roles for.
12+
* @param {boolean} includeInherited - Whether to include inherited roles.
13+
* @returns {Array} - Array of unique role names.
14+
*/
15+
function getUserRoles(username, includeInherited) {
16+
var roles = [];
17+
var gr = new GlideRecord("sys_user_has_role");
18+
gr.addQuery("user.user_name", username);
19+
if (!includeInherited) {
20+
gr.addQuery("inherited", false);
21+
}
22+
gr.addQuery("state", "active");
23+
gr.query();
24+
while (gr.next()) {
25+
var roleName = gr.role.name.toString();
26+
// Ensure uniqueness
27+
if (roles.indexOf(roleName) === -1) {
28+
roles.push(roleName);
29+
}
30+
}
31+
return roles;
32+
}
33+
34+
/**
35+
* Get items in list1 that are not in list2.
36+
* @param {Array} list1
37+
* @param {Array} list2
38+
* @returns {Array}
39+
*/
40+
function difference(list1, list2) {
41+
var result = [];
42+
for (var i = 0; i < list1.length; i++) {
43+
if (list2.indexOf(list1[i]) === -1) {
44+
result.push(list1[i]);
45+
}
46+
}
47+
return result;
48+
}
49+
50+
/**
51+
* Get items that exist in both lists.
52+
* @param {Array} list1
53+
* @param {Array} list2
54+
* @returns {Array}
55+
*/
56+
function intersection(list1, list2) {
57+
var result = [];
58+
for (var i = 0; i < list1.length; i++) {
59+
if (list2.indexOf(list1[i]) !== -1 && result.indexOf(list1[i]) === -1) {
60+
result.push(list1[i]);
61+
}
62+
}
63+
return result;
64+
}
65+
66+
// Fetch roles for both users
67+
var rolesUserA = getUserRoles(usernameA, includeInheritedRoles);
68+
var rolesUserB = getUserRoles(usernameB, includeInheritedRoles);
69+
70+
// Compare roles
71+
var exclusiveToA = difference(rolesUserA, rolesUserB);
72+
var exclusiveToB = difference(rolesUserB, rolesUserA);
73+
var sharedRoles = intersection(rolesUserA, rolesUserB);
74+
75+
// Output results
76+
gs.info("\nExclusive Role(s) to " + usernameA + ":\n\t" + exclusiveToA.join("\n\t"));
77+
gs.info("\nExclusive Role(s) to " + usernameB + ":\n\t" + exclusiveToB.join("\n\t"));
78+
gs.info("\nShared Role(s):\n\t" + sharedRoles.join("\n\t"));
4379
})();

0 commit comments

Comments
 (0)