Windowsでのリモートアクション用スクリプトの作成
この記事では、Windows上でNexthinkリモートアクションスクリプトを準備するプロセスの詳細について説明します。 スクリプトは、Windows .NET Framework上に構築されたMicrosoftのスクリプト言語であるPowerShellで作成され、その後、安全性を確保するために証明書で署名されます。 PowerShellスクリプトは、タスクの自動化や構成管理に適しており、従業員のデバイスでリモート操作を実行することができます。
リモートアクションの主な使用事例は、デバイスからのオンデマンドデータ収集、自己修復タスク、構成設定の変更です。
この記事は、読者がPowerShellスクリプト作成に精通していることを前提としています。
スクリプトの作成
汎用スクリプトと入力変数
汎用スクリプトは、署名済みスクリプトにカスタマイズが必要な状況で役立ちます。 署名済みスクリプトを変更すると署名が無効になりますが、汎用スクリプトはパラメーターを通してカスタマイズでき、署名を保持します。
PowerShellスクリプトの冒頭で形式的なパラメーターを宣言し、それを汎用化します。 関連するリモートアクションを編集するとき、パラメーターの値はNexthinkのwebインターフェース内で変更できます。
たとえば、汎用的なレジストリキーから読み込むスクリプトを作成するには、レジストリ内のキーへのパスを含むパラメーターをスクリプトで宣言します。 複数のリモートアクションがスクリプト内のパラメーターに異なるパスを指定することにより、異なるレジストリキーからデータを読み取るために同じスクリプトを使用できます。
param(
[string]$filePath,
[string]$regPath
)
リモートアクションの構成中にスクリプトをアップロードすると、システムは任意のインポートされたPowerShellスクリプトのパラメーターを認識し、パラメーターセクションに一覧表示します。 各パラメーター名の右側に表示されるテキスト入力ボックスに実際の値を入力します。
出力変数の作成
スクリプトを実行すると、オンデマンドデータとして保存したい出力が生成されることがあります。 Nexthinkは.NETアセンブリ(nxtremoteactions.dll
)を提供しており、これはCollectorと同時に社員のデバイスにインストールされます。 このアセンブリには、結果をデータ層に書き込むためのメソッドを提供するNxtというクラスが含まれています。
Nxtクラスを使うには、リモートアクションのためのPowerShellスクリプトの冒頭に次の行を追加します:
Add-Type -Path $env:NEXTHINK\RemoteActions\nxtremoteactions.dll
Nxtクラスのメソッドを使って、望む出力を書き込みます。 すべての書き込みメソッドは2つの引数を受け入れます:出力の名前と書き込む値です。 例えば、ファイルサイズをデータ層に書き込むには:
[Nxt]::WriteOutputSize("FileSize", $fileSize)
リモートアクション設定中にスクリプトをアップロードすると、システムはスクリプト内での出力書き込みの呼び出しを認識し、スクリプトテキストの下の** Outputs **セクションに出力変数を一覧表示します。 調査やメトリックで参照する際の方法を示すように出力のラベルを設定します。
書き込まれた各メソッドの終了は出力の種類を示します。 使用可能なメソッドと書き込む値の対応するPowerShellのタイプを以下の表で見つけてください:
WriteOutputString
[string]
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
[浮動小数点]
WriteOutputDateTime
[DateTime]
DD.MM.YYYY@HH:MM
WriteOutputDuration
[TimeSpan]
最小: 0 ms
最大: 49日
ミリ秒単位の精度
WriteOutputStringList
[string[]]
Stringと同様
キャンペーンの実施
リモートアクションをキャンペーンと組み合わせて、社員が問題を自主的に解決できるようにします。 キャンペーンにより、問題の検出について社員に知らせ、その解決を案内できます。
デバイスを操作中の社員のデスクトップにキャンペーンを表示させるには:
キャンペーンはリモートアクショントリガーを持ち、公開されている必要があります。
リモートアクションのスクリプトは次のいずれかで実行できます:
アクションが特別な権限を必要としない場合、社員のコンテキストで。
アクションが管理特権を必要とする場合、ローカルシステムアカウントのコンテキストで。
キャンペーン識別子の取得
リモートアクションからキャンペーンを実行するメソッドには、引数としてキャンペーン識別子を渡す必要があります。 キャンペーンのNQL ID(<し>推奨)およびキャンペーンUIDの両方を使用できます。
リモートアクションにキャンペーン識別子を渡すには、リモートアクションのスクリプトで必要なそれぞれのキャンペーンのパラメーターを宣言します。 リモートアクションを編集する際、実際の値としてNQL ID(<し>またはUID)をパラメーターに使用します。
キャンペーンのNQL IDまたはUIDを取得する方法の詳細は、キャンペーンをトリガーするドキュメントを参照してください。
リモートアクションのスクリプトからキャンペーンを実行する
キャンペーンとインタラクションするには、リモートアクションスクリプトは、Collectorと共に社員のデバイスにインストールされた.NETアセンブリ(<し>nxtcampaignaction.dll
)をロードする必要があります。 このアセンブリには、キャンペーンの実行を制御し、社員の回答を取得するメソッドを提供するNxt.CampaignActionクラスが含まれています。
アセンブリをロードするには、スクリプトの冒頭に次の行を追加します:
Add-Type -Path $env:NEXTHINK\RemoteActions\nxtcampaignaction.dll
Nxt.CampaignActionのメソッドでキャンペーンを制御します。
[nxt.campaignaction]::RunCampaign(string campaignUid)
campaignUid
で識別されるキャンペーンを実行し、社員がキャンペーンに答え終えるまで待機します。 campaignUid
引数には、UIDまたはNQL ID(<し>推奨)を含めることができます。 NxTrayResp
型のオブジェクトで応答を返します。
[nxt.campaignaction]::(string campaignUid, int timeout)
campaignUid
で識別されるキャンペーンを実行し、社員がキャンペーンに答え終わるか、指定されたtimeout
(<し>秒単位)で終了するまで待機します。 campaignUid
引数には、UIDまたはNQL ID(<し>推奨)を含めることができます。 NxTrayResp
型のオブジェクトで応答を返します。
[nxt.campaignaction]::RunStandAloneCampaign(string campaignUid)
campaignUid
で識別されるキャンペーンを実行します。 campaignUid
引数には、NQL ID(<し>推奨)またはUIDを含めることができます。
string GetResponseStatus(NxTrayResp response)
NxTrayResp
型の応答オブジェクトに基づいて、キャンペーンのステータスを反映した文字列を返すメソッドです。 ステータスの可能な値:
fully:社員がキャンペーンの質問に完全に回答しました。
declined:社員がキャンペーンへの参加を辞退しました。
postponed:社員がキャンペーンへの参加に同意しました。
timeout:システムが社員の回答が完了する前にキャンペーンをタイムアウトしました。
connectionfailed:Collectorコンポーネント間の通信の技術的エラーにより、キャンペーン通知を制御するCollectorコンポーネントに接続できませんでした。
notificationfailed:スクリプトがキャンペーンを正常に表示できませんでした。以下の理由のいずれか:
キャンペーンが存在しないか未発表のため、プラットフォームからキャンペーンの定義を取得できませんでした。
別のキャンペーンがすでに社員に表示されています。
非緊急対応キャンペーンは、Collectorの集中保護または「取り込み禁止」ルールのため表示できません。 詳細は、キャンペーンの受信率を制限するドキュメントを参照してください。
string[] GetResponseAnswer(NxTrayResp response, string questionLabel)
NxTrayResp
型の応答オブジェクトとキャンペーン内の質問を識別するラベルを指定すると、社員の回答を返すメソッドです。
単一回答の質問の場合、返された文字列配列には一つの要素しかありません。
複数回答の質問の場合、返される文字列配列には、社員が選択した回答の数だけ要素が含まれます。 任意の自由テキストは無視されます。
社員がキャンペーンに完全に回答していない場合、たとえばステータスが
fully
でない場合、返される文字列配列は空になります。 任意の自由記述テキストは無視されます。
セキュリティ上の理由から、セルフヘルプシナリオのためのリモートアクションは、複数回答または意見スケール質問のオプションの自由テキスト回答を無視します。 セルフヘルプシナリオで使用すべきキャンペーンにオプションの自由テキスト回答を含めることは役立ちません。
スクリプトのエンコード
PowerShellスクリプトファイルは、バイトオーダー・マーク(<し>BOM)付きのUTF-8でエンコードされていなければなりません。 BOMはファイルの冒頭に存在する必要があるUnicode文字であり、そのUTF-8での表現は3バイトの16進シーケンスEF BB BF
です。
各コード行はWindowsではCR+LF
という文字シーケンスで終わらなければなりません。
適切なエンコーディングを確保して、エラーやスクリプトの不具合を回避してください。
コード例
スクリプトに署名する
証明書を取得する
PowerShellスクリプトに署名するには、Set-Authenticode コマンドを次のように使用します:
次の方法でコード署名証明書を取得します:
PowerShell証明書プロバイダー:
$cert = Get-ChildItem -Path Cert:\CurrentUser\My -CodeSigningCert
PFXファイル:
$cert = Get-PfxCertificate -FilePath C:\Test\Mysign.pfx
証明書を使用して、リモートアクション用スクリプト、例えば
remoteaction.ps1
に署名します。 証明書の有効期限が切れた後も機能するようにタイムスタンプを追加します。 以下の例ではDigiCertのタイムスタンプサーバーを使用しています:Set-AuthenticodeSignature -FilePath .\remoteaction.ps1 -Certificate $cert -IncludeChain All -TimestampServer "http://timestamp.digicert.com"
(オプション)スクリプト内の署名を確認します。
Get-AuthenticodeSignature .\remoteaction.ps1 -Verbose | fl
プライベート認証局(CA)を使用する場合、キャッシュによるサーバーの過負荷を避けるため、最良のOCSPプラクティスを使用していることを確認してください。
エンドポイントへの証明書の展開
デフォルトのポリシー(signed_trusted_or_nexthink
)では、追加の設定なしにデバイスでNexthinkライブラリからの公式なリモートアクションを実行できます。
より厳格なsigned_trusted
ポリシーを使用する場合、ライブラリおよびシステムスクリプトを独自の証明書で再署名するか、Nexthinkコード署名証明書をローカル コンピュータ > 信頼された発行元の証明書ストアに配布できます。
コード署名証明書をWindowsのローカル コンピュータ > 信頼された発行元ストアに追加しない場合、システムは次のエラーを生成します: リモートアクションを実行できませんでした:スクリプト署名が無効であるか、証明書が信頼されていません。
プライベートCAによって生成された証明書のルート証明書がWindowsのローカル コンピュータの信頼されたルート証明機関の証明書ストアにすでに存在しない場合、追加することを確認してください。
スクリプト署名に中間証明書を使用した場合、中間証明書チェーン全体をWindowsのローカル コンピュータの中間証明機関の証明書ストアに含めます:
管理者としてMicrosoft Windowsにログインします。
Win+Rキーを押して実行ダイアログを開きます:
certlm.mscと入力します。
OKをクリックします。
プログラムがデバイスを変更することを許可するために、はいをクリックします。
左側のリストで、望む証明書ストアの名前、例えば信頼された発行元を右クリックします。
コンテキストメニューからすべてのタスク > インポート... を選択して、証明書インポートウィザードを開始します。
ウィザードを開始するには次へをクリックします。
参照をクリックして、証明書ファイルを選択します。
次へをクリックします。
次へをクリックして、以下のストアにすべての証明書を配置ダイアログウィンドウで提案された証明書ストアを受け入れます。
インポートする証明書を確認し、完了をクリックします。

スクリプトの維持管理
比較と検証
リモートアクションスクリプトをデプロイする前に、Nexthinkによって準備された他のスクリプトと比較することが可能です。 このステップは任意ですが、初めてスクリプトを準備する場合に推奨されます。
Nexthinkライブラリで、コンテンツを選択します。
リモートアクションでフィルターします。
リモートアクション管理ページに移動します。
ターゲットのオペレーティングシステムに一致するNexthinkライブラリから直接インストールされたリモートアクションスクリプトを選択します。
スクリプトをエクスポートし、その構文をあなたのスクリプトのものと比較します。
エラーハンドリング
Nexthinkは、スクリプトを実行したPowerShellプロセスの戻り値に基づいて、リモートアクションの実行が成功したかどうかを検出します:
終了コードの値が0の場合、正常に実行されたことを示します。
ゼロ以外の値はエラーを示します。
PowerShell内の未処理の例外は、適切な終了コードを返すことなくスクリプトを終了させる可能性があります。 予期しないエラーを処理するために、すべてのスクリプトの冒頭に次のコードスニペットを追加することをNexthinkは推奨しています:
trap {
$host.ui.WriteErrorLine($_.ToString())
exit 1
}
必須パラメータの宣言後、必要なDLL依存項目を含む部分の直下にこのデフォルトのエラーハンドラーを配置します。
パフォーマンス測定
お使いのスクリプトのパフォーマンスとリソース消費を測定するには、Collectorの構成ツールを使用して、Collectorのデバッグモードのログをオンにしてください:
nxtcfg.exe /s logmode=2
出力はnxtcod.logファイルに保存されます。
Last updated
Was this helpful?