关于 user-provisioning
面向 ServiceNow 管理员、安全管理员和 HR 系统集成团队的用户生命周期管理技能,涵盖账户创建、角色与群组分配、变更、离职和批量操作。内容提供按职能配置的模板,并强调最小权限和停用账户以保留审计记录。
主要功能
- 01创建与更新用户账户
- 02分配角色和群组成员资格
- 03按职能模板配置访问权限
- 04执行离职与批量用户操作
适用场景
- 01为新员工开通账户和访问权限
- 02员工转岗时调整角色与群组
- 03离职时停用账户并撤销访问
- 04批量创建用户或分配群组
MCP 相关
列出用于查询、创建和更新用户、角色及群组记录的 ServiceNow MCP 工具,并说明如何通过批处理和后台脚本执行操作。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ happy-technologies-llc/ happy-platform-skills --skill user-provisioning安装后在 Claude Code 中输入/user-provisioning确认已加载。
详细介绍
用户配置
概述
本技能提供 ServiceNow 用户生命周期管理的全面指导:
- 创建属性设置正确的新用户帐户
- 根据工作职能分配角色
- 管理群组成员资格
- 处理用户取消配置和离职流程
- 批量用户操作
使用时机: 为新员工办理入职、更改用户访问权限或为离职员工办理离职手续时。
适用对象: 系统管理员、安全管理员和 HR 系统集成人员。
先决条件
- 角色:
admin、user_admin或security_admin - 访问权限: sys_user、sys_user_group、sys_user_grmember、sys_user_has_role 表
- 知识: 了解所在组织的角色和群组结构
- LDAP/SSO: 如果已集成,请了解哪些属性由外部系统管理
关键表
| 表 | 用途 |
|---|---|
| sys_user | 用户记录 |
| sys_user_group | 群组定义 |
| sys_user_grmember | 群组成员关系 |
| sys_user_has_role | 直接角色分配 |
| sys_user_role | 角色定义 |
| sys_group_has_role | 分配给群组的角色 |
流程
阶段 1:用户创建
步骤 1.1:收集用户信息
创建新用户所需字段:
| 字段 | 描述 | 示例 |
|---|---|---|
| user_name | 唯一登录 ID | jsmith |
| first_name | 名 | John |
| last_name | 姓 | Smith |
| 电子邮件地址 | [email protected] | |
| employee_number | 员工 ID | EMP-12345 |
| department | 部门引用 | IT Operations |
| manager | 经理引用 | 经理的 sys_id |
步骤 1.2:检查用户是否已存在
创建前,请确认该用户尚不存在。
使用 MCP:
Tool: SN-Query-Table
Parameters:
table_name: sys_user
query: user_name=jsmith^[email protected]
fields: sys_id,user_name,email,active
limit: 5
如果用户已存在,请改为分配角色和群组。
步骤 1.3:创建用户帐户
使用 MCP:
Tool: SN-Create-Record
Parameters:
table_name: sys_user
data:
user_name: jsmith
first_name: John
last_name: Smith
email: [email protected]
employee_number: EMP-12345
title: Software Developer
department: [department_sys_id]
manager: [manager_sys_id]
location: [location_sys_id]
company: [company_sys_id]
phone: "+1-555-123-4567"
mobile_phone: "+1-555-987-6543"
active: true
locked_out: false
password_needs_reset: true
notification: 2 # Email notifications enabled
使用 REST API:
POST /api/now/table/sys_user
Content-Type: application/json
{
"user_name": "jsmith",
"first_name": "John",
"last_name": "Smith",
"email": "[email protected]",
"employee_number": "EMP-12345",
"active": "true",
"password_needs_reset": "true"
}
步骤 1.4:设置初始密码
使用 MCP(后台脚本):
Tool: SN-Execute-Background-Script
Parameters:
script: |
var user = new GlideRecord('sys_user');
user.get('user_name', 'jsmith');
// Generate random password
var password = GlideSecureRandomUtil.getSecureRandomString(16);
user.setDisplayValue('user_password', password);
user.password_needs_reset = true;
user.update();
// Send welcome email (optional)
gs.eventQueue('user.created', user, password, '');
gs.info('User created. Initial password set. User will be prompted to reset on first login.');
description: Set initial password for new user
阶段 2:角色分配
步骤 2.1:了解角色层级
常见的 ServiceNow 角色:
| 角色 | 描述 | 典型用户 |
|---|---|---|
| itil | ITSM 操作 | 服务台人员、技术人员 |
| admin | 完整管理权限 | 系统管理员 |
| approver_user | 审批能力 | 经理 |
| catalog_admin | 目录管理 | 目录负责人 |
| knowledge | 知识库访问权限 | 知识库贡献者 |
| asset | 资产管理 | 资产经理 |
| change_manager | 变更管理 | 变更经理 |
| problem_manager | 问题管理 | 问题经理 |
步骤 2.2:查询可用角色
查找角色:
Tool: SN-Query-Table
Parameters:
table_name: sys_user_role
query: active=true
fields: sys_id,name,description,suffix
limit: 50
按名称查找角色:
Tool: SN-Query-Table
Parameters:
table_name: sys_user_role
query: name=itil
fields: sys_id,name,description
limit: 1
步骤 2.3:为用户分配角色
直接分配角色:
Tool: SN-Create-Record
Parameters:
table_name: sys_user_has_role
data:
user: [user_sys_id]
role: [role_sys_id]
state: active
inherited: false
批量分配多个角色:
Tool: SN-Batch-Create
Parameters:
records:
- table_name: sys_user_has_role
data:
user: [user_sys_id]
role: [itil_role_sys_id]
- table_name: sys_user_has_role
data:
user: [user_sys_id]
role: [knowledge_role_sys_id]
- table_name: sys_user_has_role
data:
user: [user_sys_id]
role: [approver_user_role_sys_id]
步骤 2.4:验证角色分配
检查用户的角色:
Tool: SN-Query-Table
Parameters:
table_name: sys_user_has_role
query: user=[user_sys_id]^state=active
fields: role,role.name,inherited,granted_by
limit: 50
阶段 3:群组成员资格
步骤 3.1:列出可用群组
使用 MCP:
Tool: SN-List-SysUserGroups
Parameters:
limit: 100
或使用筛选条件查询:
Tool: SN-Query-Table
Parameters:
table_name: sys_user_group
query: active=true^type=itil
fields: sys_id,name,description,manager,email
limit: 50
步骤 3.2:将用户添加到群组
分配单个群组:
Tool: SN-Create-Record
Parameters:
table_name: sys_user_grmember
data:
user: [user_sys_id]
group: [group_sys_id]
批量分配多个群组:
Tool: SN-Batch-Create
Parameters:
records:
- table_name: sys_user_grmember
data:
user: [user_sys_id]
group: [network_support_group_sys_id]
- table_name: sys_user_grmember
data:
user: [user_sys_id]
group: [it_operations_group_sys_id]
- table_name: sys_user_grmember
data:
user: [user_sys_id]
group: [change_advisory_board_sys_id]
步骤 3.3:验证群组成员资格
检查用户所属群组:
Tool: SN-Query-Table
Parameters:
table_name: sys_user_grmember
query: user=[user_sys_id]
fields: group,group.name,group.type
limit: 50
检查群组成员:
Tool: SN-Query-Table
Parameters:
table_name: sys_user_grmember
query: group=[group_sys_id]
fields: user,user.name,user.email
limit: 100
阶段 4:基于角色的配置模板
步骤 4.1:定义角色模板
为常见工作职能创建标准化配置:
IT 支持技术人员模板:
Roles: itil, knowledge
Groups: Service Desk, IT Support Tier 1
Notification: Email enabled
IT 经理模板:
Roles: itil, approver_user, report_user
Groups: IT Management, Change Advisory Board
Notification: Email enabled
开发人员模板:
Roles: itil, personalize_dictionary
Groups: Development Team, Testing
Notification: Email enabled
步骤 4.2:自动化配置脚本
按模板配置:
Tool: SN-Execute-Background-Script
Parameters:
script: |
var userSysId = '[user_sys_id]';
var template = 'IT_SUPPORT_TECHNICIAN';
var templates = {
'IT_SUPPORT_TECHNICIAN': {
roles: ['itil', 'knowledge'],
groups: ['Service Desk', 'IT Support Tier 1']
},
'IT_MANAGER': {
roles: ['itil', 'approver_user', 'report_user'],
groups: ['IT Management', 'Change Advisory Board']
},
'DEVELOPER': {
roles: ['itil', 'personalize_dictionary'],
groups: ['Development Team', 'Testing']
}
};
var config = templates[template];
if (!config) {
gs.error('Unknown template: ' + template);
return;
}
// Assign roles
config.roles.forEach(function(roleName) {
var role = new GlideRecord('sys_user_role');
role.addQuery('name', roleName);
role.query();
if (role.next()) {
var userRole = new GlideRecord('sys_user_has_role');
userRole.initialize();
userRole.user = userSysId;
userRole.role = role.sys_id;
userRole.insert();
gs.info('Assigned role: ' + roleName);
}
});
// Assign groups
config.groups.forEach(function(groupName) {
var group = new GlideRecord('sys_user_group');
group.addQuery('name', groupName);
group.query();
if (group.next()) {
var membership = new GlideRecord('sys_user_grmember');
membership.initialize();
membership.user = userSysId;
membership.group = group.sys_id;
membership.insert();
gs.info('Added to group: ' + groupName);
}
});
gs.info('Provisioning complete for template: ' + template);
description: Provision user by job template
阶段 5:用户修改
步骤 5.1:更新用户属性
更新用户记录:
Tool: SN-Update-Record
Parameters:
table_name: sys_user
sys_id: [user_sys_id]
data:
title: Senior Software Developer
department: [new_department_sys_id]
manager: [new_manager_sys_id]
location: [new_location_sys_id]
步骤 5.2:将用户转移到新群组
从旧群组移除:
Tool: SN-Query-Table
Parameters:
table_name: sys_user_grmember
query: user=[user_sys_id]^group=[old_group_sys_id]
fields: sys_id
limit: 1
# Then delete:
Tool: SN-Execute-Background-Script
Parameters:
script: |
var gr = new GlideRecord('sys_user_grmember');
gr.get('[membership_sys_id]');
gr.deleteRecord();
description: Remove user from group
添加到新群组:
Tool: SN-Create-Record
Parameters:
table_name: sys_user_grmember
data:
user: [user_sys_id]
group: [new_group_sys_id]
步骤 5.3:提升/移除角色
移除角色:
Tool: SN-Query-Table
Parameters:
table_name: sys_user_has_role
query: user=[user_sys_id]^role=[role_sys_id]
fields: sys_id
limit: 1
# Then deactivate (preferred) or delete:
Tool: SN-Update-Record
Parameters:
table_name: sys_user_has_role
sys_id: [user_role_sys_id]
data:
state: revoked
阶段 6:取消配置/离职流程
步骤 6.1:立即采取行动
员工离职时,请立即执行以下步骤:
1. 停用用户账户:
Tool: SN-Update-Record
Parameters:
table_name: sys_user
sys_id: [user_sys_id]
data:
active: false
locked_out: true
2. 撤销所有角色:
Tool: SN-Execute-Background-Script
Parameters:
script: |
var userSysId = '[user_sys_id]';
var gr = new GlideRecord('sys_user_has_role');
gr.addQuery('user', userSysId);
gr.addQuery('state', 'active');
gr.query();
var count = 0;
while (gr.next()) {
gr.state = 'revoked';
gr.update();
count++;
}
gs.info('Revoked ' + count + ' roles for user');
description: Revoke all user roles
3. 从所有群组中移除:
Tool: SN-Execute-Background-Script
Parameters:
script: |
var userSysId = '[user_sys_id]';
var gr = new GlideRecord('sys_user_grmember');
gr.addQuery('user', userSysId);
gr.query();
var count = 0;
while (gr.next()) {
gr.deleteRecord();
count++;
}
gs.info('Removed user from ' + count + ' groups');
description: Remove user from all groups
步骤 6.2:重新分配所属记录
查找用户所属的记录:
Tool: SN-Query-Table
Parameters:
table_name: incident
query: assigned_to=[user_sys_id]^active=true
fields: number,short_description,state
limit: 100
Tool: SN-Query-Table
Parameters:
table_name: change_request
query: assigned_to=[user_sys_id]^stateNOT IN3,4,7
fields: number,short_description,state
limit: 100
批量重新分配:
Tool: SN-Execute-Background-Script
Parameters:
script: |
var departingUser = '[departing_user_sys_id]';
var newAssignee = '[new_assignee_sys_id]';
var tables = ['incident', 'change_request', 'problem', 'sc_task'];
tables.forEach(function(tableName) {
var gr = new GlideRecord(tableName);
gr.addQuery('assigned_to', departingUser);
gr.addQuery('active', true);
gr.query();
var count = 0;
while (gr.next()) {
gr.assigned_to = newAssignee;
gr.work_notes = 'Reassigned due to employee departure';
gr.update();
count++;
}
gs.info('Reassigned ' + count + ' ' + tableName + ' records');
});
description: Reassign all active records from departing user
步骤 6.3:记录离职流程
创建离职记录:
Tool: SN-Create-Record
Parameters:
table_name: sys_user_task
data:
short_description: "Offboarding: [User Name] - [Employee ID]"
description: |
Employee Offboarding Checklist:
[x] User account deactivated
[x] All roles revoked
[x] Removed from all groups
[x] Active tickets reassigned
Departure Date: 2026-02-06
Reason: [Resignation/Termination/Transfer]
IT Actions:
- [ ] VPN access revoked
- [ ] Email forwarding configured
- [ ] Hardware returned
- [ ] Access badges collected
Manager: [Manager Name]
HR Contact: [HR Name]
assigned_to: [hr_admin_sys_id]
priority: 2
阶段 7:批量操作
步骤 7.1:批量创建用户
创建多个用户:
Tool: SN-Batch-Create
Parameters:
records:
- table_name: sys_user
data:
user_name: user1
first_name: Alice
last_name: Johnson
email: [email protected]
active: true
- table_name: sys_user
data:
user_name: user2
first_name: Bob
last_name: Williams
email: [email protected]
active: true
- table_name: sys_user
data:
user_name: user3
first_name: Carol
last_name: Davis
email: [email protected]
active: true
步骤 7.2:批量分配角色
为多个用户分配角色:
Tool: SN-Execute-Background-Script
Parameters:
script: |
var userIds = ['[user1_sys_id]', '[user2_sys_id]', '[user3_sys_id]'];
var roleName = 'itil';
var role = new GlideRecord('sys_user_role');
role.addQuery('name', roleName);
role.query();
if (role.next()) {
userIds.forEach(function(userId) {
var userRole = new GlideRecord('sys_user_has_role');
userRole.initialize();
userRole.user = userId;
userRole.role = role.sys_id;
userRole.insert();
});
gs.info('Assigned ' + roleName + ' role to ' + userIds.length + ' users');
}
description: Bulk role assignment
步骤 7.3:批量添加群组成员
将多个用户添加到群组:
Tool: SN-Execute-Background-Script
Parameters:
script: |
var groupName = 'Network Support';
var userIds = ['[user1_sys_id]', '[user2_sys_id]', '[user3_sys_id]'];
var group = new GlideRecord('sys_user_group');
group.addQuery('name', groupName);
group.query();
if (group.next()) {
userIds.forEach(function(userId) {
var member = new GlideRecord('sys_user_grmember');
member.initialize();
member.user = userId;
member.group = group.sys_id;
member.insert();
});
gs.info('Added ' + userIds.length + ' users to ' + groupName);
}
description: Bulk group membership assignment
工具使用摘要
| 操作 | MCP 工具 | 用途 |
|---|---|---|
| 列出用户 | SN-List-SysUsers | 获取所有用户 |
| 列出群组 | SN-List-SysUserGroups | 获取所有群组 |
| 创建用户 | SN-Create-Record | 创建新用户 |
| 更新用户 | SN-Update-Record | 修改用户属性 |
| 查询 | SN-Query-Table | 搜索用户、角色和群组 |
| 批量创建 | SN-Batch-Create | 创建多条记录 |
| 脚本 | SN-Execute-Background-Script | 执行复杂操作 |
最佳实践
- 最小权限原则: 仅分配履行工作职责所需的最低权限
- 使用群组管理角色: 将角色分配给群组,再将用户添加到群组
- 记录角色分配情况: 维护文档,记录每个人拥有哪些访问权限
- 定期审查访问权限: 每季度审核一次用户访问权限
- 立即办理离职: 在离职当天停用账户
- 使用模板: 使用工作职能模板统一配置流程
- 避免直接分配角色: 优先采用基于群组的角色继承
- 锁定而非删除: 停用用户而不是删除,以保留审计记录
故障排除
用户无法登录
症状: 用户收到“凭据无效”错误 原因:
- 账户未激活
- 账户已锁定
- 密码已过期 解决方案:
Tool: SN-Query-Table
Parameters:
table_name: sys_user
query: user_name=[username]
fields: active,locked_out,password_needs_reset,failed_attempts
用户缺少预期的访问权限
症状: 用户无法访问预期的模块或记录 原因:
- 未分配角色
- 角色已撤销或过期
- 缺少群组成员身份 解决方案:
Tool: SN-Query-Table
Parameters:
table_name: sys_user_has_role
query: user=[user_sys_id]^state=active
fields: role.name,inherited,granted_by
未显示继承的角色
症状: 用户已加入群组,但未获得该群组的角色 原因:
- 已禁用群组角色继承
- 群组未激活 解决方案:
Tool: SN-Query-Table
Parameters:
table_name: sys_user_group
query: sys_id=[group_sys_id]
fields: name,active,roles
相关技能
admin/batch-operations- 批量用户操作security/acl-management- ACL 配置admin/script-execution- 自动配置脚本itsm/change-management- 访问权限变更的变更流程