概要
Active Directoryなどの管理者権限申請と入室申請をServiceNowで作成します。
実際に利用する場合は承認フローの定義も必要になりますが、今回は画面を作成します。
フォームの実装
今回は次のようなネットワークの管理者権限とサーバ部屋などの入室申請フォームを作成します。
1.先ずはフォームを作成します。アプリケーションナビゲータから「アイテムの」を検索ます。
2.アイテムの管理はよく使うのでお気に入りに登録します。「アイテムの管理」の右の星をクリックします。
次回から「アイテムの管理」を開く場合はアプリケーションナビゲータの直下にある星アイコンを選択して、「サービスカタログ・アイテム」を選択します。
3.「新規」ボタンを押下して、新しいフォームを作成します。
4.項目「名前」と項目「簡単な説明」を入力します。
項目 | 値 |
---|---|
名前 | Privilege request form |
値 | Request permission to have special privilege |
![]() |
5.ポータル用の設定を行います。
「ポータルの設定」タブを選択して次のように設定します。
項目 | 値 |
---|---|
要求の方法 | 要求 |
買い物かごに追加を非表示にする | チェック |
数量を非表示にする | チェック |
配送時間を非表示にする | チェック |
ウィッシュリストに追加を非表示にする | チェック |
添付ファイルを非表示にする | チェック |
![]() |
6.フォームを保存します。
ヘッダ領域を右クリックして「保存」を選択します。保存するとページの下に変数やスクリプトのタブが表示されます。
フィールド(変数)の作成
1.権限申請フォームには9つのフィールドがあります。これらのフィールを作成していきます。
画面からは8つのフィールドしかないようですが、ネットワーク管理者申請と入室申請用は別々に設けるため9フィールドを定義します。
2.「変数」タブを選択して「新規」ボタンを押下します。
3.最初に日付のフィールドを定義します。次のように設定します。
項目 | 値 |
---|---|
タイプ | 日付 |
必須 | チェック |
順番 | 10 |
質問 | Submission date |
名前 | submission_date |
![]() |
4.フィールドの幅を短くします。
「タイプ仕様」タブを選択して、変数の幅を「System Default Width(25)%」にします。
5.デフォルトで今日の日付を入力するようにします。
「デフォルト」タブを選択してデフォルト値に「now」を入力します。
これで日付フィールドの定義は終わりましたので「送信」ボタンを押下します。
6.次の申請者情報を表示するフィールドを作成します。
「新規」ボタンを押下します。
7.申請はログインしているユーザに限るので、ログインしているユーザ情報を表示するだけにします。
次のように設定します。
項目 | 値 |
---|---|
タイプ | 1行テキスト |
順番 | 20 |
質問 | Employee info |
名前 | employee_info |
![]() |
|
8.フィールドの幅を短くします。 | |
「タイプ仕様」タブを選択して、変数の幅を「25%」にします。 | |
![]() |
|
9.デフォルトでログインしているユーザ名を表示します。 | |
「デフォルト値」タブを選択してデフォルト値に「javascript: gs.getUserDisplayName();」を入力します。これで社員情報フィールドの定義は終わりなので「送信」ボタンを押下します。 | |
ログインユーザを取得するプロパティ及び関数に関しては次のページを参照してください。 | |
https://qiita.com/htshozawa/items/f76615b1acaad3d5c68b | |
![]() |
|
10.申請の種類選択のラジオボタンフィールドを作成します。 | |
「新規」ボタンを押下します。 | |
![]() |
|
11.ID選択フィールドを定義します。 |
項目 | 値 | コメント |
---|---|---|
タイプ | 1行テキスト | |
順番 | 120 | |
質問 | Card id | |
名前 | card_id | |
サンプルテキスト | Employee card internal number | フィールドに値が入力される前に表示する文字列 |
![]() |
||
22.入室権限の種類選択フィールドを作成します。 | ||
「新規」ボタンを押下します。 | ||
![]() |
||
23.次のように設定します。 |
項目 | 値 |
---|---|
タイプ | 複数行テキスト |
必須 | チェック |
順番 | 150 |
質問 | Comment |
名前 | comment |
![]() |
|
46.注意メッセージ用のフィールドを作成します。注意メッセージは後で読取り専用にします。 | |
「新規」ボタンを押下します。 | |
![]() |
|
47.次のように設定します。 |
項目 | 値 |
---|---|
タイプ | 複数行テキスト |
順番 | 200 |
質問 | * |
名前 | warning |
![]() |
|
48.デフォルト値に注意メッセージを入力します。 | |
「デフォルト」タブを選択します。デフォルト値に次の文面を入力します。 |
Warning
1)The person applying should be the person who needs the privilege.
2)Privilege should only be used by the person granted and not rent to anyone else.
3) In case the card is lost or access information is leaked, please contact us immediately.
49.フィールドの登録を完成すると次のように9つのフィールドが定義されます。
UIポリシー
UIポリシーで社員情報と注意メッセージを読取り専用にします。また入室申請種類フィールドを非表示にします。
1.「カタログUIポリシー」タブを選択して新しいUIポリシーを作成するために「新規」ボタンを押下します。
2.項目「簡単な説明」に「Form initialization」を入力します。
3.UIポリシーアクションを定義するのため、一旦保存します。
ヘッダ領域を右クリックして「保存」を選択します。保存されるとページ下にカタログUIポリシーアクションが表示されます。
4.注意メッセージを読取り専用にするアクションを作成します。
「新規」ボタンを押下します。
5.注意メッセージを読み込み専用に設定します。
次のように項目を設定した後に「送信」ボタンを押下します。
項目 | 値 | コメント |
---|---|---|
変数名 | warning | 注意メッセージのフィールド名 |
読み込み専用 | True | |
![]() |
||
2.社員情報フィールドを読み込み専用に設定するアクションも作成します。 | ||
「新規」ボタンを押下します。 | ||
![]() |
||
3.次のように項目を設定した後に「送信」ボタンを押下します。 |
項目 | 値 | コメント |
---|---|---|
変数名 | employee_info | 社員情報フィールド名 |
順番 | 200 | |
読み込み専用 | True | |
![]() |
||
4.入室申請種類フィールドを非表示にします。入室申請種類はIDタイプが入室権限の申請の場合に表示します。 | ||
「新規」ボタンを押下します。 | ||
![]() |
||
5.項目を次のように設定した後に「送信」ボタンを押下します。 |
項目 | 値 | コメント |
---|---|---|
変数名 | room_request_privilege | 入室申請種類フィールド名 |
順番 | 300 | |
表示 | False | 非表示にする |
![]() |
||
6.UIポリシーを保存して設定を完了します。 | ||
![]() |
クライアントスクリプト
社員番号を表示するスクリプトとIDタイプを選択によりネットワーク申請か入室申請を表示する2つのスクリプトを作成します。
初期化
ログインしている社員の社員番号を表示します。
1.「カタログクライアントスクリプト」タブを選択して「新規」ボタンを押下します。
2.次のように設定した後に「送信」ボタンを押下します。
項目 | 値 | コメント |
---|---|---|
名前 | Form initialization | |
UIタイプ | すべて | ポータルでもスクリプトを実行させるため |
タイプ | onLoad | フォームを開いた時に実行 |
スクリプト |
function onLoad() {
setUserInfo(); //ユーザ情報の表示
setWarningMessage(); //注意メッセージの背景色を白にして、ボーダーを無くす
}
function setUserInfo() {
var ajax = new GlideAjax('GetUserInfo'); //Ajaxを利用してサーバを呼び出す。引数にサーバスクリプトファイル名を渡す
ajax.addParam('sysparm_name', 'getUserNameAndEmpNo'); //呼び出すメソッド名を指定
ajax.getXMLAnswer(function(answer) { //Ajax呼び出し
if (answer.length > 0) { //メールアドレスを取得できたかチェック
g_form.setValue('employee_info', answer); // 結果をメールフィールドに設定する
}
});
}
function setWarningMessage() {
try { //ポータルの場合はエラーになるのでスキップ
var warning = g_form.getControl('warning'); //注意要素を取得
warning.style.backgroundColor = 'white'; //背景を白に変更
warning.style.color = 'red'; //文字色を赤にする
warning.style.borderStyle = 'none'; //ボーダーを無くす
} catch (err) {}
}
選択可能な権限の変更
IDタイプによりネットワーク種類フィールド又は入室種類フィールドを表示するスクリプトを作成します。
1.「新規」ボタンを押下します。
2.項目を次のように設定した後に「送信」ボタンを押下します。
項目 | 値 | コメント |
---|---|---|
名前 | Toggle request choice based on type id | |
UIタイプ | すべて | ポータルでも実行する |
タイプ | onChange | 変数名で指定したフィールドが変更された場合に実行 |
変数名 | id_type | 変更を監視するフィールド名 |
フィールドを非表示するプロパティは.setVisible()と.setDisplay()があります。.setVisible('フィールド名',false)の場合もフィールドは非表示になりますが、フィールドが空白になり次のフィールドの間に空白ができます。.setDisplay('フィールド名',false)の場合は空白が次のフィールドで埋まります。今回はIDタイプにより表示するフィールドを切り替えるので.setDisplay()を使います。
function onChange(control, oldValue, newValue, isLoading) {
if (isLoading || newValue == '') {
return;
}
if (newValue == 'entry_card') { //入室許可申請の場合
g_form.setDisplay('room_request_privilege', true); //入室申請種類フィールドを表示
g_form.setDisplay('system_request_privilege', false); //ネットワーク種類フィールドを非表示
g_form.setValue('room_request_privilege', 'room_entry_request'); //デフォルトを入室申請にする
g_form.setMandatory('current_id', true); //カード番号フィールドを必須にする
} else { //ネットワーク権限申請の場合
g_form.setDisplay('room_request_privilege', false); //入室種類フィールドを非表示にする
g_form.setDisplay('system_request_privilege', true); //ネットワーク種類フィールドを表示する
g_form.setValue('system_request_privilege', 'system_access_request'); //デフォルトをネットワーク権限申請にする
g_form.setMandatory('current_id', false); //カード番号フィールドは任意にする
}
}
カタログ指定
ポータルから申請を出せるように申請を表示するカタログとカテゴリを指定します。
1.申請設定ページを表示します。
申請設定ページが表示されていない場合は履歴アイコンを選択して、Privilege request formカタログアイテムを選択します。
2.項目「カタログ」に右に表示されている錠前アイコンをクリックします。
3.虫眼鏡をクリックします。
4.「サービスカタログ」を選択します。
5.カタログに「サービスカタログ」が追加されたことを確認した後にカテゴリの虫眼鏡を選択します。
6.今回は「サービス」にこの申請を含めるようにします。
7.カテゴリが「サービス」に設定されたことを確認した後に「更新」ボタンを押下して保存します。
8.正しくポータルで表示されるか確認します。
アプリケーションナビゲータから「ポータル」を検索して、「サービスポータルホーム」を選択します。
9.サービスカタログは要求内容にあります。
「要求内容」を選択します。
10.カテゴリから「オフィス」>「サービス」を選択します。
表示されたサービスから「Privilege request form」を選択します。正しく設定されていればフォームが開きます。
サーバスクリプト(スクリプトインクルード)
社員情報フィールドにログインしているユーザの名前と社員番号を表示するようにします。クライアントだけでは社員名しか表示することができないのでサーバ側スクリプトを呼び出して社員番号も表示するようにします。
1.アプリケーションナビゲータから「スクリプトインクルード」を検索して、「システム定義」下の「スクリプトインクルード」を選択します。
2.新しいスクリプトを作成するために「新規」ボタンを押下します。
3.次のように設定します。クライアントコール可能をチェックするとコードテンプレートがスクリプトに生成されます。また、クライアントコール可能とはクライアントからの呼び出しを許可すると言う意味です。
入力した後に「送信」ボタンを押下します。
項目 | 値 |
---|---|
名前 | GetUserInfo |
クライアントコール可能 | チェック |
var GetUserInfo = Class.create();
GetUserInfo.prototype = Object.extendsObject(AbstractAjaxProcessor, {
getUserNameAndEmpNo: function() {
var user_id = gs.getUserID();
var grUser = new GlideRecord('sys_user'); //SystemNowのユーザテーブル(sys_id)を参照する
if (grUser.get(user_id)) { //指定したユーザが存在するか確認
return gs.getUserDisplayName() + ' [' + grUser.employee_number + ']'; //存在する場合はメールアドレスを返す
}
return ''; //存在しない場合は空文字を返す
},
type: 'GetUserInfo'
});
テスト
最後にすべて正しく動作するか確認します。
カタログクライアントから
先ずはサービスカタログ・アイテムから確認します。
1.お気に入りから「サービスカタログ・アイテム」を選択します。
2.「試行」ボタンを押下します。
3.次のような申請フォームが表示されます。
4.ID Type「Room Entry Privilege」を選択するとSystem request privilegeがRoom request privilegeに変更します。
サービスポータルから
次に再びサービスポータルから確認します。
1.アプリケーションナビゲータから「サービスポータル」を検索して「サービスポータルホーム」を選択します。
2.「要求内容」を選択します。
3.カテゴリから「オフィス」>「サービス」を選択します。
4.「Privilege request form」を選択します。
5.サーバ側スクリプトを作成したので、今回は社員情報フィールに社員名と社員番号が表示されます。
以上