Skip to content

Commit 69c730d

Browse files
Role Usage Analyzer (#2304)
* Create README.md * Create code.js
1 parent 7ac7122 commit 69c730d

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Role Usage Analyzer for ServiceNow
2+
3+
## Overview
4+
5+
This script analyzes role assignments in your ServiceNow instance and identifies roles that are assigned to users but appear to be unused. It cross-references user activity logs to determine whether assigned roles are actively used.
6+
7+
## Features
8+
9+
- Scans all roles assigned to users
10+
- Checks user activity via `sys_history_line` to infer role usage
11+
- Flags roles that are assigned but show no signs of usage
12+
- Logs unused roles and the number of users assigned to them
13+
14+
## Usage
15+
16+
1. Navigate to **System Definition > Scheduled Jobs**.
17+
2. Create a new Script Include or Scheduled Job named `Role_Usage_Analyzer`.
18+
3. Paste the contents of `Role_Usage_Analyzer.js` into the script field.
19+
4. Run the script manually or schedule it to run periodically (e.g., weekly or monthly).
20+
21+
## Notes
22+
23+
- This script uses `sys_history_line` to infer user activity. For more accurate results, consider integrating with login logs or audit tables if available.
24+
- You can extend the script to automatically notify administrators or generate reports.
25+
- Roles used only in background scripts or integrations may not show up in history logs — manual review is recommended.
26+
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
2+
// Role Usage Analyzer Script
3+
// Description: Identifies roles assigned to users that may be unused.
4+
5+
var roleUsageMap = {};
6+
var grUserRole = new GlideRecord('sys_user_has_role');
7+
grUserRole.query();
8+
9+
while (grUserRole.next()) {
10+
var userId = grUserRole.user.toString();
11+
var roleId = grUserRole.role.toString();
12+
13+
if (!roleUsageMap[roleId]) {
14+
roleUsageMap[roleId] = {
15+
users: [],
16+
used: false
17+
};
18+
}
19+
20+
roleUsageMap[roleId].users.push(userId);
21+
}
22+
23+
var grHistory = new GlideRecord('sys_history_line');
24+
grHistory.addQuery('user', 'ISNOTEMPTY');
25+
grHistory.query();
26+
27+
while (grHistory.next()) {
28+
var userId = grHistory.user.toString();
29+
for (var roleId in roleUsageMap) {
30+
if (roleUsageMap[roleId].users.indexOf(userId) !== -1) {
31+
roleUsageMap[roleId].used = true;
32+
}
33+
}
34+
}
35+
36+
for (var roleId in roleUsageMap) {
37+
if (!roleUsageMap[roleId].used) {
38+
var grRole = new GlideRecord('sys_user_role');
39+
if (grRole.get(roleId)) {
40+
gs.info('[Role Usage Analyzer] Unused Role: ' + grRole.name + ' | Assigned to Users: ' + roleUsageMap[roleId].users.length);
41+
}
42+
}
43+
}

0 commit comments

Comments
 (0)