SalesforceのInstallHandler: ゴーストユーザーの権限と制約の完全ガイド


Salesforce において、InstallHandler が実行される際には、特殊な「ゴーストユーザー」(ghost user) のコンテキストで動作します。このゴーストユーザーは、パッケージのインストール後に実行されるスクリプト(ポストインストールスクリプト)を管理するために存在し、通常のユーザーとは異なる特性を持っています。以下に、その特性と制限について詳細を説明します。


ゴーストユーザーの特性

  1. ユーザー種別:

    • このユーザーは `UserType` が `LicenseManager` に設定されており、通常のユーザーや API ユーザーとは異なります。
  2. ユーザー情報:

    • ユーザー名: `package-id@org-id` の形式を持ちます。
    • メールアドレス: `noreply@salesforce.com` に設定され、メール通知は送信されません。
    • プロファイル ID: 特定のプロファイルに紐づけられますが、一般のユーザーがアクセスしようとすると「権限不足」のエラーが表示されます。
  3. セッション情報:

    • セッション ID が存在しないため、直接ログインすることはできません。
    • SOQL クエリやログモニタでこのユーザーの詳細を確認することはできません。
  4. 組織依存:

    • インストール元パッケージとインストール先組織に関するメタデータ情報を引き継ぎます(`OrganizationId`、`OrganizationName` など)。

ゴーストユーザーの権限

  1. 特定のオブジェクトへの制限:

    • ゴーストユーザーは通常アクセス可能な多くのオブジェクトにはアクセスできますが、以下のオブジェクトへのアクセスが制限されます:
      • CronTrigger: スケジュール管理のメタデータオブジェクト。
      • ApexClass: Apex クラスメタデータ。
    • これらのオブジェクトへのアクセス制限は、パッケージの安全性を確保するために意図されています。
  2. データアクセス:

    • ゴーストユーザーは、インストール先の組織内のデータに通常の方法でアクセス可能ですが、一部の制限付きフィールドやオブジェクトへのアクセスは制限される場合があります。
  3. コード実行の制限:

    • バッチジョブやスケジュールジョブは、このゴーストユーザーのコンテキストで実行されるため、同様の制約を受けます。
    • Apex コードで実行中に `UserInfo` を利用してユーザーコンテキストを確認することができますが、これらの制約を回避することはできません。
  4. ログの制限:

    • デバッグログにはゴーストユーザーの活動が記録されません。そのため、スクリプトのデバッグには工夫が必要です。

ゴーストユーザーの制約

  • 権限のカスタマイズ不可:
    • このユーザーのプロファイルや権限セットを変更することはできません。
  • SOQL クエリ制限:
    • ゴーストユーザーでは、特定のオブジェクトが SOQL クエリで利用できないため、適切なエラーハンドリングが必要です。
  • システム管理者権限非所持:
    • 通常のシステム管理者のような全権アクセスは持たないため、開発時には慎重な設計が必要です。

ベストプラクティス

  1. ポストインストールスクリプトの設計:

    • ゴーストユーザーの制約を考慮し、スクリプト内でアクセスするデータやオブジェクトを事前に確認することが重要です。
    • try-catchブロックを使用し、アクセスエラーに対処する。
    try {
        List<CronTrigger> triggers = [SELECT Id, State FROM CronTrigger];
    } catch (Exception e) {
        System.debug('Unable to query CronTrigger: ' + e.getMessage());
    }
    
  2. デバッグの工夫:

    • `System.debug` を使用してログを残す。
    • 重要な情報をメール通知で送信する仕組みを構築する。
    Messaging.SingleEmailMessage email = new Messaging.SingleEmailMessage();
    email.setToAddresses(new String[] { 'your-email@example.com' });
    email.setSubject('Post-Install Script Log');
    email.setPlainTextBody('Install script completed successfully.');
    Messaging.sendEmail(new Messaging.SingleEmailMessage[] { email });
    
  3. システム管理者権限の利用:

    • 必要に応じて、ゴーストユーザーではなく、システム管理者ユーザーを介してジョブを実行する設計も検討する。

コメント