mcpField
U
user-provisioning

user-provisioning

github.com/happy-technologies-llc安全4142 次安装2 天前更新
代码仓库

关于 user-provisioning

面向 ServiceNow 管理员、安全管理员和 HR 系统集成团队的用户生命周期管理技能,涵盖账户创建、角色与群组分配、变更、离职和批量操作。内容提供按职能配置的模板,并强调最小权限和停用账户以保留审计记录。

主要功能

  1. 01创建与更新用户账户
  2. 02分配角色和群组成员资格
  3. 03按职能模板配置访问权限
  4. 04执行离职与批量用户操作

适用场景

  1. 01为新员工开通账户和访问权限
  2. 02员工转岗时调整角色与群组
  3. 03离职时停用账户并撤销访问
  4. 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唯一登录 IDjsmith
first_name名John
last_name姓Smith
email电子邮件地址[email protected]
employee_number员工 IDEMP-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 角色:

角色描述典型用户
itilITSM 操作服务台人员、技术人员
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 - 访问权限变更的变更流程

参考资料

评论

支持 Markdown