Symantec Ghost & XP sysprep | 徒労日記に引き続き、自分メモ的なオハナシ。
GhostなどのDeployツールでシステムイメージを大量複写した後、個別の設定を行うVBScriptの一例。今回初めてVBScriptをさわりましたが、やりたいこととできるコト(自己能力的な意味で)に差があって大変でしたが、とても便利なものだと実感。ネットでベストプラクティスやサンプルスクリプトをあさり、切った貼ったして使える様にしました。
今後の為に書いておきます。
宣言
Option Explicit Dim xxxxxx
まずは基本らしい。
Option Explicitで宣言していない定数の使用をエラーにする。Dimで宣言だけど何型とか無いのかな・・・
日時を確認
Dim DT,TM,nowtime DT = Year(Date) & "年" & MonthName(Month(Date)) & Day(Date) & "日(" & WeekdayName(weekday(Date)) & ") " TM = Hour(Time) & "時" & Minute(Time) & "分" nowtime = DT & TM MsgBox ("日時を確認し、問題なければOKを押してください" & vbCrLf & nowtime)
現在の時刻を表示するだけ
IPアドレスを変更する
Set objWMIService = GetObject("winmgmts:\\" & strThisPC & "\root\cimv2") Set colNetAdapters = objWMIService.ExecQuery _ ("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE") strIPAddress = Array(InputBox("端末IPアドレスを入力してください","IPアドレスを入力してください","192.168.")) strSubnetMask = Array("255.255.255.0") strGateway = Array(InputBox("ゲートウェイのアドレスを入れてください" & vbLf & "IPアドレスの第四オクテットを254にしたものです。","デフォルトゲートウェイを入力してください","192.168.")) strDNSServers = Array("192.168.1.200", "192.168.1.201", "192.168.1.220") 'Inform user WSH.Popup "設定を有効にするため、しばらくお待ちください。" & vbLf & "これには10秒ほどかかるコトもあります。",3,,64 + 5 strGatewayMetric = Array(1) For Each objNetAdapter in colNetAdapters errEnable = objNetAdapter.EnableStatic(strIPAddress, strSubnetMask) errGateways = objNetAdapter.SetGateways(strGateway, strGatewaymetric) errDNSServer = objNetAdapter.SetDNSServerSearchOrder(strDNSServers) If errEnable = 0 Then WSH.Popup "IPアドレスは変更されました。",2,,64 + 5 Else WSH.Popup "IPアドレスを変更することができませでした。" & vbCrLf & vbCrLf &_ "LANケーブルが接続されているか確認し、手動で設定を変更してください。",,64 + 5 End If Next
※変数の宣言が省かれてますので使うときは適時宣言してください。
IPアドレスとゲートウェイを手入力させ、サブネットマスク、DNSは規定値を書き込みます。手入力の際の手間を減らすため、統一の第二オクテットまでは出しておきます(ex. 192.168.)。DNSは複数あるばあい、続けて複数個記述すれば順番にパラメータとして入る様です。Popupのプロパティがみんな”64+5″なのはただOKボタンを出したく無いから。本当はボタンを出したく無いのだけどやり方がわからなかったorz
「OK」があると押したくなるのはヒトの常。せめてもの抵抗で「再試行」「キャンセル」ボタンにしました。
コンピューター名の変更
strComputername = InputBox("コンピュータ名を入力してください","コンピュータ名入力") strComputername = UCase(strComputername) 'Force capitalization WSH.Popup "Please wait.",2,,64 + 5 'Computername strCCS = "HKLM\SYSTEM\CurrentControlSet\" strTcpipParamsRegPath = strCCS & "Services\Tcpip\Parameters\" strCompNameRegPath = strCCS & "Control\Computername\" 'Delete current settings in registry and write new ones With WSH .RegDelete strTcpipParamsRegPath & "Hostname" .RegDelete strTcpipParamsRegPath & "NV Hostname" .RegWrite strCompNameRegPath & "Computername\Computername", strComputername .RegWrite strCompNameRegPath & "ActiveComputername\Computername", strComputername .RegWrite strTcpipParamsRegPath & "Hostname", strComputername .RegWrite strTcpipParamsRegPath & "NV Hostname", strComputername End With ' WSH WSH.RegWrite "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\AltDefaultDomainName", strComputername WSH.RegWrite "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\DefaultDomainName", strComputername WSH.RegWrite "HKCU\Software\Microsoft\Windows\ShellNoRoam\", strComputername WSH.RegWrite "HKEY_USERS\.DEFAULT\Software\Microsoft\Windows Media\WMSDK\General\Computername", strComputername WSH.Popup "OK... Done!",2,,64 + 5
このやり方では直接該当レジストリにコンピュータ名を書き込んでいます。なのでもしかすると元々無いキーを無理矢理作ってしまう恐れがあります。時間があれば他のやり方を探してみるといいでしょう。
再起動
WSH.Popup “再起動します。 Please wait…”,2,,64 + 5
Set objWMIService = GetObject(“winmgmts:” _
& “{impersonationLevel=impersonate,(Shutdown)}!\\” & strThisPC & “\root\cimv2”)
Set colOperatingSystems = objWMIService.ExecQuery _
(“Select * from Win32_OperatingSystem”)
For Each objOperatingSystem in colOperatingSystems
ObjOperatingSystem.Reboot()
Next
丸写しでした
タイマー
Dim WshShell Dim intMsg Set WSHShell=Wscript.CreateObject("Wscript.Shell") intMsg = WSHShell.Popup ("サーバ処理待ちの為、10分待機します",5,"サーバ処理待ち時間",vbOKOnly) Wscript.sleep(3 * 60 * 1000) Wscript.echo "10分経過しました"
sleepのパラメータ、1000で10分、100で1分待ちです。
現在のIPアドレス、ゲートウェイ、ホスト名を表示
Set wsh = WScript.CreateObject("WScript.Shell") computername = wsh.ExpandEnvironmentStrings("%COMPUTERNAME%") Set exe = wsh.Exec("ipconfig.exe") Do Until exe.StdOut.AtEndOfStream strLine = exe.StdOut.ReadLine If InStr(strLine, "IP Address") <> 0 Then iColon = Instr(strLine, ":") ipaddress = Mid(strLine, iColon + 2) ipaddress = Replace(ipaddress, vbCr, "") End If Loop Function DefaultIPGateway() strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") Set colItems = objWMIService.ExecQuery( _ "SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True",,48) For Each objItem in colItems If isN ull(objItem.DefaultIPGateway) = False Then DefaultIPGateway = Join(objItem.DefaultIPGateway, ",") Exit For End If Next Set objWMIService = Nothing End Function WScript.Echo "コンピュータ名はこれでよろしいですか?" & vbCrLf & vbCrLf & computername WScript.Echo "IPアドレスはこれでよろしいですか?" & vbCrLf & ipaddress Wscript.Echo "ゲートウェイはこれでよろしいですか?" & vbCrLf & vbCrLf & DefaultIPGateway()
だいぶやっつけのツギハギ。
こちらもいろいろ方法はあると思いますが、ipconfigを実行してその内容からIPを抜いてます。だからゲートウェイも抜けるはずなんだけど時間なくて他のところからスクリプト持ってきた。
自分を消す
Option Explicit Dim fso Set fso = CreateObject("Scripting.FileSystemObject") fso.DeleteFile("C:\hogehoge.vbs"),True
ファイルの削除。自分自身も消せます。
以上。
自分でかけばもっと無駄のないソースが書けそうですが、今回は知識も時間も及びませんでした。
あともう1つできなかったのがWorkgroup名の変更。かなり調べたんだけど、ドメインばかりでWorkgroupを変更する事例が見つかりませんでした。Win2000でNETDOM.exeを使って変更している事例はありましたが、XP Resource KitのNetdomは別物になっていて変更できなかったし。むぅ。