> For the complete documentation index, see [llms.txt](https://docs.keeper.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.keeper.io/keeperpam/jp/endpoint-privilege-manager/reference/plugin-and-job-registration.md).

# プラグインとジョブの登録

<figure><img src="/files/ZxvWoFlHGWvTxL4j1n1c" alt=""><figcaption></figcaption></figure>

**対象:** プラグインとジョブの検出、登録、読み込みの仕組みを把握する必要があるIT管理者。

## プラグインの登録

### プラグインの登録方法

プラグインは `Plugins/` ディレクトリ内のJSONファイルから検出されます。エージェントは起動時にこれらのファイルを読み取り、検証し、`startupPriority` と `autoStart` の設定に従ってプラグインを起動します。`pluginType: Executable` のプラグインは別プロセスとして実行され、`pluginType: Service` のものはメインエージェントプロセス内で動作します。

* **場所:** `{approot}/Plugins/` (例: `C:\Program Files\KeeperPrivilegeManager\Plugins`)
* **ファイル名:** `{PluginName}.json` (例: `KeeperPolicy.json`)

新しいプラグインを追加するには、プラグインのバイナリを `Plugins/bin/{PluginName}/` に置き、`Plugins/{PluginName}.json` にプラグインJSONファイルを追加します。サービス再起動後 (または対応している場合はプラグインの再読み込み後)、新しいプラグインが登録され、起動できるようになります。

### プラグインJSONフィールド

プラグインJSONファイルには以下のフィールドが含まれます。プラグインによってはすべてが必要ではありません。ご利用のエージェントバージョンについては、[カスタムプラグイン統合ガイド](/keeperpam/jp/endpoint-privilege-manager/integrations/custom-plugin-guide.md)および管理者向けドキュメントでご確認ください。

<table data-header-hidden="false" data-header-sticky><thead><tr><th width="197.3333740234375">フィールド</th><th>説明</th></tr></thead><tbody><tr><td><code>id</code></td><td>一意のプラグイン識別子。<code>/api/PluginSettings/{id}</code> で使うファイル名およびキーとの一致が必要</td></tr><tr><td><code>pluginType</code></td><td>別プロセスの場合は <code>Executable</code>。プロセス内コンポーネントの場合は <code>Service</code></td></tr><tr><td><code>executablePath</code></td><td>プラグインバイナリへのパス。エージェントルートからの相対パスまたは絶対パス。プロセス内プラグインでは省略</td></tr><tr><td><code>supportedPlatforms</code></td><td>OS名の配列。非対応プラットフォームではエージェントがプラグインをスキップ</td></tr><tr><td><code>Subscription</code></td><td>主MQTTサブスクリプション: <code>Topic</code>、<code>Qos</code>、<code>CleanSession</code></td></tr><tr><td><code>metadata.mqttTopics</code></td><td>主サブスクリプションに加える追加の <code>subscribe</code> および <code>publish</code> トピック権限</td></tr><tr><td><code>startupPriority</code></td><td>起動順序の制御。数値が小さいほど先に起動</td></tr><tr><td><code>autoStart</code></td><td><code>true</code> のとき、起動時にプラグインを起動</td></tr><tr><td><code>executionContext</code></td><td>プラグインプロセスの実行コンテキスト: <code>Service</code>、<code>User</code>、<code>Interactive</code></td></tr><tr><td><code>requiresMonitoring</code></td><td><code>true</code> のとき、プロセス監視による予期しない終了の検出</td></tr><tr><td><code>autoRestart</code></td><td><code>true</code> のとき、監視で停止を検出した場合のプラグイン再起動</td></tr></tbody></table>

プラグインJSONの例:

```json
{
  "id": "KeeperPolicy",
  "name": "Keeper Policy Service",
  "pluginType": "Executable",
  "executablePath": "{pluginroot}/KeeperPolicy/bin/Release/net8.0/KeeperPolicy",
  "supportedPlatforms": ["Windows", "Linux", "macOS"],
  "Subscription": {
    "Topic": "KeeperPolicy",
    "Qos": 2,
    "CleanSession": true
  },
  "startupPriority": 20,
  "autoStart": true,
  "executionContext": "Service"
}
```

### プラグインのライフサイクル

* **起動:** エージェントがプラグイン実行ファイルを起動するか、プロセス内コンポーネントを読み込みます。プラグインはMQTTにサブスクライブし、処理を開始します。
* **停止/再起動:** 管理者はローカル管理API経由でプラグインを停止または再起動できます (例: `POST /api/plugins/{name}/stop` または `/restart`)。`autoRestart: true` が設定されている場合、予期しない終了時にエージェントがプラグインを自動再起動します。
* **設定:** プラグイン設定は統合ストレージまたはプラグインJSONに保存できます。ポリシーまたはAPIで配信された更新は、反映にプラグインの再起動が必要な場合があります。

### MQTTサブスクリプションとパブリッシュ権限

プラグインはプラグインJSONでMQTTアクセスを宣言します。エージェントは起動時にこれらの宣言を読み込み、サブスクライブおよびパブリッシュ可能なトピックの制御に用います。

**主サブスクリプション:** すべてのプラグインは `Subscription` ブロックで主MQTTトピックを1つ宣言する必要があります。リクエストおよび制御メッセージ向けの主な受信トピックです。

```json
"Subscription": {
  "Topic": "KeeperPolicy",
  "Qos": 2,
  "CleanSession": true
}
```

**追加トピック権限:** プラグインは `metadata.mqttTopics` で追加のサブスクライブおよびパブリッシュ権限を宣言できます。

```json
"metadata": {
  "mqttTopics": {
    "subscribe": ["AuditMessage", "EventMessages"],
    "publish": ["KeeperLogger", "EventMessages"]
  }
}
```

エージェントは主サブスクリプショントピックと追加サブスクライブトピックを組み合わせて、プラグインの実効的なサブスクリプション集合を構成します。トピック検証はブローカーで適用され、登録で許可されたトピックに限りサブスクライブまたはパブリッシュできます。`subscribe` および `publish` 配列では、必要に応じてMQTTワイルドカード (`+` および `#`) を使えます。

## ジョブの登録

### ジョブの登録方法

ジョブは `Jobs/` ディレクトリ内のJSONファイルから検出されます。ジョブランナーは起動時およびファイル変更時にこのディレクトリをスキャンし、各JSONファイルを解析・検証してジョブを登録します。有効なジョブはスケジュールおよびイベントトリガーで利用可能になります。無効なファイルはスキップされ、エラーがログに記録されます。

* **場所:** `{approot}/Jobs/` (例: `C:\Program Files\KeeperPrivilegeManager\Jobs`)
* **ファイル名:** `{job-id}.json`。ファイル内の `id` フィールドは `.json` 拡張子を除いたファイル名と一致する必要があります

### ジョブにおける「登録」の意味

**登録済み**ジョブは読み込まれ、構造が有効で、ジョブランナーに認識されています。`enabled` が `true` で、宣言された `condition` を満たしていれば、トリガーが発生したときに実行されます。

**未登録**ジョブは、ファイルが存在しない、解析不能、または未読み込みの状態です。トリガーに関係なく実行されません。

ジョブを別手順で登録する必要はありません。有効な `{id}.json` を `Jobs/` ディレクトリに置くだけで十分です。次回の再スキャンまたは再起動でジョブランナーが取り込みます。ジョブはHTTP API (`POST /api/Jobs`、`PUT /api/Jobs/{id}`) から作成・更新することもでき、JSONの書き込みとラストノウングッドストアの更新が一度に行われます。ラストノウングッドが有効な場合は、ファイルを直接置くより API または `JobUpdate` ポリシーを優先してください。手編集したファイルは元に戻る場合があります。詳しくは[カスタムジョブ統合ガイド](/keeperpam/jp/endpoint-privilege-manager/integrations/custom-job-guide.md#author-the-job-json)をご参照ください。

### ジョブの読み込み順と優先

ジョブの読み込み順序は保証されません。ジョブ間の依存関係は `events` と `alternateJobId` で表現し、読み込み順序に依存しないでください。

同一のジョブ `id` が複数のソースに存在する場合 (例: ファイルとAPIの両方)、エージェントの最終更新優先の挙動により、どの定義が有効かが決まります。曖昧さを避けるため、ファイル (ポリシー管理) または API のいずれか一方を正とするソースにしてください。

#### MQTTサブスクリプションとパブリッシュ権限

MQTTで通信する必要があるジョブタスクは、個々のタスク定義の内側ではなく、ジョブルートオブジェクトの `mqttTopics` ブロックでトピック権限を宣言します。

```json
"mqttTopics": {
  "allowedPublications": ["KeeperLogger"],
  "allowedSubscriptions": []
}
```

`mqttTopics` が少なくとも1エントリ付きで存在する場合、エージェントはタスクプロセスを起動する前に `KEEPER_JOB_ID` と `KEEPER_JOB_NAME` を環境変数として注入します。接続用の正しいMQTTクライアントIDを構成するために必要です。

ブローカーは実行時に `allowedPublications` と `allowedSubscriptions` を適用します。MQTT接続自体が成功していても、宣言リストにないトピックへのpublishまたはsubscribeは拒否されます。適用モデル全体およびプラグイン宣言との比較については、[ジョブとプラグイン: MQTTトピックの権限](/keeperpam/jp/endpoint-privilege-manager/reference/job-and-plugin-mqtt-topic-permissions.md)をご参照ください。

## まとめ

<table data-header-hidden="false" data-header-sticky><thead><tr><th width="223.814697265625"></th><th width="246.4444580078125">プラグイン</th><th>ジョブ</th></tr></thead><tbody><tr><td>構成ファイル</td><td><code>Plugins/{PluginName}.json</code></td><td><code>Jobs/{job-id}.json</code></td></tr><tr><td>検出</td><td>起動時に <code>Plugins/</code> からスキャン</td><td>起動時に <code>Jobs/</code> からスキャン、ファイル変更時も再スキャン</td></tr><tr><td>MQTT権限</td><td><code>Subscription</code> + <code>metadata.mqttTopics</code></td><td>ジョブルートの <code>mqttTopics</code></td></tr><tr><td>ライフサイクル管理</td><td><code>autoStart</code>、<code>requiresMonitoring</code>、<code>autoRestart</code></td><td><code>schedule</code>、<code>events</code>、またはAPIによるトリガー</td></tr><tr><td>新規コンポーネントの追加</td><td>JSONとバイナリを配置し、エージェントを再起動</td><td><code>Jobs/</code> にJSONを配置、または <code>POST /api/Jobs</code> を使用</td></tr></tbody></table>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.keeper.io/keeperpam/jp/endpoint-privilege-manager/reference/plugin-and-job-registration.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
