Home
1601 words
8 minutes
【PowerShell】Use-WindowsUnattendコマンドで無人応答ファイルを適用する方法

最終更新:2025-03-30

概要#

Use-WindowsUnattendはWindows PowerShellのDISM(Deployment Image Servicing and Management)モジュールに含まれるコマンドレットである。このコマンドレットを使用すると、オフライン/オンラインのWindows環境に無人応答ファイル(unattend.xml)を適用することができる。無人応答ファイルはWindows展開時の設定を自動化するためのXMLフォーマットの設定ファイルであり、Use-WindowsUnattendを使うことで、オペレーティングシステムの展開段階だけでなく、既にインストール済みのシステムへも設定を適用できる。主にシステム管理者がWindows環境の構成を一貫して行うために使用される。

基本的な使い方#

オンラインWindows環境への無人応答ファイルの適用#

現在実行中のWindows環境に無人応答ファイルを適用する最も基本的な使い方である。

Use-WindowsUnattend -Path C:\unattend\unattend.xml -Online

オフラインWindows環境への無人応答ファイルの適用#

マウントされたオフラインのWindowsイメージに無人応答ファイルを適用できる。

Use-WindowsUnattend -Path C:\unattend\unattend.xml -WindowsPath D:\mounted_image

特定のパスにある無人応答ファイルの適用#

無人応答ファイルを適用する際に、特定のパスを指定することができる。

Use-WindowsUnattend -Path C:\unattend\specialized.xml -WindowsPath E:\windows_image -ScratchDirectory C:\temp

進行状況の表示#

-NoRestartパラメータを使用して、コマンド完了後に自動的に再起動しないようにする。

Use-WindowsUnattend -Path C:\unattend\unattend.xml -Online -NoRestart

応用的な使い方#

複数の無人応答ファイルの適用#

複数の無人応答ファイルを順番に適用して、異なる構成を組み合わせることができる。

Use-WindowsUnattend -Path C:\unattend\base.xml -Online
Use-WindowsUnattend -Path C:\unattend\apps.xml -Online
Use-WindowsUnattend -Path C:\unattend\network.xml -Online -NoRestart

Windows PEでのオフラインイメージへの適用#

Windows PE環境からオフラインのWindowsイメージに無人応答ファイルを適用する例である。

# まずWindowsイメージをマウント
Mount-WindowsImage -ImagePath D:\sources\install.wim -Index 1 -Path E:\mounted_windows

# 無人応答ファイルを適用
Use-WindowsUnattend -Path C:\unattend\sysprep.xml -WindowsPath E:\mounted_windows

# 変更を保存
Dismount-WindowsImage -Path E:\mounted_windows -Save

LogPathの指定#

ログファイルの出力先を指定することができる。

Use-WindowsUnattend -Path C:\unattend\unattend.xml -Online -LogPath C:\logs\unattend_application.log

システム言語の設定例#

言語やキーボードレイアウトなどを設定した無人応答ファイルを適用する例。

Use-WindowsUnattend -Path C:\unattend\language_settings.xml -Online -NoRestart

ハンズオン:Use-WindowsUnattendの実践#

以下はUse-WindowsUnattendコマンドの実践例とその出力である。

  1. 基本的な無人応答ファイルの適用(オンライン)

まずは基本的な無人応答ファイルを作成する。

# サンプルの無人応答ファイルを作成
$unattendXml = @"
<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
    <settings pass="oobeSystem">
        <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State">
            <OOBE>
                <HideEULAPage>true</HideEULAPage>
                <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
                <ProtectYourPC>3</ProtectYourPC>
            </OOBE>
            <TimeZone>Tokyo Standard Time</TimeZone>
        </component>
    </settings>
</unattend>
"@

# ファイルとして保存
$unattendPath = "C:\temp\basic_unattend.xml"
New-Item -Path $unattendPath -ItemType File -Force
$unattendXml | Out-File -FilePath $unattendPath -Encoding utf8

# 無人応答ファイルを適用
Use-WindowsUnattend -Path $unattendPath -Online -NoRestart

出力例:

Path          : C:\temp\basic_unattend.xml
Online        : True
NoRestart     : True
LogPath       : C:\Windows\Logs\Dism\dism.log
ScratchDir    : 
LogLevel      : 
RestartNeeded : False
  1. 特定のコンポーネントを対象とした無人応答ファイルの適用
# 特定コンポーネントの無人応答ファイル
$componentUnattendXml = @"
<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
    <settings pass="specialize">
        <component name="Microsoft-Windows-IE-ESC" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
            <IEHardenAdmin>false</IEHardenAdmin>
            <IEHardenUser>false</IEHardenUser>
        </component>
    </settings>
</unattend>
"@

# ファイルとして保存
$componentUnattendPath = "C:\temp\ie_esc_unattend.xml"
New-Item -Path $componentUnattendPath -ItemType File -Force
$componentUnattendXml | Out-File -FilePath $componentUnattendPath -Encoding utf8

# 無人応答ファイルを適用
$logPath = "C:\temp\unattend_application.log"
Use-WindowsUnattend -Path $componentUnattendPath -Online -NoRestart -LogPath $logPath

出力例:

Path          : C:\temp\ie_esc_unattend.xml
Online        : True
NoRestart     : True
LogPath       : C:\temp\unattend_application.log
ScratchDir    : 
LogLevel      : 
RestartNeeded : False
  1. ログレベルを指定した無人応答ファイルの適用
# ログレベルを指定して無人応答ファイルを適用
Use-WindowsUnattend -Path $unattendPath -Online -NoRestart -LogLevel 4

出力例:

Path          : C:\temp\basic_unattend.xml
Online        : True
NoRestart     : True
LogPath       : C:\Windows\Logs\Dism\dism.log
ScratchDir    : 
LogLevel      : 4
RestartNeeded : False
  1. スクラッチディレクトリを指定した無人応答ファイルの適用
# テンポラリディレクトリを作成
$scratchDir = "C:\temp\scratch"
New-Item -Path $scratchDir -ItemType Directory -Force

# スクラッチディレクトリを指定して無人応答ファイルを適用
Use-WindowsUnattend -Path $unattendPath -Online -NoRestart -ScratchDirectory $scratchDir

出力例:

Path          : C:\temp\basic_unattend.xml
Online        : True
NoRestart     : True
LogPath       : C:\Windows\Logs\Dism\dism.log
ScratchDir    : C:\temp\scratch
LogLevel      : 
RestartNeeded : False
  1. オフラインWindowsイメージへの適用(管理者権限必要)

このサンプルは管理者権限が必要で、Windows ISOイメージまたはWIMファイルが必要。

# 一時マウントポイントを作成
$mountPath = "C:\temp\mount"
New-Item -Path $mountPath -ItemType Directory -Force -ErrorAction SilentlyContinue

# Windowsイメージをマウント(この例ではWIMファイルを使用)
try {
    # WIMファイルが存在する場合のみ実行
    if (Test-Path "D:\sources\install.wim") {
        Mount-WindowsImage -ImagePath "D:\sources\install.wim" -Index 1 -Path $mountPath

        # 無人応答ファイルを適用
        Use-WindowsUnattend -Path $unattendPath -WindowsPath $mountPath

        # 変更を保存してマウント解除
        Dismount-WindowsImage -Path $mountPath -Save
        
        Write-Host "オフラインイメージに無人応答ファイルを適用しました。" -ForegroundColor Green
    } else {
        Write-Host "WIMファイルが見つかりません。このサンプルはスキップします。" -ForegroundColor Yellow
    }
} catch {
    Write-Host "エラーが発生しました: $_" -ForegroundColor Red
    
    # エラー発生時はマウント解除を試みる
    if (Test-Path $mountPath) {
        try {
            Dismount-WindowsImage -Path $mountPath -Discard
        } catch {
            Write-Host "マウント解除中にエラーが発生しました。" -ForegroundColor Red
        }
    }
}

出力例(WIMファイルがある場合):

マウント操作は正常に完了しました。
Path          : C:\temp\basic_unattend.xml
WindowsPath   : C:\temp\mount
LogPath       : C:\Windows\Logs\Dism\dism.log
ScratchDir    : 
LogLevel      : 
RestartNeeded : False
マウント解除操作は正常に完了しました。
オフラインイメージに無人応答ファイルを適用しました。
  1. 無人応答ファイルの言語設定を適用
# 言語設定用の無人応答ファイル
$languageUnattendXml = @"
<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
    <settings pass="oobeSystem">
        <component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
            <InputLocale>ja-JP</InputLocale>
            <SystemLocale>ja-JP</SystemLocale>
            <UILanguage>ja-JP</UILanguage>
            <UserLocale>ja-JP</UserLocale>
        </component>
    </settings>
</unattend>
"@

# ファイルとして保存
$languageUnattendPath = "C:\temp\language_unattend.xml"
New-Item -Path $languageUnattendPath -ItemType File -Force
$languageUnattendXml | Out-File -FilePath $languageUnattendPath -Encoding utf8

# 無人応答ファイルを適用
Use-WindowsUnattend -Path $languageUnattendPath -Online -NoRestart

出力例:

Path          : C:\temp\language_unattend.xml
Online        : True
NoRestart     : True
LogPath       : C:\Windows\Logs\Dism\dism.log
ScratchDir    : 
LogLevel      : 
RestartNeeded : False
  1. 無人応答ファイルの適用状態の確認
# ログファイルの確認
if (Test-Path "C:\Windows\Logs\Dism\dism.log") {
    $logContent = Get-Content -Path "C:\Windows\Logs\Dism\dism.log" -Tail 20
    Write-Host "DISMログの最終20行:"
    $logContent
} else {
    Write-Host "DISMログファイルが見つかりません。"
}

# 適用された設定を確認(例: タイムゾーン)
$currentTimeZone = Get-TimeZone
Write-Host "現在のタイムゾーン設定: $($currentTimeZone.Id)"

出力例:

DISMログの最終20行:
2025-03-30 02:10:15, Info                  DISM   DISM Provider Store: PID=1234 Loading provider from location C:\Windows\System32\Dism\UnattendProvider.dll
2025-03-30 02:10:15, Info                  DISM   DISM Provider Store: PID=1234 Successfully loaded the provider
2025-03-30 02:10:15, Info                  DISM   DISM Unattend Provider: PID=1234 Processing XML content
...
2025-03-30 02:10:16, Info                  DISM   DISM Provider Store: PID=1234 Finalizing session
2025-03-30 02:10:16, Info                  DISM   DISM.EXE: Image session has been closed. Reboot required=no.
2025-03-30 02:10:16, Info                  DISM   DISM.EXE: Process complete with exit code 0

現在のタイムゾーン設定: Tokyo Standard Time

対応PowerShellバージョン#

Use-WindowsUnattendコマンドレットは以下のPowerShellバージョンで利用可能である:

  • Windows PowerShell 3.0以降(Windows 8以降、Windows Server 2012以降)
  • Windows 10またはWindows Server 2016以降では標準搭載
  • PowerShell Coreでは利用不可(Windows PowerShellの機能)

このコマンドレットを使用するには、以下が必要:

  • 管理者権限でのPowerShell実行
  • DISMモジュールのインポート(Windows標準インストールに含まれる)

PowerShellでDISMモジュールを明示的にインポートするには:

Import-Module DISM

参考サイト#

【PowerShell】Use-WindowsUnattendコマンドで無人応答ファイルを適用する方法
https://ss0832.github.io/posts/20250330_use-windows-unattend-powershell/
Author
ss0832
Published at
2025-03-30