For the complete documentation index, see llms.txt. This page is also available as Markdown.

Windows 上でリモートアクション用スクリプトを作成する

この記事で説明している操作の実行にサポートが必要な場合は、Nexthink 認定パートナーにお問い合わせください。

この記事では、Windows 上で Nexthink のリモートアクション スクリプトを準備する手順について詳しく説明します。 スクリプトは Microsoft のスクリプト言語である PowerShell(Windows .NET Framework 上に構築)で記述され、その後セキュリティ確保のために証明書で署名されます。 PowerShell スクリプトはタスクの自動化や構成管理に適しており、従業員デバイス上でリモートアクションを実行できるようにします。

リモートアクションの主なユースケースには、デバイスからのオンデマンドデータ収集、自己修復タスク、構成設定の変更などがあります。

この記事では、読者が PowerShell スクリプトに精通していることを前提としています。

スクリプトを安全に実行する方法については、Nexthink Security の Remote Actions security best practices を参照してください。

スクリプトの作成

汎用スクリプトと入力変数

署名済みスクリプトのカスタマイズが必要な状況では、汎用スクリプトが便利です。 署名済みスクリプトを修正すると署名が無効になりますが、汎用スクリプトはパラメーターを使用してカスタマイズでき、署名を維持できます。

PowerShell スクリプトの先頭で形式パラメーターを宣言し、スクリプトを汎用化します。 関連するリモートアクションを編集する際、パラメーター値は Nexthink Web インターフェイスで変更できます。

たとえば、汎用的なレジストリキーを読み込むスクリプトを作成するには、レジストリ内のキーへのパスを含むパラメーターをスクリプト内で宣言します。 複数のリモートアクションが同じスクリプトを使用し、異なるレジストリキーを読み込むことができます。その場合、スクリプト内のパラメーターに異なるパスを指定します。

param(
    [string]$filePath,
    [string]$regPath
)

リモートアクション構成時にスクリプトをアップロードすると、システムはインポートされた PowerShell スクリプトのパラメーターを認識し、パラメーター セクションに一覧表示します。 各パラメーター名の右側に表示されるテキスト入力欄に実際の値を入力します。

実際の値は常にテキストとしてスクリプトに渡されます。スクリプトで string 以外の型のパラメーターを宣言している場合は、スクリプトが期待される型に変換できる値を指定してください。

出力変数の作成

スクリプトの実行により、オンデマンドデータとして保存したい出力が生成される場合があります。 Nexthink は .NET アセンブリ(nxtremoteactions.dll)を提供しており、これは Collector と同時に従業員デバイスにインストールされます。 このアセンブリには Nxt クラスが含まれており、結果をデータレイヤーに書き込むためのメソッドを提供します。

Nxt クラスを使用するには、リモートアクション用 PowerShell スクリプトの先頭に次の行を追加します。

Nxt クラスのメソッドを使用して、必要な出力を書き込みます。 すべての書き込みメソッドは、出力名と書き込む値の 2 つの引数を受け取ります。 たとえば、ファイルサイズをデータレイヤーに書き込む場合:

リモートアクション構成時にスクリプトをアップロードすると、システムはスクリプト内の出力書き込み呼び出しを認識し、スクリプト本文下の 出力 セクションに出力変数を一覧表示します。 調査やメトリクスで参照できるように、出力のラベルを設定します。

各書き込みメソッドの末尾は、出力の種類を示します。 利用可能なメソッドと、書き込む値に対応する PowerShell 型の一覧は次の表で確認できます。

Nxt 書き込みメソッド
PowerShell 型
制約

WriteOutputString

[文字列]

0 ~ 1024 バイト(大きい場合は出力が切り捨てられます)

WriteOutputBool

[bool]

true / false

WriteOutputUInt32

[uint32]

  • 最小: 0

  • 最大: 4 294 967 295

WriteOutputFloat

[float]

  • 最小: -3.4E+38

  • 最大: 3.4E+38

WriteOutputSize

[float]

  • 最小: 0

  • 最大: 3.4E+38

WriteOutputRatio

[float]

WriteOutputBitRate

[float]

WriteOutputDateTime

[DateTime]

DD.MM.YYYY@HH:MM

WriteOutputDuration

[TimeSpan]

  • 最小: 0 ms

  • 最大: 49 日

  • ミリ秒単位の精度

WriteOutputStringList

[string[]]

string と同様

出力フィールドの定義

スクリプトを作成するときは、必ず次の点を確認してください:

  • すべての出力フィールド名を事前に定義する: これにより、スクリプトの実行中に出力テーブルの正しいフィールドが確実に入力されます。 predefined な field 名がない場合、script は output schema が不明なため失敗する可能性があります。

    • 出力フィールド名は常にstring形式である必要があります。

    • 例: [Nxt]::WriteOutputString('Output_Field_Name', $Output_Value)

  • 出力フィールドの数を定義する: スクリプトでは常に、固定数の出力フィールドを指定する必要があります。 固定スキーマにより、結果の予測可能性と互換性が確保されます。

    • 動的なフィールドを避けてください。 動的な出力構造は、プラットフォームにおける不整合や処理エラーを引き起こす可能性があります。

    • スクリプトを実行する際に、出力フィールドを定義するためにループを使用することは避けてください。

キャンペーンの実装

リモートアクションとキャンペーンを組み合わせて、従業員が自立して問題を解決できるようにします。 キャンペーンを使用すると、問題が検出されたことを従業員に通知し、その解決に向けて案内できます。

デバイスを操作している従業員のデスクトップにキャンペーンを表示するには:

  • キャンペーンには リモートアクション のトリガーがあり、公開されている必要があります。

  • リモートアクションのスクリプトは、次のいずれかの方法で実行できます。

    • アクションに特別な権限が不要な場合は、従業員のコンテキストで実行されます。

    • ローカル システム アカウントのコンテキストで、アクションに管理者特権が必要な場合。

キャンペーン識別子の取得

リモートアクションからキャンペーンを実行するためのメソッドでは、引数としてキャンペーン識別子を渡す必要があります。 キャンペーンの NQL ID(推奨)とキャンペーンの UID(従来のオプション)の両方を使用できます。

NQL ID を識別子として使用するには、Collector バージョン 23.5 以降が必要です。

キャンペーン識別子をリモートアクションに渡すには、必要な各キャンペーンごとに、リモートアクションのスクリプト内でパラメーターを宣言します。 リモートアクションを編集する際、パラメーターの実際の値として NQL ID(または UID)を使用します。

NQL ID またはキャンペーンの UID を取得する方法については、Triggering a campaign のドキュメントを参照してください。

リモートアクションのスクリプトからキャンペーンを実行する

キャンペーンと連携するには、リモートアクションスクリプトが .NET アセンブリ(nxtcampaignaction.dll)を読み込む必要があります。このアセンブリは Collector と共に従業員デバイスにインストールされます。 このアセンブリには Nxt.CampaignAction クラスが含まれており、キャンペーンの実行を制御し、従業員の回答を取得するためのメソッドを提供します。

アセンブリを読み込むには、スクリプトの先頭に次の行を追加します。

キャンペーンを制御する Nxt.CampaignAction のメソッドは以下のとおりです。

campaignUid で識別されるキャンペーンを実行し、従業員が回答を完了するまで待機します。 campaignUid の引数には UID または NQL ID(推奨)のいずれかを指定できます。 回答は NxTrayResp 型のオブジェクトとして返されます。

campaignUid で識別されるキャンペーンを実行し、従業員の回答完了、または timeout(秒)で指定された時間が経過するまで待機します。 campaignUid の引数には UID または NQL ID(推奨)のいずれかを指定できます。 回答は NxTrayResp 型のオブジェクトとして返されます。

campaignUid で識別されるキャンペーンを実行します。 campaignUid の引数には NQL ID(推奨)または UID のいずれかを指定できます。

NxTrayResp 型の応答オブジェクトが与えられた場合、このメソッドはキャンペーンのステータスを示す文字列を返します。 ステータスとして返される可能性のある値:

  • 完全: 従業員はキャンペーンの質問に完全に回答しました。

  • declined:従業員はキャンペーンへの参加を辞退しました。

  • postponed:従業員はキャンペーンへの参加に同意しました。

  • timeout:従業員が回答を完了する前にキャンペーンがタイムアウトしました。

  • connectionfailed:Collector コンポーネント間の通信エラーにより、スクリプトがキャンペーン通知を制御する Collector コンポーネントに接続できませんでした。

  • notificationfailed:スクリプトが次のいずれかの理由によりキャンペーンを正常に表示できませんでした:

    • キャンペーンが存在しない、または未公開のため、プラットフォームからキャンペーン定義を取得できませんでした。

    • 別のキャンペーンが従業員にすでに表示されています。

    • フォーカス保護またはCollectorの「通知しない」ルールにより、非緊急のキャンペーンを表示できません。 詳細については、キャンペーンの受信率を制限するドキュメントを参照してください。

NxTrayResp 型の応答オブジェクトと、キャンペーン内の質問を識別するラベルが与えられた場合、このメソッドは従業員の回答を返します。

  • 単一回答質問の場合、返される文字列配列には 1 要素のみが含まれます。

  • 複数回答質問の場合、返される文字列配列には従業員が選択した回答の数だけ要素が含まれます。 任意入力の自由記述テキストは無視されます。

  • 従業員がキャンペーンに完全回答していない場合(例:ステータスが fully ではない場合)、返される文字列配列は空になります。 任意入力の自由記述テキストは無視されます。

スクリプトのエンコード

PowerShell スクリプトファイルは UTF-8(BOM 付き)でエンコードする必要があります。 BOM はファイル先頭に配置される必要がある Unicode 文字であり、UTF-8 では 16 進表記で EF BB BF の 3 バイト列として表されます。

Windows では、各コード行の末尾は CR+LF で終わる必要があります。

エラーやスクリプトの不具合を防ぐため、適切なエンコードを使用してください。


コード例

<0>キャンペーンの呼び出し</0>

この例では、リモートアクションが ID を使用して基本的なキャンペーン呼び出しを実行し、成功した場合はステータスメッセージを、失敗した場合はエラーメッセージを出力します。

キャンペーンレスポンスへのアクセス

この例では、リモートアクションがキャンペーンの回答データを要求し、配列として出力します。 各回答は、それぞれ対応する番号付きオプションで表されます。 PowerShell ではインデックスが 0 から n-1 である点に注意してください。

<0>タイムアウト付きでキャンペーンを実行する</0>

この例では、リモートアクションが、秒を入力として指定した時間後にタイムアウトし終了するキャンペーンを実行するよう設定されています。

<0>非ブロッキングキャンペーンの実行</0>

この例では、リモートアクションはユーザー入力を必要とせず、キャンペーンをトリガーした後も実行を続けます。 ユーザーはいつでもキャンペーンを閉じることができます。 これは主に、データを取得するのではなく、ユーザーに情報を提供するために使用されます。

特定のキャンペーン回答に応じてアプリケーションを開く

この例では、リモートアクションスクリプトが Collector と共にデバイスにインストールされる .dll ファイルを読み込み、Collector とリモートアクション実行の仲介役として機能します。 これにより、PowerShell スクリプトから Collector へコマンドが送信され、[Nxt.CampaignAction] で始まる専用関数が利用可能になります。

リモートアクションは Nxt.CampaignAction]::RunCampaign 関数を使用し、キャンペーン ID とタイムアウト(秒)を入力としてキャンペーンを実行します。 次に、ユーザーの回答(または未回答)を収集し、そのデータを基にステータスを判断します。 ユーザーが yes と回答した場合、リモートアクションはプロセスを開始します。この例では Notepad が起動します。

特定のアプリケーションがデバイスに存在するかの確認

この例では、リモートアクションが、入力として指定されたアプリケーション名がデバイス上に存在するかを Kanopy を使用して確認します。

デバイス上に特定のアプリケーションが存在するかどうかの確認:エラー処理

この例では、Remote action がアプリケーションログのパスとエラーコードを入力として使用し、指定されたエラーコードをログから解析します。 このコードが存在する場合、エラーメッセージを出力します。

デバイスに特定のアプリケーションが存在するかを確認する: エラー修復

この例では、リモートアクションはキャンペーンを使用して、アプリケーションがすでに実行中の場合は再起動が必要であることをユーザーに通知し、実行中でない場合は起動します:


スクリプトの署名

Nexthinkでは、本番環境ですべてのスクリプトに署名することを推奨しています。 署名されていないスクリプトは、テスト環境でのみ使用してください。

証明書の取得

PowerShell スクリプトに署名するには、以下のように Set-Authenticode コマンドを使用します:

  1. コード署名証明書は以下から取得します:

  2. 証明書を使用して、たとえばremoteaction.ps1などのリモートアクション用スクリプトに署名します。 証明書の有効期限後も機能し続けるように、タイムスタンプを追加します。 以下の例では、DigiCertタイムスタンプサーバーを使用しています。 Set-AuthenticodeSignature -FilePath .\remoteaction.ps1 -Certificate $cert -IncludeChain All -TimestampServer "http://timestamp.digicert.com"

  3. (任意)スクリプト内の署名を検証します。 Get-AuthenticodeSignature .\remoteaction.ps1 -Verbose | fl

エンドポイントへの証明書の展開

デフォルトポリシー(signed_trusted_or_nexthink)では、Nexthink Libraryの公式リモートアクションを、追加設定なしでデバイス上で実行できます。

リモートアクション用に独自のスクリプトを作成して署名する場合は、Microsoft Windowsのローカル コンピューター > 信頼された発行元証明書ストアに署名証明書を追加してください。

厳格なsigned_trustedポリシーを使用する場合は、ライブラリおよびシステムスクリプトに独自の証明書で再署名するか、Nexthinkコード署名証明書をMicrosoft Windowsのローカル コンピューター > 信頼された発行元証明書ストアに展開できます。

証明書が、Windowsのローカル コンピューターの信頼されたルート証明機関証明書ストアにルート証明書がまだ存在しないプライベートCAによって生成された場合は、ルート証明書が追加されていることを確認してください。

スクリプトの署名に中間証明書を使用した場合は、ローカルコンピューターの「中間証明機関」証明書ストアに中間証明書の完全なチェーンを含めてください:

  1. Microsoft Windows に管理者としてログインします。

  2. Win+R キーを押して[ファイル名を指定して実行]ダイアログを開きます:

    1. certlm.msc と入力します。

    2. OK をクリックします。

  3. プログラムにデバイスへの変更を許可するために はい をクリックします。

  4. 左側の一覧で、目的の証明書ストア(例:信頼された発行元)の名前を右クリックします。

    1. コンテキストメニューから すべてのタスク > インポート... を選択して証明書のインポートウィザードを開始します。

  5. ウィザードを開始するために 次へ をクリックします。

  6. 参照 をクリックして証明書ファイルを選択します。

  7. 次へ をクリックします。

  8. [次のストアに証明書をすべて配置する]ダイアログで提案された証明書ストアを受け入れるために 次へ をクリックします。

  9. インポートする証明書を確認し、完了 をクリックします。

Certificates

Nexthink は、グループポリシーオブジェクト(GPO)や Microsoft Intune ポリシーなどの管理ツールを使用して、すべてのデバイスに同時に証明書を展開することを推奨しています。

スクリプトの保守

比較と検証

リモートアクションスクリプトを展開する前に、Nexthink が作成した他のスクリプトと比較することができます。 この手順は任意ですが、初めてスクリプトを準備する場合は推奨されます。

  1. Nexthink Library で Content を選択します。

  2. Remote action でフィルタリングします。

  3. Remote Actions の管理ページに移動します。

  4. ターゲットのオペレーティングシステムに一致する、Nexthink Library から直接インストールされた任意のリモートアクションスクリプトを選択します。

  5. スクリプトをエクスポートし、自身のスクリプトと構文を比較します。

エラー処理

Nexthink は、スクリプトを実行した PowerShell プロセスの戻り値に基づいてリモートアクションの実行が成功したかどうかを判定します:

  • 終了コードが 0 の場合、実行は成功です。

  • 0 以外の値はエラーを示します。

PowerShell の未処理例外により、スクリプトが適切な終了コードを返さずに終了する場合があります。 予期しないエラーに対処するため、Nexthink はすべてのスクリプトの本文を次のコードスニペットで開始することを推奨しています:

このデフォルトのエラーハンドラーは、必要な DLL 依存関係の読み込みの後、任意の形式パラメーター宣言の下に配置してください。

パフォーマンス測定

スクリプトのパフォーマンスとリソース使用量を測定するには、Collector configuration ツールを使用して、Collector のログをデバッグモードで有効にします:

出力は nxtcod.log ファイルに保存されます。

最終更新

役に立ちましたか?