Windows System Image Manager を使用して応答ファイルを作成する
を以前投稿しました。
今回、私が担当しているコースの研修環境を変更したことによって今までとっていたアプローチができなくなりました。
やりたいことは次のとおり
・イメージはすでに出来上がっている
・イメージはSYSPREPを行ってから配布
・ノートンゴーストを使用してイメージを配布する
・起動時にライセンス同意とロケールを聞いてくるのでバイパスしたい
・パスワードの入力をバイパスしたい
・コンピューター名やIPアドレス入力をある程度自動化したい
・ドメイン参加をある程度自動化したい
赤で記述している場所は、System Image Manager を使用して作成したアンサーファイル(Unattend.xml)で実現していた。
青で記述している場所は、バッチファイルで実現していた。
変更した環境とは、サーバーを全てWIndows Server 2008 R2 SP1にしました。特にドメインコントローラーはWindows Server 2003 からの変更になります。
実は青で記述しているバッチがうまく動かなくなったのです。
今までは、このようなバッチファイルで実現しました。
setlocal set /p num=番号: netsh interface ipv4 set address name="ローカル エリア接続" source=192.168.10.%num% mask=255.255.255.0 netsh interface ipv4 add dnsserver name="ローカル エリア接続" address=192.168.10.200 index=1 netdom join %computername% /domain:contoso.com /userd:Administrator /passwordd:Pa$$w0rd netdom renamecomputer %computername% /newname:VMM-%num% /force /reboot 5 endlocal
しかし、これが最後まで動かないのです。そもそも、ドメイン参加後は再起動をしてからコンピューター名を変更するが正しい方法なのですが、DCがWindows Server 2003と参加コンピューターがWindows Server 2008 R2の時はできちゃっていたんですよね。それが今回環境を変更したことによってドメイン参加後の
netdom renamecomputer %computername% /newname:VMM-%num% /force /reboot 5
がセキュリティがどうのこうのと言って動いてくれない・・・・
そこで考えたのが、アンサーファイルでドメイン参加までしてバッチでコンピューター名を変更すればいいのでは?と思いチャレンジしました。
そこで参考にしたのは
Sysprep 実行時にドメイン参加を自動化する方法
になりますが、いくら頑張ってもドメイン参加してくれない・・・・
ここには、コンピューター名は”*”にしておくことによって、適当なコンピューター名が付くけどドメインには参加できるようなことが書いてあったのでいろいろ試したのですがことごとく失敗。
記述的には
Windows AIK をご利用の方であれば、応答ファイルの Microsoft-Windows-UnattendJoin コンポーネントを使用してドメインへの参加が自動化できることをご存知かも知れません。ただし、このコンポーネントは specialize パスで処理されるため、ミニ セットアップ中 (oobeSystem パス) に入力したコンピューター名ではなく、セットアップ中に一時的に割り当てられたコンピューター名でドメインへの参加が行われてしまいます。
このような感じです。
そこで今回のアプローチはSysprep後のバッチで何とかする!
そこで考えたフローは
Sysprep後のバッチ実行(vmm.bat)
・コンピューター名変更
・Run Once 設定
再起動後
・ドメイン参加(netdomjoin.bat)
再起動
になります。
このように動作させるためには、まずUnattend.xml ファイルを若干編集します。
<pre><?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" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <InputLocale>ja-JP</InputLocale> <SystemLocale>ja-JP</SystemLocale> <UILanguage>ja-JP</UILanguage> <UserLocale>ja-JP</UserLocale> </component> <component name="Microsoft-Windows-Shell-Setup" 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"> <OOBE> <HideEULAPage>true</HideEULAPage> <NetworkLocation>Work</NetworkLocation> <ProtectYourPC>1</ProtectYourPC> <SkipUserOOBE>true</SkipUserOOBE> </OOBE> <Display> <ColorDepth>32</ColorDepth> <HorizontalResolution>1280</HorizontalResolution> <RefreshRate>60</RefreshRate> <VerticalResolution>1024</VerticalResolution> </Display> <AutoLogon> <Password> <Value>UABhACQAJAB3ADAAcgBkAFAAYQBzAHMAdwBvAHIAZAA=</Value> <PlainText>false</PlainText> </Password> <Enabled>true</Enabled> <LogonCount>2</LogonCount> <Username>administrator</Username> </AutoLogon> <UserAccounts> <AdministratorPassword> <Value>UABhACQAJAB3ADAAcgBkAEEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIAUABhAHMAcwB3AG8AcgBkAA==</Value> <PlainText>false</PlainText> </AdministratorPassword> </UserAccounts> <TimeZone>Tokyo Standard Time</TimeZone> <RegisteredOwner>Learning Solution</RegisteredOwner> <RegisteredOrganization>Edifist Learning</RegisteredOrganization> <FirstLogonCommands> <SynchronousCommand wcm:action="add"> <CommandLine>c:vmm.bat</CommandLine> <Order>1</Order> <RequiresUserInput>true</RequiresUserInput> </SynchronousCommand> </FirstLogonCommands> </component> </settings> <settings pass="generalize"> <component name="Microsoft-Windows-PnpSysprep" 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"> <PersistAllDeviceInstalls>true</PersistAllDeviceInstalls> </component> <component name="Microsoft-Windows-Security-Licensing-SLC" 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"> <SkipRearm>1</SkipRearm> </component> </settings> <cpi:offlineImage cpi:source="catalog:e:/sources/install_windows server 2008 r2 serverenterprise.clg" xmlns:cpi="urn:schemas-microsoft-com:cpi" /> </unattend>
ここでのポイントは LogonCount を 2 にすることです。
そして1回目のログオン時に実行させるバッチは次の通り。
<pre>setlocal set /p num=番号: netsh interface ipv4 show interface set /p ID=IDx: netsh interface ipv4 set address name=%ID% source=static address=172.16.0.%num% mask=255.255.0.0 netsh interface ipv4 add dnsserver name=%ID% address=172.16.10.10 index=1 wmic ComputerSystem WHERE "name = '%computername%' " Call Rename "VMM-%num%" endlocal cscript c:runonce.vbs shutdown /r /t 10
更に2回目の起動時に実行させるスクリプトを仕込む”runonce.vbs”は次の通り。
<pre>Set WshShell = WScript.CreateObject("WScript.Shell") WshShell.RegWrite "HKLMSOFTWAREMicrosoftWindowsCurrentVersionRunOnceExTitle", "RunOnce_netdomjoin", "REG_SZ" WshShell.RegWrite "HKLMSOFTWAREMicrosoftWindowsCurrentVersionRunOnceExFlags", "1", "REG_DWORD" WshShell.RegWrite "HKLMSOFTWAREMicrosoftWindowsCurrentVersionRunOnceEx001Step01", "c:netdomjoin.bat", "REG_SZ" WshShell.RegWrite "HKLMSOFTWAREMicrosoftWindowsCurrentVersionRunOnceEx002Step02", "cmd.exe /c shutdown /r /t 3", "REG_SZ"</pre>
実際に2回目の起動時に実行させるスクリプト(ドメイン参加)は次の通り。
netdom join %computername% /domain:vmm.classroom.local /userd:Administrator /passwordd:Pa$$w0rd
余談として、実はここまで行くのに紆余曲折がありました。
最初は、netdomでのコンピューター名変更が再起動をかけなくてはだめなので、WMIを使用すれば可能なのでは?と思いwmicコマンドで試してみました。実はうまくいったのですが、これが不安定だったんです。数台イメージから戻してみてできるものとできないものが発生する。これでは実用的ではありません。
次に今の方法を考えたのですが、Autologonに関して無理やりレジストリに書き込む方法を試しましたが、Sysprep後の動作としてはうまく動かない。結局わかったことは、Sysprep実行後のAutologonに関しては Unattend.xml が制御をつかんでいるようでした。そこで、Unattend.xml の LogonCount を 2 にすることによって 2 回再起動を行うことができました。もしかしたら、Unattend.xml で 2 回目の起動時に実行させるファイルを記述することができるのかもしれませんが、今のところわからないのでスクリプトで直接Runonceを記述して 2 回目の起動時に実行させるバッチを記述しています。
これがうまく動くことによって、起動時に番号を指定するだけで、コンピューター名がその番号を元にしたものになり、IPアドレスなども設定され、なおかつドメインに参加するということが可能になります。そこに至るまで再起動などの動作も自動的に行いますのでかなりセットアップが楽になりますね。