かつて山市良と呼ばれたおじさんのブログ

セイテクエンジニアのブログ  かつて山市良と呼ばれたおじさんのブログ  vol.103 スクリプトをWindowsデバイスで実行できる「修復」の活用ヒント|はじめてのIntune(14)

 

 

vol.103 スクリプトをWindowsデバイスで実行できる「修復」の活用ヒント|はじめてのIntune(14)

2025年04月24日配信
執筆者:山内 和朗

 前々回(vol.101)にIntuneのリモートアクション機能を紹介しましたが、今回はその中の1つ、Windowsデバイスでサポートされる「修復」機能について深堀します。

 

「修復」機能とは

 

 Windowsデバイスに対して利用できるリモートアクション機能の1つ、「修復(Remediations)」機能は、以前は「プロアクティブな修復(Proactive Remediations)」と呼ばれていたもので、エンドユーザーが問題に気付く前に、PowerShellのスクリプトパッケージを使用して、一般的なサポートの問題を検出し、自動修正するメカニズムを提供するものです。

 

修復|Microsoft Intune(Microsoft Learn)


 Intuneのテナントでは、Microsoft提供のもの(確認できているものは2つ)を含め最大200のスクリプトパッケージを使用することができ、各スクリプトパッケージは検出スクリプト、修復スクリプト、およびメタデータで構成されます。

 Intuneの管理者はPowerShellのスクリプトパッケージを作成して、グループ(またはすべてのデバイス)を使用してWindowsデバイスに割り当てることができ、一度または定期的に実行させ、その結果(検出/問題あり、および出力《PowerShellの成功/エラーストリーム》)を取得することができます。また、オンデマンドでスクリプトを実行させることもできます。ただし、オンデマンドの修復実行はプレビュー機能であることに注意してください。プレビュー機能は、機能が変更されたり、正式版になることなく削除される場合があります。

 

修復の前提条件

 修復機能は、Entra参加またはEntraハイブリッド参加でIntuneに登録された、Windows 10以降のPro以上のエディションで利用できますが、デバイスのユーザーには以下のいずれかのライセンスの割り当てが必要です。

 

  • Windows 10/11 Enterprise E3/E5
  • Windows 10/11 Enterprise A3/A5
  • Windows 10/11 Virtual Desktop Access(VDA)

 

 なお、スクリプトパッケージで「スクリプト署名チェックを強制」オプションを使用するのでない限り、WindowsデバイスのPowerShell実行ポリシー(クライアントOSの既定はRestricted)を変更する必要はありません。「スクリプト署名チェックを強制」オプションが有効になっていないスクリプトは、Bypass実行ポリシーを使用して、ユーザーまたはシステムによって実行されます。

 

使用例: 修復を使用してリモートデスクトップ接続を有効にする

 

 修復機能の本来の使用方法は、問題を検出し、それを自動修正することです。ここでは、リモートデスクトップ接続の許可(リモートからの接続の許可)の状態を検出スクリプトで調べ、無効になっている場合は、修復スクリプトで有効化する(Windowsファイアウォールの例外の許可を含む)ようにスクリプトパッケージを作成してみます。なお、WindowsデバイスのリモートデスクトップやWindowsファイアウォールの設定は、Intuneの「構成プロファイル」ポリシーを使用して変更することができます。修復機能の動作を理解するために、あえて修復機能で実装してみたものです。

 検出スクリプト「check-remotedesktop.ps1」と修復スクリプト「enable-remotedesktop.ps1」は、次のように記述しました。*1

[check-remotedesktop.ps1]プレーンテキストで表示)

if ((Get-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Terminal Server").fDenyTSConnections -eq 0) {
  Write-Host  "Remote Desktop: Enabled"
  exit 0
} else {
  Write-Host  "Remote Desktop: Disabled"
  exit 1
}

[enable-remotedesktop.ps1]プレーンテキストで表示)
Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Terminal Server" -Name "fDenyTSConnections" -Value 0
Enable-NetFirewallRule -Name "RemoteDesktop-UserMode-In-TCP"
Enable-NetFirewallRule -Name "RemoteDesktop-UserMode-In-UDP"
Enable-NetFirewallRule -Name "RemoteDesktop-Shadow-In-TCP"
exit 0

*1 修復スクリプトの「Enable-NetFirewallRule」の3行は、「Set-NetFirewallRule -DisplayGroup "リモート デスクトップ" -Enabled True」に置き換えることができます。その場合、「UTF-8」エンコードだと文字化けにより実行時にエラーとなってしまうため、「UTF-8(BOM付き)」エンコードで保存してください。「スクリプト署名チェックを強制」オプションを使用する場合は、「UTF-8(BOM付き)」ではなく、「UTF-8」である必要があるため、日本語は使用できません。

 この2つのスクリプトを作成し、「UTF-8」エンコード(メモ帳の既定)で保存したら、Microsoft Intune管理センターの「デバイス|スクリプトと修復」を開き、「+作成」をクリックしてスクリプトパッケージの作成を開始します(画面1)。最初の「① 基本」タブでは、スクリプトパッケージの名前を入力し、「次へ」ボタンをクリックします。

画面1 「デバイス|スクリプトと修復」を開き、「+作成」をクリックする。作成者「Microsoft」はMicrosoft提供の組み込みのスクリプトパッケージ
画面1 「デバイス|スクリプトと修復」を開き、「+作成」をクリックする。作成者「Microsoft」はMicrosoft提供の組み込みのスクリプトパッケージ

 「② 設定」タブでは、検出スクリプトファイルとして「check-remotedesktop.ps1」を、修復スクリプトファイルとして「enable-remotedesktop.ps1」をアップロードします。次の3つのオプションは既定(いいえ)のまま、「次へ」ボタンをクリックします(画面2)。


  • このスクリプトをログオンした資格情報を使用して実行する: いいえ
  • スクリプト署名チェックを強制: いいえ
  • 64ビットのPowerShellでスクリプトを実行: いいえ

 なお、最初のオプションを「はい」にすると、Windowsデバイスにサインインしているユーザーの資格情報でスクリプトが実行されます。「いいえ」(既定)の場合、サインインしているかいないかに関係なく、「システムアカウント」の権限でスクリプトが実行されます。

 

画面2 「カスタムスクリプトの作成」の「② 設定」タブで、検出スクリプトと修復スクリプトをアップロードする
画面2 「カスタムスクリプトの作成」の「② 設定」タブで、検出スクリプトと修復スクリプトをアップロードする

 「③ スコープ タグ」タブは、既定値のまま「次へ」ボタンをクリックします。「④ 割り当て」タブでは、デバイスやユーザーのグループを割り当てるか、「すべてのデバイス」または「すべてのユーザー」を選択し、実行スケジュールを調整します(画面3)。最後に、「⑤ 確認および作成」タブで「作成」ボタンをクリックし、スクリプトパッケージを作成します。

 

画面3 スクリプトパッケージをグループに割り当て、実行スケジュールを設定する
画面3 スクリプトパッケージをグループに割り当て、実行スケジュールを設定する

 スケジュールに従ってデバイスでスクリプトパッケージが実行されます。すべてのデバイスにスクリプトパッケージが展開され、その結果が返ってくるまでにはしばらく時間がかかります。実行状態やその結果は、スクリプトパッケージの「モニター|デバイスの状態」で確認することができます(画面4)。

 

画面4 スクリプトパッケージの実行結果は、問題の検出とその自動修正を示している
画面4 スクリプトパッケージの実行結果は、問題の検出とその自動修正を示している

 Intuneの修復機能は、検出スクリプトが「exit 0」終了した場合、検出の状態を「問題なし」として、修復スクリプトは実行しません。検出スクリプトが「exit 1」で終了した場合、修復スクリプトを実行します。今回、Windows 11の既定の状態、つまり、リモートデスクトップ接続が無効なデバイスに対して、スクリプトパッケージを展開しました。そのためすべてのデバイスの検出スクリプトは「問題あり」と評価され、修正スクリプトによって修正されました(画面5)。

 

画面5 修復機能により、リモートデスクトップ接続が有効化され、Windowsファイアウォールの受信規則が有効化された
画面5 修復機能により、リモートデスクトップ接続が有効化され、Windowsファイアウォールの受信規則が有効化された

 Intuneの修復機能は、スクリプトパッケージの検出スクリプトや修復スクリプトに、Write-HostやWrite-Errorの出力コマンドが含まれる場合、そのスクリプトの出力を確認する機能も提供しています。*2 スクリプトパッケージの「モニター|デバイスの状態」や、Windowsデバイスの「モニター|修復(プレビュー)」にある「↓エクスポート」をクリックすると、スクリプトの出力を含むCSVファイルをZIP形式でダウンロードすることができます。検出スクリプトの出力は「PreRemediationDetectionScriptOutput」列、エラー出力は「PreRemediationDetectionScriptError」列、修復スクリプトの出力は「PostRemediationDetectionScriptOutput」列、エラー出力は「PostRemediationDetectionScriptError」列で確認できます(画面6)。

 

画面6 スクリプトの出力(Write-HostやWrite-Error)は、エクスポートされたCSVで確認できる

画面6 スクリプトの出力(Write-HostやWrite-Error)は、エクスポートされたCSVで確認できる

 

*2 Intuneの以前の仕様では、スクリプトの出力はデバイスのレジストリ(HKEY_LOCAL_MACHINE¥SOFTWARE¥Microsoft¥Intune
ManagementExtension¥...」に書き込まれていたようで、インターネットを検索すると、その情報を取得するテクニックが紹介されていたりしますが、現在の仕様ではエクスポート機能で取得できるようになっています。

 

使用例: 仮想化ベースのセキュリティ(VBS)の状態をチェックする

 

 スクリプトパッケージの検出スクリプトは必須ですが、修復スクリプトは省略可能です。また、スクリプトパッケージの割り当てやスケジュールも必須ではありません。スクリプトパッケージは、割り当て状態に関係なく、特定のデバイスに対してオンデマンドで実行することができます(画面7)(オンデマンド修復はプレビュー機能です)。つまり、修復機能は、任意のPowerShellスクリプト(※ただし、再起動コマンドを含めることはできません)をデバイス上で実行し、その結果を取得するための手段としても利用できます。

 例えば、次のPowerShellスクリプト「check-vbs.ps1」は、仮想化ベースのセキュリティ(Virtualization-Based Security《VBS》)の状態を取得し、有効かつ実行中になっていれば「exit 0」つまり「問題なし」、有効になっているが実行中になっていない場合、および無効になっている場合は「exit 1」つまり「問題あり」を返します(画面8)。「問題あり」の場合の詳細な状態は、Write-Hostコマンドレットの出力結果を、エクスポート機能を使用して確認できます。

[check-vbs.ps1]プレーンテキストで表示)

$result = (Get-CimInstance -ClassName Win32_DeviceGuard -Namespace root\Microsoft\Windows\DeviceGuard).VirtualizationBasedSecurityStatus

switch ($result) {
  2 {
    Write-Host "Virtualization-Based Security: Enabled and Running"
    exit 0
  }
  1 {
    Write-Host "Virtualization-Based Security: Enabled but Not Running"
    exit 1
  }
  0 {
    Write-Error "Virtualization-Based Security: Disabled"
    exit 1
  }
}

画面7 スクリプトパッケージをオンデマンドで実行する(プレビュー機能)
画面7 スクリプトパッケージをオンデマンドで実行する(プレビュー機能)

 

画面8 仮想化ベースのセキュリティ(VBS)がすべてのデバイスで有効になっていることがわかる
画面8 仮想化ベースのセキュリティ(VBS)がすべてのデバイスで有効になっていることがわかる

 なお、仮想化ベースのセキュリティ(VBS)は、Intuneの「コンプライアンス」ポリシーを使用して準拠状態を確認することもできます。Intuneの「構成プロファイル」ポリシーを使用して有効化することもできます。

 

活用のヒントになるかもしれない、3つの簡単なサンプルスクリプト

 

 Intuneの修復機能を理解するのを手助けする、3つの簡単な検出スクリプト「demoscript_exit0.ps1」「demoscript_exit1.ps1」「demoscript_error.ps1」を用意しました。これらの検出スクリプトを含む3つのスクリプトパッケージ(修復スクリプトなし)を作成し、オンデマンド修復を使用してデバイスに展開してみましょう。検出スクリプトの内容と、「モニター|修復(プレビュー)」の検出の状態を比較すれば、EXITコードの意味を理解できるはずです。また、結果をCSVにエクスポートして確認すれば、Write-HostやWrite-Errorによる出力結果をIntuneから確認できることが分かるはずです(画面9)。

[demoscript_exit0.ps1]プレーンテキストで表示)

Write-Host("Compliant: This message for demo")
exit 0

[demoscript_exit1.ps1]プレーンテキストで表示)
Write-Host("Not Compliant: This message for demo")
exit 1

[demoscript_error.ps1]プレーンテキストで表示)
Write-Error("Error: This message for demo")
Exit 1


 スクリプトパッケージに修復スクリプトが含まれる場合、検出スクリプトが「exit 1」で終了すると、修復スクリプトが実行され、修復スクリプトが正常終了(明示的なexit 0を含む)の場合は「問題が修正されました」、「exit 1」で終了の場合で「失敗」と評価されます。ただし、修復スクリプトの実行後に検出スクリプトが「exit 1」で終了すると、修復スクリプトは「再発」と評価されます。「再発」状態は、スクリプトパッケージに検出スクリプト「demoscript_exit1.ps1」または「demoscript_error.ps1」を設定し、修復スクリプトとして「demoscript_exit0.ps1」を設定すると再現することができます。

 

画面9 検出スクリプトの3つのサンプルの検出の状態と、スクリプト出力の場所

画面9 検出スクリプトの3つのサンプルの検出の状態と、スクリプト出力の場所

 

はじめてのIntune(1)|...|(103)

 

blog_yamanxworld_subscribe

blog_yamanxworld_comment

blog_yamanxworld_WP_ws2025

最新記事