Windows Autopilot 展開時に利用した Enrollment Wi-Fi を削除する

皆さん、こんにちは。

今回は、Windows Autopilot 関連の記事となります。

最近、Configuration Manager 関連の記事より Microsoft Intune 関連の記事の方が投稿が多い気がします。

<背景>

本題ですが、組織において、Windows Autopilot を展開する際、組織のネットワーク (コーポレート ネットワーク) は、インターネットへのアクセスに制限があったり、Wi-Fi に接続する際は RADIUS 認証が必要 (802.1X 認証等) 等のところも多いかと思います。その場合、コーポレート ネットワークでは、Windows Autopilot を展開することが難しいです。

そのため、Windows Autopilot 展開時のみに、純粋なインターネット回線の Wi-Fi 環境用の SSID (Enrollment Wi-Fi) を用意して、展開時のみそちらのネットワークに接続するケースもあるかと思います。

ただ、Enrollment Wi-Fi は、Windows Autopilot の展開が終わり、コーポレート ネットワークのプロファイル (証明書やネットワークの構成プロファイル) が適用されたらもう使用しないようにしたいかと思います。というのも、Windows Autopilot の展開が終わったら、もうコーポレート ネットワーク環境にアクセスできる準備が整っている状況になっているからです。

しかし、Windows Autopilot 展開の際に利用した Enrollment Wi-Fi は Windows セットアップ フェーズ (OOBE) にて、Wi-Fi 接続しているため、Windows Autopilot 展開後も優先順位が高いため (そのまま Enrollment Wi-Fi に接続され続けているため)、コーポレート ネットワーク用の SSID には切り替わりません。

今回のテーマは上記のような環境下で、Windows Autopilot の展開が終わった後に、Enrollment Wi-Fi の SSID を削除し、コーポレート ネットワークの SSID に自動接続するようなことをしたいと思います。

<概要>

まず、Windows にて、Wi-Fi の SSID (ネットワーク プロファイル) を削除するには、下記のコマンドで実施出来ます。

netsh wlan delete profile name="SSID 名"

なので、Wi-Fi の SSID (ネットワーク プロファイル) を削除する場合は、上記のコマンドを実行するバッチ ファイルもしくは、PowerShell スクリプトを書いて、Win32 アプリとして作成すれば良いです。

ただ、単なる Win32 アプリでは考慮が足りないです。というのも、現状の Windows Autopilot では、対象に Win32 アプリを割り当てると、Windows Autopilot 展開中 (ESP (Enrollment Status Page) のステップ) にて、アプリがインストールされてしまいます。そうなると、どのような影響が出るかというと、Windows Autopilot 展開中に突然 Enrollment Wi-Fi が削除されるため、Windows Autopilot の展開が途中でストップして、Windows Autopilot 展開が失敗することになります。

なので、この Win32 アプリは、Windows Autopilot 展開中の ESP のステップでは実行されないように工夫する必要が必須です。この考慮が今回の記事のメインです。

<実装>

まずは、メインの Enrollment Wi-Fi を消す PowerShell を作成します。

下記にサンプルをおいておきますね。

# PowerShell script to forget Enrollment Wi-Fi
# Author : Yutaro Tamai (https://sccm.jp)

Start-Transcript -Path "C:\ProgramData\Microsoft\IntuneManagementExtension\Logs\Forget-Enrollment-Wi-Fi.log" -Force -Append
# 必要に応じて SSID 部分を修正してください。
netsh wlan delete profile name="TDC-GUEST-6G"
netsh wlan delete profile name="TDC-GUEST"

Stop-Transcript

Forget-Enrollment-Wi-Fi.ps1

上記の PowerShell スクリプトをメモ帳等で .ps1 として、保存します。

保存の際に、[文字コード] を [ANSI] にすることを強くお勧めします。

Win32 アプリの .intunewin ファイルを作成します。

  1. 作業用 PC に、Enrollment Wi-Fi を消すための PowerShell スクリプトを保存しておきます。
  2. https://github.com/Microsoft/Microsoft-Win32-Content-Prep-Tool から IntuneWinAppUtil.exe をダウンロードします。
  3. コマンド プロンプトで下記のようにコマンドを実行します。

    IntuneWinAppUtil.exe -c "C:\Intune\Package\Forget-Enrollment-Wi-Fi" -s "C:\Intune\Package\Forget-Enrollment-Wi-Fi\Forget-Enrollment-Wi-Fi.ps1" -o "C:\Intune\Package\Output"
  4. 下記のように [done!!!] と表示されることを確認します。
  5. コマンドの指定の仕方は、こちらの記事を参照ください。

それでは、Microsoft Intune 管理センター上で Win32 アプリを作りましょう。

  1. Microsoft Intune 管理センター (https://intune.microsoft.com/) を開き、[アプリ] > [Windows] > [追加] を選択します。
  2. [アプリケーションの種類の選択] にて [アプリの種類] を [Windows アプリ (Win32)] を選択し、[選択] を選択します。
  3. [アプリ情報] にて、[アプリ パッケージ ファイルの選択] から前の項目で作成した .intunewin ファイルを選択します。
  4. [アプリ情報] にて必要に応じて、[名前]、[説明]、[発行元] 等の情報を記載します。
  5. [プログラム] にて下記のように設定します。

    インストール コマンド : powershell.exe -executionpolicy remotesigned -file “Forget-Enrollment-Wi-Fi.ps1”


    アンインストール コマンド : powershell.exe -executionpolicy remotesigned -file “Forget-Enrollment-Wi-Fi.ps1”


    デバイスの再起動 : [何もしない]


  6. [必要条件] にて下記のように設定します。この [必要条件] が今回のポイントです。
    まず、[オペレーティング システムのアーキテクチャ] と [最低限のオペレーティング システム] を選択します。
    その後、[追加の要件規則を構成する] の欄にある [+ 追加] を選択します。
  7. 下記のような [要件規則] を追加します。
    [要件の種類] を [スクリプト]
    スクリプト ファイルにて、下記のファイルまたは下記のスクリプトをコピーして、.ps1 を作成。

    # PowerShell script to detect during ESP
    # Author : Yutaro Tamai (https://sccm.jp)
    # Reference : https://oofhours.com/2023/09/15/detecting-when-you-are-in-oobe/
    
    $TypeDef = @"
    
    using System;
    using System.Text;
    using System.Collections.Generic;
    using System.Runtime.InteropServices;
    
    namespace Api
    {
     public class Kernel32
     {
       [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
       public static extern int OOBEComplete(ref int bIsOOBEComplete);
     }
    }
    "@
     
    Add-Type -TypeDefinition $TypeDef -Language CSharp
    
    $IsOOBEComplete = $false
    $hr = [Api.Kernel32]::OOBEComplete([ref] $IsOOBEComplete)
    
    $WWAHost = Get-Process -Name "WWAHost" -ErrorAction SilentlyContinue
    $SecurityHealthSystray = Get-Process -Name "SecurityHealthSystray" -ErrorAction SilentlyContinue
    $LastUsedUsername = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" -Name LastUsedUsername
    
    # Main
    if ($IsOOBEComplete -eq 1) {
    if ($LastUsedUsername.LastUsedUsername -ne "defaultuser0"){
    if ($WWAHost.MainWindowHandle -eq 0) {
    if ($SecurityHealthSystray -ne $null) {
    Write-Output "ESP-Completed"}
    }
    }
    }
    

    IsESPComplete.ps1


    [出力データの型を選択する] > [文字列]
    [演算子] > [指定の値に等しい]
    [値] > [ESP-Completed]


  8. 下記のような状態になったことを確認し、[次へ] を選択します。
  9. [検出規則] にて、[規則の形式] を [検出規則を手動で構成する] を選択します。
    その後、下部の [+ 追加] を選択します。
  10. [検出規則] を下記のように設定します。

    [規則の種類] > [ファイル]
    [パス] > [C:\ProgramData\Microsoft\IntuneManagementExtension\Logs]
    [ファイルまたはフォルダー] > [Forget-Enrollment-Wi-Fi.log]
    [検出方法] > [ファイルまたはフォルダーが存在する]


  11. 下記のように検出規則が追加されたことを確認して、次に進みます。
  12. [依存関係] は特に設定せず、そのままにします。
  13. [置き換え] も特に設定せず、そのままにします。
  14. [割り当て] にて、割り当てをしたいグループを選択します。
    [エンド ユーザーの通知] は、今回のケースでは、[すべてのトースト通知を非表示にする] を選択しています。
  15. [確認と作成] にて、設定内容に問題無いことを確認して、[作成] を選択します。
  16. 以上で終了です。あとは、対象マシンで動作確認をしましょう。

それでは、物理マシンで Windows Autopilot 展開をして、動作を確認します。

下記のスクリーン ショットのように、ESP 最中では、Enrollment Wi-Fi である、”TDC-GUEST-6G” に接続されてます。

その後、デスクトップ画面が表示されたあとは、コーポレート Wi-Fi 相当の、”TDC-CORP” に自動的に接続されました。(正確には、”TDC-GUEST-6G” のプロファイルが削除され、”TDC-CORP” へ自動接続された)

<まとめ>

今回は、Windows Autopilot 展開中に使用した Enrollment Wi-Fi を削除する方法にて、ESP 最中は特定の Win32 アプリの展開をブロックする方法を紹介しました。この手法で利用した IsESPComplete.ps1 は汎用的なスクリプトであるため、もし、他の要件で ESP 最中は Win32 アプリをインストールさせたくないという要件があれば是非ご活用ください。

本来であれば、ESP 最中はインストールさせないというオプションを Microsoft Intune の標準機能として提供して欲しいところですね。今後の Microsoft Intune に期待したいところです。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする