コンピュータ名の変更

MACアドレスとコンピュータ名の対照表を参照して、コンピュータ名を変更する。 対照表はカンマ区切りとし、物理アドレス,コンピューター名のフォーマットで記述する。 パス1はネットワークドライブ上に設定し、パス2はローカルファイルシステム上に作成する(ネットワーク接続ができなかった時に備える)。

Option Explicit
'------------------------------------------------------------------------------
'    MACAddressを取得
'------------------------------------------------------------------------------
Function GetMacAddr()
    Dim objQfeSet
    Dim objQfe
    Dim objLocator
    Dim objService
    Dim strMAC
    
    Set objLocator = CreateObject("WbemScripting.SWbemLocator")
    Set objService = objLocator.ConnectServer
    Set objQfeSet = objService.ExecQuery("Select * From Win32_NetworkAdapterConfiguration")
    
    For Each objQfe In objQfeSet
        If objQfe.IPEnabled = True Then
            strMAC = objQfe.MACAddress
        End If
    Next

    Set objQfeSet = Nothing
    Set objQfe = Nothing
    Set objService = Nothing
    Set objLocator = Nothing

    GetMacAddr = strMAC
End Function

'------------------------------------------------------------------------------
'    名前変更
'------------------------------------------------------------------------------
Sub ResetName(strNewName)
    Dim objWMIService
    Dim colComputers
    Dim objComputer

    Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
    Set colComputers = objWMIService.ExecQuery("Select * from Win32_ComputerSystem")
    For Each objComputer in colComputers
        objComputer.Rename(strNewName)
    Next
End Sub

'------------------------------------------------------------------------------
'    シャットダウン・リブート
'------------------------------------------------------------------------------
Sub Reboot(intFlag)
    Set OpSysSet = GetObject("winmgmts:{(Shutdown)}//./root/cimv2").ExecQuery("select * from Win32_OperatingSystem where Primary=true")

    for each OpSys in OpSysSet
        if intFlag = 1 Then
            OpSys.Reboot()
        Else
            OpSys.Shutdown()
        End If
    next
End Sub

'------------------------------------------------------------------------------
'    起動時実行に設定
'------------------------------------------------------------------------------
Sub SetRunOnce(strPath)
    Dim WshShell, bKey
    Set WshShell = WScript.CreateObject("WScript.Shell")

    WshShell.RegWrite "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce\exec", strPath, "REG_SZ"
End Sub

'------------------------------------------------------------------------------
'    ドメイン参加
'------------------------------------------------------------------------------
Function JoinDomain(strDomain, strUser, strPassword)
    Const JOIN_DOMAIN             = 1
    Const ACCT_CREATE             = 2
    Const ACCT_DELETE             = 4
    Const WIN9X_UPGRADE           = 16
    Const DOMAIN_JOIN_IF_JOINED   = 32
    Const JOIN_UNSECURE           = 64
    Const MACHINE_PASSWORD_PASSED = 128
    Const DEFERRED_SPN_SET        = 256
    Const INSTALL_INVOCATION      = 262144

    Set objNetwork = CreateObject("WScript.Network")
    strComputer = objNetwork.ComputerName
    Set objComputer = _
        GetObject("winmgmts:{impersonationLevel=Impersonate}!\\" & _
        strComputer & "\root\cimv2:Win32_ComputerSystem.Name='" _
        & strComputer & "'")
    JoinDomain = objComputer.JoinDomainOrWorkGroup(strDomain, _
        strPassword, _
        strDomain & "\" & strUser, _
        NULL, _
        JOIN_DOMAIN + ACCT_CREATE)
End Function

'------------------------------------------------------------------------------
'    MACアドレスと名前の対照表から新しい名前を返す
'------------------------------------------------------------------------------
Function GetNewName(strMac, strPath1, strPath2)
    Dim objFS
    Dim objFile
    Dim aryStrings
    
    Set objFS = CreateObject("Scripting.FileSystemObject")
    
    If objFS.FileExists(strPath2) And objFS.FileExists(strPath1) Then
        MsgBox "設定ファイルが存在しません。手動で設定してください。"
        WScript.Quit
    End If

    strMac = Replace(strMac, "-", ":")

    If Not objFS.FileExists(strPath1) Then
        strPath1 = strPath2
    End If
    Set objFile = objFS.OpenTextFile(strPath1)
    Do Until objFile.AtEndOfStream
        aryStrings = Split(Trim(objFile.ReadLine), ",")
        aryStrings(0) = Replace(aryStrings(0), "-", ":")
        If (UBound(aryStrings) - LBound(aryStrings)) + 1 = 2 Then
            If Len(Trim(aryStrings(0))) = Len(Trim(strMac)) Then
                If UCase(Trim(aryStrings(0))) = UCase(Trim(strMac)) Then
                    GetNewName = UCase(Trim(aryStrings(1)))
                    Exit Function
                End If
            End If
        End If
    Loop
    GetNewName = "00000000"
End Function

'------------------------------------------------------------------------------
'
'    メインルーチン
'
'------------------------------------------------------------------------------
Dim strNew
Dim objArg
Dim i
Dim strPath1, strPath2

Set objArg = WScript.Arguments
MsgBox objArg.Count
If objArg.Count = 1 Then
    strPath1 = objArg(0)
End If

strNew = GetNewName(GetMacAddr(), strPath1, "ローカルファイルへのパス")
If "00000000" <> strNew Then
    ResetName(strNew)
Else
    MsgBox "設定情報が存在しません。手動で設定してください。"
End If

コンピュータ名の変更で、最も簡単なのは、

C:\> wmic ComputerSystem WHERE "name='%computername%'" Call Rename "新しいコンピュータ名"