適当おじさんの適当ブログ

技術のことやゲーム開発のことやゲームのことなど自由に雑多に書き連ねます

Intune で PowerShell スクリプトを実行したときのメモ

Intuneでは専用のポリシーを作成することで、PowerShellスクリプトを管理用デバイスに配布・実行させることができます。PowerShellスクリプトを用いることで、「構成プロファイル」で提供されていない設定をデバイスに適用できたりして非常に便利です。

これらの機能を雰囲気で利用していたので、改めて調べ直した時のメモです。

スクリプト ポリシーについて

Microsoft Endpoint Manager でポリシーを作成することで、PowerShellスクリプトを管理デバイスに配布できます。

f:id:subarunari:20200804162902p:plain

スクリプトの場所 には、作成したスクリプトを指定します。現時点では200KBまでです。一度アップロードしたスクリプトの内容をWeb画面で後から確認することはできません。Graph API を利用することで確認可能です(参考URL)

このスクリプトをログオンしたユーザーの資格情報を使用して実行する は、スクリプトを「ユーザー」と「システム」のどちらのコンテキストで実行するかを選択します。デフォルトではシステムコンテキストです。ユーザー固有の環境変数などを利用したい場合はユーザーコンテキストを利用します。レジストリ値 HKCU を変更したい場合などはユーザーコンテキストで実行してやる必要があります。ただし、ユーザーが管理者権限を持たない場合、管理者権限が必要なコマンドの実行に失敗してしまう可能性があります。どちらのコンテキストにするかはスクリプトの内容次第です。

スクリプト署名チェックや64ビット実行も必要に応じて設定します。

このポリシーによって管理デバイスに PowerShell が配布されると、デバイスにインストールされた Intune Management Extension によって PowerShell が実行されます。

Intune Management Extension について

Intune Management Extension は Windows 10 の MDM機能 を補足するための機能です。Intune にマシンを参加/登録させると、Microsoft Intune Management Extension が自動的にインストールされ、サービスが起動します。セットアップのためにユーザーが追加の操作をする必要はありません。

Intune Management Extension がインストールされているかどうかは「プログラムの追加と削除」で確認できます。名前は「Microsoft Intune Management Extension」です。

f:id:subarunari:20200804152205p:plain

最近のバージョンであればほとんどサポート対象ですが、Sモードはサポートされていません。サポートされているバージョンの詳細は 公式ドキュメント - 前提条件 を参照してください。

仕様詳細

Microsoft Intune Management Extension という名前のサービスで稼働しています。管理ツール > サービス や 以下のようなPowershell でサービスの動作状態を確認できます。

> Get-Service "Microsoft Intune Management Extension"
Status   Name               DisplayName
------   ----               -----------
Running  IntuneManagemen... Microsoft Intune Management Extension

このサービスは、「実行する必要があるスクリプトがあるかを確認し、実行する必要がある場合にのみスクリプトを実行する」といった振る舞いをします。この確認処理は、1時間に1回定期的に行われます。また、サービス起動時にも同様の確認処理が行われます。スクリプトの動作検証をすぐにしたい場合は、手動でポリシーを適用してサービスを再起動してしまうのが手取り早いです。

スクリプトを実行する条件

新規のポリシーが適用された場合、無条件で実行されます。既存のポリシーの場合、以下のいずれかの変更をしていると実行されます。

  • 既存のポリシーのスクリプトを変更した
  • 既存のポリシーのスクリプト以外の設定項目を変更した

同じPowerShellスクリプトをアップロードして保存するだけでは実行されません。同じスクリプトをアップロードしたとしても、その他の設定項目が変更されている場合は実行されます。逆に言えばスクリプトを変更してなくても再度スクリプトが実行されてしまう可能性があります。冪等性がない場合に思わぬ問題を引き起こすかもしれません。

全く同じスクリプトを全く同じ設定で実行したい場合は、ポリシーを新しく作り直すのが間違いないかと思います。

スクリプトの実行回数について

配布されたスクリプトは1度だけ実行されます。他のポリシーのように定期的に実行されることはありません。

繰り返し実行させたい場合は、スクリプト内でタスクスケジューラーに定期実行タスクを登録したり、HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run を設定したりする必要があります。レジストリ値の詳細については Run and RunOnce Registry Keys に書かれていますので、そちらを参照してください。

スクリプトの実行結果について

スクリプトの実行結果は Microsoft Endpoint Manager上で「不明」「成功」「失敗」のいずれかで表示されます。「不明」はスクリプトがまだ実行されていない状態を表します。エラーストリームに書き込みがあると「失敗」扱いになり、そうでない場合は「成功」になっているようです。

以下のような場合に、エラーストリームへの書き込みが行われます。

  • Write-Error が実行された
  • Throw で明示的に例外を投げた
  • スクリプト内でなんらかの例外が発生した

エラーハンドリングが雑だと実行結果が「失敗」だらけになってしまう可能性があります。適切なエラーハンドリングを実装し、意識的に「成功」「失敗」にするようなスクリプトを作成することで実行結果が確認しやすくなります。ちなみに exit 1 とした場合は「成功」になります。実行結果に Exit Code は関係ないようです。

より細かいログを記録したい場合は、PowerShellスクリプト内で Start-Transcript 等でログを出力する必要があります。残念ながら現時点では Microsoft Endpoint Manager 上で詳細なログを一括で確認する手段はありません。

デバイスでの結果確認について

ユーザーコンテキストでスクリプトを実行すると、レジストリ HKEY_LOCAL_MACHINE¥SOFTWARE¥Microsoft¥IntuneManagementExtension¥<AzureADユーザーGUID>¥<スクリプトプロファイルのID> にスクリプトの実行結果が記録されます。ResultDetails という項目で出力結果を確認できます。

スクリプト実行条件を検証する際にこのレジストリを使いました。Write-Host (Get-Date) のような日時を出力するスクリプトを配布し、ResultDetailsの値を都度確認しました。

原因不明なエラーに直面&ログを記録していない場合に有用ですが、当然ながらデバイスにサインインしないと確認できません。デバイス全体を管理する身としては、Microsoft Endpoint Manager上で一括で実行ログを確認できる機能が欲しいところです。

まとめ

  • スクリプトは Intune Management Extension サービスによって実行される
  • スクリプトの実行は1回のみ
  • 即座にスクリプトを実行させたい場合は、ポリシー適用&サービス再起動をすれば良い
  • ユーザーコンテキストの場合、レジストリにログ出力される
  • スクリプトの実行結果をわかりやすくするために適切なエラーハンドリングを
  • 処理が複雑な場合は独自にログ出力する

今回の記事の内容はおおよそ以下の公式ドキュメント に書かれています。Intune でスクリプトを実行させたい方はぜひ一度ご一読を・・!

docs.microsoft.com