IAccessHandler のトラブルシューティング: user_admin ロールでは、ロールを含むグループを編集したり、グループメンバーを追加したりすることはできません。Issue <!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: #000000; } span { font-size: 12pt; font-family: Lato; color: #000000; } h2 { font-size: 24pt; font-family: Lato; color: black; } h3 { font-size: 18pt; font-family: Lato; color: black; } h4 { font-size: 14pt; font-family: Lato; color: black; } a { font-size: 12pt; font-family: Lato; color: #00718F; } a:hover { font-size: 12pt; color: #024F69; } a:target { font-size: 12pt; color: #6e9db4; } a:visited { font-size: 12pt; color: #7057C7; } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: block; max-width: 500px !important; width: auto; height: auto; } } user_admin ロールを持つユーザーは、ロールを持つグループのメンバーを追加または編集することはできません。 次の例はこれを示しています。 sn_templated_snip.template_snippet_reader ロールを含むテスト sys_user_group sntest を設定します。テストsys_user testuser_admin を作成し、このユーザーに user_admin ロールを のみ付与します。sntest へ代理操作を行い(Impersonate) 、 sntest グループに移動します。 注:ロール sntest sys_users は sntest sys_user_group に書き込むことができません。 この動作は、サンプルロールを含むロールに拡張されます。 つまり、sntest sys_user_groupに sn_customerservice.esc_fulfiller または sn_esm_agent role ロール (階層に sn_templated_snip.template_snippet_reader ロールも含まれている) が含まれている場合、同じことが当てはまります。次の図は、アクセス制御リスト (ACL) 評価での IAccessHandler 違反を示しています。 Cause<!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: #000000; } span { font-size: 12pt; font-family: Lato; color: #000000; } h2 { font-size: 24pt; font-family: Lato; color: black; } h3 { font-size: 18pt; font-family: Lato; color: black; } h4 { font-size: 14pt; font-family: Lato; color: black; } a { font-size: 12pt; font-family: Lato; color: #00718F; } a:hover { font-size: 12pt; color: #024F69; } a:target { font-size: 12pt; color: #6e9db4; } a:visited { font-size: 12pt; color: #7057C7; } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: block; max-width: 500px !important; width: auto; height: auto; } } これは、テンプレート化されたスニペット sys_store_app の アプリケーション管理 チェックボックスと、影響を受けるsys_user_roleレコードの アサイン担当者 フィールドの組み合わせによって発生します。次の画像はこれを示しています。 アプリケーション管理 がオンになっている場合、プラットフォームはsys_user_roleの アサイン担当者フィールドの内容を優先する必要があります。assignable_byが空で、アプリケーション管理がオンになっている場合、プラットフォーム上の 誰も このロールを付与できません。 Resolution<!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: #000000; } span { font-size: 12pt; font-family: Lato; color: #000000; } h2 { font-size: 24pt; font-family: Lato; color: black; } h3 { font-size: 18pt; font-family: Lato; color: black; } h4 { font-size: 14pt; font-family: Lato; color: black; } a { font-size: 12pt; font-family: Lato; color: #00718F; } a:hover { font-size: 12pt; color: #024F69; } a:target { font-size: 12pt; color: #6e9db4; } a:visited { font-size: 12pt; color: #7057C7; } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: block; max-width: 500px !important; width: auto; height: auto; } } 特に複数のネスト層がある場合は、原因を特定 するのが面倒な場合があります。次のロール継承構造を持つ架空のシナリオを考えてみましょう。 sn_hr_core.basic などの特定のロールには、独自の継承チェーンを持つ少なくとも 5 つのロールが含まれています。各層でチェックの数が疲れる可能性があり、すでにチェックされたものを数え失うのは簡単です。 ネストされたロールでは、次の 2 つの潜在的な基準を識別する必要があります。 IAccessHandler 違反が発生しているユーザーには、ロール自体はありません。継承チェーンのロールの 1 つで アプリケーション管理 がオンになっているが、 アサイン担当者 は入力されていません。これにより、誰もロールをアサインできなくなります。 識別を簡単にするために、次のスクリプトを使用できます。 var group_sys = 'GROUP_SYS_HERE'; //always populate this with the group sys_id var user_sys = ''; //populate this if you want to verify whether user passes iAccessHandler checks, otherwise leave it blank! //this version of script is for iAccessHandler identification for roles in group role inheritance chain that may var group = new GlideRecord('sys_user_group'); group.get(group_sys); var output = ''; var final_role_list = []; var roles_without_assignable_by = []; var exclusion_list = []; var grp_role = new GlideRecord('sys_group_has_role'); grp_role.addEncodedQuery('group=' + group.sys_id); grp_role.query(); while(grp_role.next()){ //start checking role hierarchy checkRole(grp_role.role + ''); } gs.info(output); if(final_role_list.length > 0) gs.info('Final role list: ' + final_role_list.join(', ')); if(roles_without_assignable_by.length > 0) gs.info('Roles without Assignable By (any roles in this list cannot be inherited unless App Administration is unchecked for scope OR Assignable by is populated): ' + roles_without_assignable_by.join(', ')); if(user_sys){ var missing_roles = []; var user = new GlideRecord('sys_user'); if(user.get(user_sys)){ for(var roles in final_role_list){ var has_role = new GlideRecord('sys_user_has_role'); has_role.addEncodedQuery('user=' + user.sys_id + '^role.name=' + final_role_list[roles]); has_role.query(); if(!has_role.next() && missing_roles.indexOf(final_role_list[roles]) == -1){ missing_roles.push(final_role_list[roles]); } } if(missing_roles.length > 0) gs.info('User: ' + user.name + ' is missing: ' + missing_roles.join(', ')); else if(roles_without_assignable_by.length >0){ gs.info('User: ' + user.name + ' has all roles needed for iAccessHandler, but will not be able to pass iAccessHandler due to the Roles without Assignable by identified.'); } else gs.info('User: ' + user.name + ' has all roles needed for iAccessHandler.'); } } function checkRole(role_sys){ var role = new GlideRecord('sys_user_role'); role.get(role_sys); if(role.sys_scope.scoped_administration){ output += '\n' + role.name + ' will trigger iAccessHandler, ' + role.sys_scope.getDisplayValue() + ' has Application Administration activated.' + (role.assignable_by ? ' Assignable by: ' + role.assignable_by.getDisplayValue() : ' NOTE Assignable by is empty, role cannot be inherited without this set'); if(role.assignable_by && final_role_list.indexOf(role.assignable_by.getDisplayValue()) == -1){ final_role_list.push(role.assignable_by.getDisplayValue()); } else if(!role.assignable_by && roles_without_assignable_by.indexOf(role.name + '') == -1){ roles_without_assignable_by.push(role.name + ''); } } var contains = new GlideRecord('sys_user_role_contains'); contains.addEncodedQuery('role=' + role.sys_id + '^role.nameNOT IN' + exclusion_list.toString()); contains.query(); exclusion_list.push(role.name + ''); if(contains.getRowCount() > 0){ while(contains.next()){ checkRole(contains.contains + ''); } } else return; } スクリプトクライテリア テストは前の画像に示されたシナリオで実行されますが、sn_templated_snip.template_snippet_reader は Assignable by が空になるように調整されます。ユーザーには、 user_admin、 snc_internal、および kmf_admin ロールのみがあります。グループとユーザー sys_idsは、スクリプトの先頭にある 2 つの変数に入力されます。 スクリプトを実行すると、次の出力が得られます。 sn_hr_core.basic will trigger iAccessHandler, Human Resources: Core has Application Administration activated. Assignable by: sn_hr_core.manager sn_esign.config_manager will trigger iAccessHandler, E-Signature has Application Administration activated. Assignable by: sn_esign.config_manager sn_hr_core.case_writer will trigger iAccessHandler, Human Resources: Core has Application Administration activated. Assignable by: sn_hr_core.manager sn_templated_snip.template_snippet_reader will trigger iAccessHandler, Templated Snippets has Application Administration activated. NOTE Assignable by is empty, role cannot be inherited without this set sn_hr_core.case_reader will trigger iAccessHandler, Human Resources: Core has Application Administration activated. Assignable by: sn_hr_core.manager sn_hr_core.report_creator will trigger iAccessHandler, Human Resources: Core has Application Administration activated. Assignable by: sn_hr_core.manager sn_templated_snip.template_snippet_reader will trigger iAccessHandler, Templated Snippets has Application Administration activated. NOTE Assignable by is empty, role cannot be inherited without this set sn_templated_snip.template_snippet_reader will trigger iAccessHandler, Templated Snippets has Application Administration activated. NOTE Assignable by is empty, role cannot be inherited without this set sn_hr_core.profile_writer will trigger iAccessHandler, Human Resources: Core has Application Administration activated. Assignable by: sn_hr_core.manager sn_hr_core.profile_reader will trigger iAccessHandler, Human Resources: Core has Application Administration activated. Assignable by: sn_hr_core.manager sn_hr_core.kb_writer will trigger iAccessHandler, Human Resources: Core has Application Administration activated. Assignable by: sn_hr_core.manager sn_lc.content_reader will trigger iAccessHandler, Learning Core has Application Administration activated. Assignable by: sn_lc.content_writer sn_kmf.cryptographic_operator will trigger iAccessHandler, ServiceNow Key Management Framework has Application Administration activated. Assignable by: sn_kmf.admin sn_templated_snip.template_snippet_writer will trigger iAccessHandler, Templated Snippets has Application Administration activated. Assignable by: sn_templated_snip.template_snippet_writer sn_templated_snip.template_snippet_reader will trigger iAccessHandler, Templated Snippets has Application Administration activated. NOTE Assignable by is empty, role cannot be inherited without this set sn_doc.reader will trigger iAccessHandler, Document Templates has Application Administration activated. Assignable by: sn_doc.admin *** Script: Final role list: sn_hr_core.manager, sn_esign.config_manager, sn_lc.content_writer, sn_kmf.admin, sn_templated_snip.template_snippet_writer, sn_doc.admin *** Script: Roles without Assignable By (any roles in this list cannot be inherited unless App Administration is unchecked for scope OR Assignable by is populated): sn_templated_snip.template_snippet_reader *** Script: User: Alejandra Prenatt is missing: sn_hr_core.manager, sn_esign.config_manager, sn_lc.content_writer, sn_templated_snip.template_snippet_writer, sn_doc.admin スクリプト出力の最後の 3 行に注意してください。 スクリプト:最終的なロールリスト: IAccessHandler を適切に渡すために必要なロールの完全なリストを示します。スクリプト:アサイン担当者のないロール は、[アサイン担当者] フィールドが設定されていないが、スコープが アプリケーション管理としてオンになっているロールを識別します。スクリプト:ユーザー:ユーザーが持っているものと、IAccessHandler を適切に渡すために必要なロールの完全なリストとの間の差分を識別します。 Related Links詳細については、製品ドキュメント「アプリケーションへのアクセスの制限」を参照してください。