【Deployment】 WDS だけで Windows 8 を仮想マシンに自動展開するとキーボードレイアウトが英語配列(101/102)になってしまう

##2013.4.19 スクリプトを修正

Windows Deployment Service(WDS) で Windows 8 を仮想マシンに自動展開しようとすると、キー配列が英語(101/102)になってしまいます。そのため、初回ログオン時にキーボードドライバを 106/109 に変更しなければなりません。

何とかこの現象を回避し、日本語でインストールしようと試みているのですがなかなかうまくいかず試行錯誤しておりました。

本件に関し、MVP の小澤 真之 氏が BLOG にて以下の記事を投稿してくださいました。

WDS で Windows 8 を展開する際に日本語キーボードを設定する
http://engineermemo.wordpress.com/2013/04/11/wds-%e3%81%a7-windows-8-%e3%82%92%e5%b1%95%e9%96%8b%e3%81%99%e3%82%8b%e9%9a%9b%e3%81%ab%e6%97%a5%e6%9c%ac%e8%aa%9e%e3%82%ad%e3%83%bc%e3%83%9c%e3%83%bc%e3%83%89%e3%82%92%e8%a8%ad%e5%ae%9a%e3%81%99/

要約すると、インストールに使用する install.wim ファイルに対して以下のコマンドを実行することで、既定のレイヤードドライバーを 106/109 に変更しておくという方法です。

dism /Image:C:\mount /Set-LayeredDriver:6

これならば言語ごとに install.wim を用意しておけば済むので、今のところ小澤さんが提案してくださったこの方法がベストだろうなぁ考えています。

が、そうはいっても別の(もうすこし変態的な)方法を考えたくなるのが人情というものです。

そこで、以下の PowerShell スクリプトを ”インストール完了のタイミングを見計らってホスト側から" 実行するってのはどうでしょう。 ※MDT 2012 Updat1 でタスクシーケンスを使用すれば、インストール完了後に実行できるかも

##仮想マシン名 $VMName = "test"

##設定したいLayeredDriver の値 $LayerdDriver = 6

##仮想マシンの仮想ハードディスクのパスを取得 $HDD = (Get-VMHardDiskDrive $VMName | Select-Object Path).Path

##仮想マシンを停止 Stop-VM $VMName

##仮想マシンのシャットダウンが完了するまで待ち合せる Do { Start-Sleep -Seconds 1 } Until(( Get-VM $VMName ).State -eq "Off")

##仮想ハードディスクをマウント Mount-DiskImage $HDD $Image = Get-DiskImage $HDD

##仮想ハードディスクからパーティション情報を取得 $Partitions = Get-Partition -DiskNumber $Image.Number

##パーティションを1つ1つ確認して、Windowsのインストールドライブであるかを確認 ForEach ($p in $Partitions){ $WindowsPath = $p.DriveLetter + ":\Windows" $RootPath = $p.DriveLetter+":\" ##ファイルシステムに後からマウントしたディスクのドライブは ##PowerShellから認識できないので、PSDriveにマウントしなおす     New-PSDrive $p.DriveLetter -PSProvider FileSystem -Root $RootPath

    ##マウントしたドライブにWindowsフォルダがあるかどうかをチェック if (Test-Path $WindowsPath){ $AttachedDrive = $p.DriveLetter+":" }

     Remove-PSDrive $p.DriveLetter }

dism /Image:$AttachedDrive /Set-LayeredDriver:$LayerdDriver

Dismount-DiskImage $HDD Start-VM $VMName

##DiskPart をスクリプトモードで実行する際に使用するスクリプトファイル #$ScriptFileName = "c:\tmp\setlay.txt" #Echo "select vdisk file=""$HDD""" | Out-File -FilePath $ScriptFileName -Encoding utf8 #Echo "attach vdisk" | Out-File -FilePath $ScriptFileName -Encoding utf8 -Append #diskpart /S $ScriptFileName #dism /Image:$AttachedDrive /Set-LayeredDriver:$LayerdDriver #Echo "select vdisk file=""$HDD""" | Out-File -FilePath $ScriptFileName -Encoding utf8 #Echo "detach vdisk" | Out-File -FilePath $ScriptFileName -Encoding utf8 -Append #diskpart /S $ScriptFileName #Start-VM $VMName

やっていることは単純です。

仮想マシンへのインストールが完了したことを見計らって(ここを動判定するかはSEの腕の見せ所)、仮想マシンを一旦シャットダウンします。このとき、かならずシャットダウン完了を待ち合せてください。マシンがシャットダウンされていないと、次の処理がエラーとなります。

※MVP 牟田口さんのアドバイスににより、Mount-DiskImage コマンドレットを使用する方法に変更しました
シャットダウンが正常に完了したら、仮想マシンのハードディスクをホストにマウントします。仮想ハードディスクをマウントするには、Mount-DiskImageコマンドレットを使用します。 仮想ハードディスクをマウントするには、Diskpartコマンドで Attach Vdisk サブコマンドを実行するのですが、これをバッチ処理するには事前に「スクリプトファイル」を作成しておく必要があります。このとき、スクリプトファイルは utf8 で保存する必要があるので注意してください。Windows PowerShell の Out-File コマンドレットには –Encoding パラメタが用意されているので便利ですね。

次に、マウントしたドライブからパーティション情報を取り出し、DriveLetterプロパティでどのドライブにマウントされたかを確認します。ただし、複数のパーティションが含まれている可能性があるので、Foreachを使用してパーティションに Windows フォルダが含まれているかどうかを確認します。パスの確認に使用するのは Test-Path コマンドレットですが、このコマンドレットに指定できるパスは PSDrive でなければなりません。試しに、VHDX ファイルをマウントした状態で Get-PSDrive コマンドレットでドライブの一覧を表示しても、マウントしたドライブは表示されません。そこで、New-PSDrive コマンドレットを使用してファイルシステム上のパスをPSDriveとして登録する必要があります。

ドライブが特定できたら、dism コマンドを使用して LayeredDriver の値を 6 に設定します。LayeredDriver に指定できる値は以下の通りです。今回は、Japanese Keyboard を使用したいので 6 を指定しました。 

  1. Specifies the PC/AT Enhanced keyboard (101/102-key).
  2. Specifies the Korean PC/AT 101-Key Compatible keyboard or the Microsoft® Natural keyboard (type 1).
  3. Specifies the Korean PC/AT 101-Key Compatible keyboard or the Microsoft Natural keyboard (type 2).
  4. Specifies the Korean PC/AT 101-Key Compatible keyboard or the Microsoft Natural keyboard (type 3).
  5. Specifies the Korean keyboard (103/106-key).
  6. Specifies the Japanese keyboard (106/109-key).

最後に、Diskpart で Attach した仮想ハードディスクを Detach して、仮想マシンを起動すれば完了です。

うーん、どう考えても小澤さんの方式のほうがよいです。

PowerShell を勉強したい方はチャレンジしてみてください。