2012/11/19

無人応答ファイルで静的 IP アドレスを設定する (/mode:vm に要注意)

Sysprep を実行して一般化した Windows  イメージを無人応答ファイル (Unattend.xml) で自動構成する際に、IP アドレスや DNS サーバーを静的に設定したい場合があると思います。
以下のような FirstLogonCommands を使うのが、簡単な方法ですが、エレガントじゃありません。また、初回ログオン時の実行になるので、静的 IP 設定前の段階で利用できる DHCP 環境が無いと、Specialize セクションの Microsoft-Windows-UnattendedJoin  で行うドメイン参加がうまくいかないでしょう。
<FirstLogonCommands>
  <SynchronousCommand>
    <CommandLine>NETSH interface ipv4 set address name="ローカル エリア接続" source=static address=192.168.10.123 mask=255.255.255.0 gateway=192.168.10.1</CommandLine>
    <Order>1</Order>
  </SynchronousCommand>
  <SynchronousCommand>
    <CommandLine>NETSH interface ipv4 set dns "ローカル エリア接続" static 192.168.10.101</CommandLine>
    <Order>2</Order>
  </SynchronousCommand>
</FirstLogonCommands>
他にも SetupComlete.cmd や RunSynchronousCommand の方法があるようですが、私は使ったことがありません (2012/11/22 追記: FirstLogonCommands、SetupComlete.cmd、RunSynchronousCommand の設定と実行タイミングについては、TechNet Blogs > Ask CORE > Sysprep 中に任意のコマンドを実行する方法について が参考になります)。

Unattend.xml の Specialize セクションで Microsoft-Windows-TCPIP や Microsoft-Windows-DNS-Client を使えるようになると、スペシャリストって感じです。Windows Server 2008 R2 の場合は、次のような感じ。

この例では、00-15-5D-0A-07-1A という MAC アドレスを持つネットワーク アダプターに、IP アドレス 192.168.10.123、サブネットマスク 255.255.255.0、デフォルト ゲートウェイ 192.168.10.1、DNS サーバー 192.168.10.101 を設定しています。
<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
    <settings pass="specialize">
~中略~
        <component name="Microsoft-Windows-TCPIP" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <Interfaces>
                <Interface wcm:action="add">
                    <Identifier>00-15-5D-0A-07-1A</Identifier>
                    <Ipv4Settings>
                        <DhcpEnabled>false</DhcpEnabled>
                    </Ipv4Settings>
                    <UnicastIpAddresses>
                        <IpAddress wcm:action="add" wcm:keyValue="1">192.168.10.123/24</IpAddress>
                    </UnicastIpAddresses>
                    <Routes>
                        <Route wcm:action="add">
                            <Identifier>1</Identifier>
                            <Prefix>0.0.0.0/0</Prefix>
                            <NextHopAddress>192.168.10.1</NextHopAddress>
                        </Route>
                    </Routes>
                </Interface>
            </Interfaces>
        </component>
        <component name="Microsoft-Windows-DNS-Client" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <Interfaces>
                <Interface>
                    <Identifier>00-15-5D-0A-07-1A</Identifier>
                    <DNSDomain>eval.contoso.com</DNSDomain>
                    <DNSServerSearchOrder>
                        <IpAddress wcm:action="add" wcm:keyValue="1">192.168.10.101</IpAddress>
                    </DNSServerSearchOrder>
                </Interface>
            </Interfaces>
        </component>
    </settings>
    <settings pass="oobeSystem">
~中略~
    </settings>
</unattend>

Windows Server 2008 や Windows 7、Windows Vista も同じ感じでできるはず。この例では MAC アドレス (00-15-5D-0A-07-1A) で NIC を識別していますが、「ローカル エリア接続」 (Unattend.xml を UTF-8 で保存すること) でもできるはず。

この方法をこれまでたまに使ってきたのですが、Windows Server 2012 や Windows 8 で同じようにやってみたところ、これがうまくいかないんです。

 ▲ Windows Server 2012 で Microsoft-Windows-TCPIP による静的 IP 設定に失敗

いろいろと試行錯誤した結果、sysprep イメージを作成した際の /move:vm オプションが影響しているかもしれないと考えました。/move:vm オプションを使用せずに、Sysprep を再実行して再起動したところ、ちゃんと静的 IP が設定されました。

▲ /mode:vm を付けずに Sysprep をしたイメージは、静的 IP の設定に成功

sysprep の /move:vm オプション  (/mode:vm についてはこちら) は、Windows Server 2012 と Windows 8 から利用できる、セットアップ時間を短縮する便利なオプションですが、こんな落とし穴ががあるのでご注意!!

そういえば、/move:vm オプションで準備した仮想デスクトップのテンプレートが、Sysprep 時とは別の DHCP 環境でうまく自動展開できなかったことがあったのも同じ理屈かも(そのときは時間がたってリース期限が切れたことで自然に問題解決しましたが)。/move:vm オプションはハードウェアをリセットしないので、Unattend.xml によるネットワークの構成も行われないみたいですね。

0 件のコメント: