IntuneでMicrosoft 365 Apps を ODT × Win32 で配布する手順を解説! 再パッケージ不要で運用負荷軽減

Keisuke Makino
Keisuke Makino

情報システムセキュリティアドバイザー

こんにちはkeisukeです。

Intune管理者のみなさん。Microsoft 365 Apps はどのように配布していますか?

Microsoft 365 Apps を Intune から配布する方法はいくつかありますが、Autopilot/ ESP(Enrollment Status Page/登録状態ページ)と併用する環境では、Win32 アプリとして配布することが Microsoft 公式で推奨されています。

ただし、Win32 アプリ方式を選択した場合においては、最新版を保つために管理者が定期的にインストーラーを再ダウンロードし、.intunewin パッケージを定期的に作り直す運用上の手間が発生するといった課題がありました。

そこで今回、再パッケージを不要にする方法を考案しましたので、本記事ではその配布手順と動作確認方法を紹介します。

はじめに

なぜAutopilot/ ESPと併用する環境では Win32 方式が推奨されるのか

Microsoft 365 Apps を Intune から配布する方法としては、Intune 標準の「Microsoft 365 Apps(Windows 10 以降)」アプリタイプを使う方法があります。一方、Autopilot で端末をプロビジョニングし、ESP の進行中に Microsoft 365 Apps を追跡対象アプリとして配布するケースでは、Microsoft 365 Apps を Win32 アプリとして配布することが Microsoft 公式で推奨されています。

理由は、Intune 標準の「Microsoft 365 アプリ」アプリタイプによるインストールが、Intune 管理拡張機能(IME/Win32 アプリのインストールを担うエージェント)の管理外で動作するためです。ESP 中に両者のインストールが同時に走ると競合し、ESP が失敗する原因になり得ます。Win32 アプリ方式であれば IME の管理下でインストールが制御されるため、この競合を避けられます。

(出典:Microsoft Learn Add Microsoft 365 Apps to Windows devices

Win32 アプリ方式は ODT と組み合わせて配布する

では、Win32アプリ方式の場合、どのような配布方法が考えられるでしょう?

Microsoft 365 Apps を Win32 アプリとして配布する場合、ODT(Office Deployment Tool)と組み合わせる方式が考えられます。ODT は、構成XML に従って Microsoft 365 Apps をダウンロード・インストールするためのコマンドラインツールです。

この方式では、ODT 実行ファイルである setup.exe を構成XML・PowerShellスクリプトと共に .intunewin に同梱する方法もあります。ただし、setup.exe が古くなるとインストールに失敗する可能性があるため、定期的な差し替えと再パッケージが必要になります。

そこで本手順では、setup.exeを同梱する代わりに、PowerShell スクリプトの引数に setup.exe のダウンロードリンクを設定し、実行時に取得する構成にします。これにより、リンクが有効な限り、setup.exe の差し替えや .intunewin の再パッケージを不要にできます。


手順

本記事では、以下のステップで Microsoft 365 Apps を Win32 アプリとして配布するポリシーを作成していきます。

  1. 事前準備:ローカルPCで作業フォルダを作成します
  2. 構成XMLの作成:Office カスタマイズ ツール(OCT)で、Microsoft 365 Apps の製品、言語、更新チャネル、除外アプリ、既存 Office の削除有無など、配布時の構成を指定する XML ファイルを作成します。
  3. スクリプトの作成:構成XMLをもとに ODT を実行する PowerShell スクリプトを用意
  4. パッケージ化:XML とスクリプトを .intunewin 形式にまとめる
  5. Intune への Win32 アプリ登録:作成した .intunewin を Intune に登録

前提の構成

  • 対象の Windows デバイスが Intune の管理対象であること
  • ESP(登録状態ページ)でセットアップされる環境であること

1. 事前準備 🗂️

まずは作業用のフォルダを用意します。このあと作る構成XML・スクリプトの置き場と、生成した .intunewin の出力先になります。

作業フォルダの準備

エクスプローラーで以下のフォルダを作成します(パスは任意です)。

  • C:\ODT\source\
  • C:\ODT\output\

後の手順で .intunewin を作成する際に、source は元ファイルの置き場、output は生成した .intunewin の出力先として使います。

2. 構成XMLの作成 📝

ここでは、配布する Office の中身(言語・更新チャネル・除外アプリなど)を定義する構成XMLを作ります。設定項目は多いですが、GUI で完結する OCT を使えば迷わず作成できます。

構成XMLは、Office カスタマイズ ツール(OCT / Office Customization Tool) を使って生成します。OCT は、ODT 用の構成XMLをブラウザ上の GUI で作成できる Web ツールです。

OCT での構成XML の作成手順

  1. ブラウザで OCT(https://config.office.com/deploymentsettings)にアクセスします。
    • 画面上は「Office カスタマイズ ツール」と表示されます。
  2. 以下の設定項目を入力します(詳細は下表参照)。

    OCT での設定項目の一部(例)

    設定項目は非常に多いため、ここでは一部を例として示します。推奨項目も含め、ご利用の環境に合わせて設定してください。

    必須以外の細かいオプションは、公式ドキュメント(Configuration options for the Office Deployment Tool)を参照してください。

    設定項目設定値例備考
    アーキテクチャ64ビット64bit が推奨・主流です。特に理由がなければ 64bit 版を選びます。古い 32bit 版 Office アドインなどに依存する場合のみ、互換性確認のうえ 32bit 版も検討してください。
    参考:Office の 64 ビット版または 32 ビット版を選択する
    製品お使いの製品を選択エンタープライズ向け Microsoft 365 アプリ = Microsoft 365 Apps for enterprise を指します。製品名の対応にご注意ください。
    更新チャネル月次エンタープライズ チャネル最新チャネル、月次エンタープライズ チャネル、半期エンタープライズ チャネルなどがあります。
    業務端末では、更新頻度と検証しやすさのバランスから、月次エンタープライズ チャネルを推奨します。各チャネルの扱いは変更される場合があるため、最新情報も確認してください。
    参考:Microsoft 365 Apps の更新チャネルの概要
    バージョンの選択最新バージョン指定もできますが、特定のバージョンを指定した場合、以降もそのバージョンに固定されてしまうため、特に理由がない限り「最新」を推奨します。
    インストール画面をユーザーに表示するオフ表示するとインストール時にエラーになる可能性があるため、オフを推奨します。
    Office をどこから展開しますか?Office Content Delivery Network(CDN)本手順は CDN(クラウド上に分散配置されたファイル配信網)からの取得を前提とするため、必ず CDN を設定します。
    MSI 版の Office がある場合はすべてアンインストールする (Visio や Project も含む)オンMSI 版(Windows インストーラー形式。Office 2016 以前に多く存在)でインストールされた Office があれば、この設定をオンにすることでアンインストールできます。なお、クイックインストーラー版の Office をアンインストールしたい場合は、後述の手順を参照してください。
    ライセンス条項を自動的に承諾するオンオンにしておくと、ユーザーに承諾画面が表示されなくなります。
  3. OCT 画面右上の「エクスポート」をクリックします。
  4. ポップアップで「Office Open XML 形式」を選択します。
  5. 使用許諾の条件に同意します。
  6. ファイル名を configuration として保存します(拡張子 .xml の入力は不要です)。
  7. 配布対象端末にクイックインストーラー版の Office がプリインストールされている場合、事前にアンインストールしてからインストールするには、XML に Remove 要素の追記が必要です。

    下記のように </Add> の直後に <Remove All="TRUE" /> を追記して保存します(下記の XML は追記位置を示す一例で、その他の記載内容も例です)。

    xml
    <Configuration ID="6dd77214-15aa-4288-abc9-915308518ae1">
      <Add OfficeClientEdition="64" Channel="MonthlyEnterprise">
        <Product ID="O365ProPlusRetail">
          <Language ID="ja-jp" />
          <ExcludeApp ID="Groove" />
          <ExcludeApp ID="Lync" />
        </Product>
      </Add>
      <Updates Enabled="TRUE" />
      <RemoveMSI />
      <AppSettings>
        <User Key="software\microsoft\office\16.0\excel\options" Name="defaultformat" Value="51" Type="REG_DWORD" App="excel16" Id="L_SaveExcelfilesas" />
        <User Key="software\microsoft\office\16.0\powerpoint\options" Name="defaultformat" Value="27" Type="REG_DWORD" App="ppt16" Id="L_SavePowerPointfilesas" />
        <User Key="software\microsoft\office\16.0\word\options" Name="defaultformat" Value="" Type="REG_SZ" App="word16" Id="L_SaveWordfilesas" />
      </AppSettings>
      <Display Level="None" AcceptEULA="TRUE" />
    </Configuration>
  8. 保存した configuration.xmlC:\ODT\source\ に配置します。

これで、配布する Office の内容を定義した構成XML(configuration.xml)の準備は完了です。

3. スクリプトの作成 📜

次に、ODT を実行して Office をインストールする PowerShell スクリプトを用意します。

スクリプトの処理内容

このスクリプトは、以下の処理を順番に実行します。

  • Intune から引数で渡された URL を使って setup.exe(ODT 本体)をダウンロード
  • 作成済みの構成XML(configuration.xml)に従って Microsoft 365 Apps をインストール
  • 実行中の動作・エラーをログ(C:\ProgramData\IntuneLogs\ODTInstall\install.log)に記録
  • インストール成功時にのみ install_success.log を作成(検出規則で使用)

作成手順

  1. メモ帳を開きます。
  2. 下記の内容をコピー&ペーストします。
  3. ファイル名 Install-M365Apps_FromUrl.ps1(例)で C:\ODT\source\ に保存します。
powershell
param(
    [Parameter(Mandatory = $true)]
    [string]$SetupUrl
)

$ErrorActionPreference = "Stop"

# Working directory & logs
$WorkDir    = Join-Path $env:ProgramData "IntuneLogs\ODTInstall"
$LogPath    = Join-Path $WorkDir "install.log"
$SetupPath  = Join-Path $WorkDir "setup.exe"
$ConfigPath = Join-Path $PSScriptRoot "configuration.xml"

if (-not (Test-Path $WorkDir)) {
    New-Item -Path $WorkDir -ItemType Directory -Force | Out-Null
}

# PowerShell transcript: all subsequent Write-Host and error output will be recorded in install.log
Start-Transcript -Path $LogPath -Append | Out-Null

try {
    Write-Host "===== Install-M365Apps_FromUrl.ps1 start ($(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')) ====="
    Write-Host "SetupUrl   : $SetupUrl"
    Write-Host "ConfigPath : $ConfigPath"

    if (-not (Test-Path $ConfigPath)) {
        throw "configuration.xml not found: $ConfigPath"
    }

    # Force TLS 1.2 for older OS versions
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

    # Download setup.exe
    Write-Host "Downloading setup.exe ..."
    Invoke-WebRequest -Uri $SetupUrl -OutFile $SetupPath -UseBasicParsing
    $size = (Get-Item $SetupPath).Length
    Write-Host "Downloaded: $SetupPath ($size bytes)"

    # Run ODT
    Write-Host "Running ODT: `"$SetupPath`" /configure `"$ConfigPath`""
    $proc = Start-Process -FilePath $SetupPath `
                          -ArgumentList "/configure `"$ConfigPath`"" `
                          -Wait -PassThru -NoNewWindow

    Write-Host "Exit code  : $($proc.ExitCode)"
    $script:OdtExitCode = $proc.ExitCode
    exit $proc.ExitCode
} catch {
    Write-Host "ERROR: $($_.Exception.Message)"
    $script:OdtExitCode = 1
    exit 1
} finally {
    Write-Host "===== Install-M365Apps_FromUrl.ps1 end ($(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')) ====="
    Stop-Transcript | Out-Null

    # Create install_success.log only when the installation succeeded
    if ($script:OdtExitCode -eq 0) {
        $SuccessLogPath = Join-Path $WorkDir "install_success.log"
        "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') | Microsoft 365 Apps installed successfully." | Out-File -FilePath $SuccessLogPath -Encoding UTF8 -Force
    }
}

4. パッケージ化 📦

作成した XML とスクリプトを、Intune にアップロードできる .intunewin 形式にひとつにまとめます。

事前確認

C:\ODT\source\ 直下に、以下の 2 ファイルが揃っていることを確認します。

  • Install-M365Apps_FromUrl.ps1
  • configuration.xml

パッケージ化の実施

  1. Microsoft Win32 Content Prep Tool から IntuneWinAppUtil.exe を取得します(未取得の場合)。(.intunewin は、Win32 アプリを Intune に登録するためのパッケージ形式です。)
  2. コマンドプロンプトで以下を実行します。
    IntuneWinAppUtil.exe -c C:\ODT\source -s Install-M365Apps_FromUrl.ps1 -o C:\ODT\output
  3. C:\ODT\output\Install-M365Apps_FromUrl.intunewin が生成されることを確認します。

5. Intune への Win32 アプリ登録 🚀

いよいよ Intune への登録です。Win32 アプリの作成ウィザードに沿って、これまで作ったパッケージ・インストールコマンド・検出規則を設定していきます。

  1. アプリの追加
    • Intune 管理センター → アプリWindows追加
    • アプリの種類Windows アプリ(Win32)
    • アプリ パッケージ ファイル:手順4で作成した Install-M365Apps_FromUrl.intunewin をアップロード
    • 名前:任意(例:Microsoft 365 Apps 配布
    • 発行元:任意(例:Microsoft
    • 説明:任意(例:setup.exe の取得元URL、配布開始日などをメモ)
  2. プログラム
    • インストール コマンド:下記を設定
      powershell.exe -ExecutionPolicy Bypass -File Install-M365Apps_FromUrl.ps1 -SetupUrl "https://officecdn.microsoft.com/pr/wsus/setup.exe"
    • アンインストール コマンド:インストール コマンドと同じものを設定
      • 本手順ではアンインストールを運用しないため、同一コマンドを設定します。
      • 配布停止の場合は、Intune のアプリ割り当て解除で対応します。
    • インストールの動作システム
  3. 必要条件
    • 環境に合わせて設定します。
  4. 検出規則
    • 規則の形式検出規則を手動で構成する
    • 本 Win32 アプリのインストール成功時に出力される install_success.log と、配布対象の Office アプリ(Word)の両方の存在を検出規則に設定します。両方が揃って初めて「インストール済み」と判定される AND 条件 で動作します。

      規則1:インストール成功ログの存在

      • 規則の種類:ファイル
      • パスC:\ProgramData\IntuneLogs\ODTInstall
      • ファイルinstall_success.log
      • 検出方法:ファイルまたはフォルダーが存在する

      規則2:Word の存在

      • 規則の種類:ファイル
      • パスC:\Program Files\Microsoft Office\root\Office16
      • ファイルWINWORD.EXE
      • 検出方法:ファイルまたはフォルダーが存在する
  5. 割り当て
    • 必須:対象のデバイスグループ(またはユーザーグループ)
  6. 確認および作成
    • 入力内容を確認し、作成をクリックします。

作成後、割り当てたグループの端末に配布され、しばらくすると Office がインストールされます(反映のタイミングは ESP やデバイスのチェックインに依存します)。


6. 動作確認 ✅

ローカルでの確認

配布前に、まずはローカルの初期化された PC で、PowerShell スクリプトと XML、およびインストールコマンドが意図通り動くかを確認します。

  1. Install-M365Apps_FromUrl.ps1configuration.xml を同じフォルダに配置します。
    • 例:C:\ODT\source\
  2. 管理者権限でコマンドプロンプトを起動します。
  3. 上記で作成したフォルダに移動します。
    • 例:cd C:\ODT\source
  4. 以下のコマンドを実行し、M365 Apps アプリのダウンロードおよびインストールを行います。
    • powershell.exe -ExecutionPolicy Bypass -File .\Install-M365Apps_FromUrl.ps1 -SetupUrl "https://officecdn.microsoft.com/pr/wsus/setup.exe"
  5. パスが作成されていることを確認します。
      • C:\ProgramData\IntuneLogs\ODTInstall\install_success.log
      • C:\Program Files\Microsoft Office\root\Office16\WINWORD.EXE
    • なお、C:\ProgramData\IntuneLogs\ODTInstall\install.log には成功・失敗いずれの場合も実行ログが出力されるため、トラブルシュート時に確認してください。
  6. Word などが起動できることを確認します。

install_success.log が作成され、Word などの Office アプリが起動できれば、ローカルでの動作確認は成功です。

上記が問題なければ、あとは Intune から配布し、初期セットアップ(ESP)時にも正常にインストールできるかをご確認ください。


まとめ 📝

  • Autopilot / ESP と併用する場合、Microsoft 365 Apps は Win32 アプリとして配布することが Microsoft 公式で推奨されています。
  • 本手順では ODT+Win32 アプリ方式(引数渡し) で配布します。構成XMLは OCT で GUI 生成し、PowerShell スクリプトから ODT を実行します。
  • インストールスクリプトを -SetupUrl 引数で URL を受け取る形にすることで、URL 変更時もスクリプトや .intunewin の再パッケージは不要になります。
  • 必ず 検証用グループで動作確認したうえで、本番に反映してください。
  • setup.exe 取得 URL の生存確認は、定期運用もしくは セットアップ失敗時の確認ポイントとして押さえておくことをおすすめします。

Appendix:同梱方式での実施手順

上記の手順では、実行時のコマンドライン引数として、setup.exe をダウンロードする直リンクを利用しています。この方法には、管理者の手間を省きながら最新版を配布できるメリットがあります。

一方で、このリンクが無効化された場合や、アクセスできない環境であった場合は、Office をインストールできません。その場合に備えた手順を、Appendix として示します。

引数渡し方式との違い

  • .intunewinsetup.exe を管理者が手動でダウンロードしてから同梱する
  • スクリプトは引数を受け取らず、同梱された setup.exe を直接実行する

setup.exe の取得

  1. ODT のダウンロードページから ODT パッケージ(exe)を取得します。https://www.microsoft.com/en-us/download/details.aspx?id=49117
  2. ダウンロードした exe ファイルを実行し、任意のフォルダに展開します。
  3. 展開されたフォルダ内の setup.exeC:\ODT\source\ にコピーします。

Install-M365Apps_BundledInstaller.ps1(同梱版)

先に紹介した(引数渡し方式の)スクリプトとは内容が異なるため、同梱方式を採用する場合は以下のスクリプトを使用してください。

powershell
$ErrorActionPreference = "Stop"

$WorkDir    = Join-Path $env:ProgramData "IntuneLogs\ODTInstall"
$LogPath    = Join-Path $WorkDir "install.log"
$SetupPath  = Join-Path $PSScriptRoot "setup.exe"
$ConfigPath = Join-Path $PSScriptRoot "configuration.xml"

if (-not (Test-Path $WorkDir)) {
    New-Item -Path $WorkDir -ItemType Directory -Force | Out-Null
}

Start-Transcript -Path $LogPath -Append | Out-Null

try {
    Write-Host "===== Install-M365Apps_BundledInstaller.ps1 start ($(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')) ====="

    if (-not (Test-Path $SetupPath))  { throw "setup.exe not found: $SetupPath" }
    if (-not (Test-Path $ConfigPath)) { throw "configuration.xml not found: $ConfigPath" }

    Write-Host "Running ODT: `"$SetupPath`" /configure `"$ConfigPath`""
    $proc = Start-Process -FilePath $SetupPath `
                          -ArgumentList "/configure `"$ConfigPath`"" `
                          -Wait -PassThru -NoNewWindow

    Write-Host "Exit code: $($proc.ExitCode)"
    $script:OdtExitCode = $proc.ExitCode
    exit $proc.ExitCode
}
catch {
    Write-Host "ERROR: $($_.Exception.Message)"
    $script:OdtExitCode = 1
    exit 1
}
finally {
    Write-Host "===== Install-M365Apps_BundledInstaller.ps1 end ($(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')) ====="
    Stop-Transcript | Out-Null

    # Create install_success.log only when the installation succeeded
    if ($script:OdtExitCode -eq 0) {
        $SuccessLogPath = Join-Path $WorkDir "install_success.log"
        "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') | Microsoft 365 Apps installed successfully." | Out-File -FilePath $SuccessLogPath -Encoding UTF8 -Force
    }
}

ファイル構成の差分

setup.exe が含まれるため、.intunewin パッケージの中身は下記のようになります。

C:\ODT\source\ 直下に、以下の 3 ファイルを配置します。

  • Install-M365Apps_BundledInstaller.ps1
  • configuration.xml
  • setup.exe

Intune 登録時の差分

  • インストールコマンドpowershell.exe -ExecutionPolicy Bypass -File Install-M365Apps_BundledInstaller.ps1(引数なし)
  • アンインストールコマンド:同上(インストールコマンドと同じ)

その他の項目は、引数渡し方式と同じです。


なお、本記事で配布した Microsoft 365 Apps 自体は、構成XMLで指定した更新チャネル(本記事では月次チャネル)に従って自動的に更新されます。Microsoft 365 Apps 以外のアプリを Win32 アプリ形式で配布していて、その更新運用(置き換え機能を使ったアップデートや、更新を確実に実行させるための検出規則の設計)について知りたい方は Intune で実践!intunewin によるアプリアップデート管理術 をご覧ください。

参考ドキュメント

この記事をシェア