概要
ServiceNow開発をしていると、1つのインスタンスに複数のアプリケーションを乗せるタイプの開発もよくあると思います。
そうすると、インスタンスを運用するチームとアプリケーションを開発するチームに分かれることもあり、運用チームの許可がないとバックグラウンドスクリプトなどで自由にスクリプトを実行できないような制約がある場合があったりします。
商用環境でのバックグラウンドスクリプト実行はNG!!!というケースでも自由にスクリプトを実行できる可能性があったので紹介してみます(自己責任でお願いします)
※Yokohamaで実験してみました
GlideScopedEvaluatorを利用することで任意のスクリプトを自分のスコープ内で実行します
想定している環境
- 1つのインスタンスに複数のアプリケーションがあり、それぞれで開発を行っている
- アプリケーション開発チームは任意のスクリプトを実行できない
- 自己責任で任意のスクリプトを実行してみたい
やったこと
- カスタムテーブル作成
- UIAction作成
- 適当なスクリプトを実行
実装
カスタムテーブル作成
Scriptタイプのフィールドを持つカスタムテーブルを作成

作成されたテーブル

UIAction作成
今回はスクリプトを実行するトリガーをUIActionにしてみました。
UIActionではなければダメでありません。

var result = ge.evaluateScript(current, "script");
でテーブルのscriptカラムに書かれているスクリプトを実行
※resultは実行結果などを呼び出し元から利用したいときに使えそうです
適当なスクリプトを実行

適当に作ったtest1テーブルにレコードを挿入して「OK」という戻り値を返すスクリプトをカスタムテーブルに記載します
最低限の権限しか持たないユーザーに変更
レコードが挿入される前のtestテーブル
さいごに
PDIで試しただけですが、これなら自分のスコープ内のテーブルに対して任意のスクリプトを実行できると思います。
実行ユーザーも最低限の権限があれば実行できたようなので、これをしれっと商用環境にリリースすれば、スコープ内で自由にスクリプトが実行できそうな気がします(自己責任で)
追記
本当に使っても大丈夫なのか気になったのでAI(Gemini)に聞いてみました
GlideScopedEvaluator を使用する際の重要なポイント
- セキュリティ上の注意 ⚠️
$\text{GlideScopedEvaluator}$は、**文字列として渡されたJavaScriptコードを評価(実行)**します。これは本質的にセキュリティリスクを伴います。意図しないコード実行の危険性: もし評価するコードがユーザー入力など制御不能なソースから来た場合、悪意のあるコード(例:gs.sql() の実行など)を実行してしまう可能性があります。
だそうです。使う際はお気を付けを(AI(Gemini)の回答を抜粋)




