VBScriptで展開後のPCを設定する方法

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は別物になっていて変更できなかったし。むぅ。

コメントを残す