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 のユーザーライフサイクル管理に関する包括的なガイダンスを提供します。

  • 適切な属性を設定して新しいユーザーアカウントを作成する
  • 職務に基づいてロールを割り当てる
  • グループメンバーシップを管理する
  • ユーザーのプロビジョニング解除とオフボーディングを行う
  • ユーザーの一括操作を行う

使用する場面: 新入社員のオンボーディング、ユーザーアクセスの変更、または退職する従業員のオフボーディングを行う場合です。

対象者: システム管理者、セキュリティ管理者、人事システムインテグレーターです。

前提条件

  • ロール: 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ナレッジベースへのアクセスKB 投稿者
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 - アクセス変更の変更プロセス

参考資料

コメント