Ext JS に関しては,新しい記事は Sunvisor Lab. ExtJS 別館 にあります。そちらもよろしくお願いいたします。

ホスト名を変更するスクリプト

Active Directory のドメインに参加しているPCのホスト名をある理由から変更しなければならなくなった。それも数十台。現場に行って作業をするのは面倒なので,スクリプトを書くことにしました。

ホスト名の変更は,Win32_ComputerSystem クラスの rename メソッドで変更できます。このメソッドを実行するには,ローカルPCに対して管理者権限を持っていなければなりません。今回の対応先では,Domain Users がローカルのAdministratorsグループに入っているので,その点は大丈夫です。ですがドメインに入っているPCのホスト名を変更するのですから,Domain Admins の権限が必要になります。ユーザーに管理者のユーザー情報を教えるわけに行きませんので,それはスクリプトに埋め込みたいところです。rename メソッドにドメインの管理者のユーザー情報を渡してやれますので,それを利用します。

ホスト名対応表にDictionary

古いホスト名を新しいホスト名にするわけですから,その対応表が必要になります。ここでは,WSHのDictionaryオブジェクトを使うことにしました。このオブジェクトはVBSで連想配列を実現できます。

'Dictionaryオブジェクトの生成
Set dicMap = CreateObject("Scripting.Dictionary")
'値を追加
dicMap.Add "キー", "値"

Dictionaryは上記のように使います。値を取り出すときは

 

Value = dicMap("キー")

という感じで取り出します。これを使って,キーに旧ホスト名を値に新ホスト名をセットした連想配列を作り,それを検索してホスト名の変更をするスクリプトにします。

 

'rename.vbs
'Copyright (c) 2009. Sunvisor. All rights reserved.
'**Start Encode**
'Message String
Const MSG = "情報処理室まで連絡してください。"
'Domain Administrator Account
sUsername = "administrator"
sPassword = "adminpass"
Set dicMap = CreateObject("Scripting.Dictionary")
 
'Define Convert Table
dicMap.Add "old001", "new001"
dicMap.Add "old002", "new002"
dicMap.Add "old003", "new003"
dicMap.Add "old004", "new004"
dicMap.Add "old005", "new005"
dicMap.Add "old006", "new006"
dicMap.Add "old007", "new007"
 
'Get WMIService Object
Set objWMIService = GetObject("Winmgmts:root\cimv2")
For Each objComputer in objWMIService.InstancesOf("Win32_ComputerSystem")
    sOldName = LCase(objComputer.Name)  'Current Computer Name
    sNewName = dicMap(sOldName)         'New Computer Name
    if sNewName = "" Then
        WScript.Echo "このコンピュータ(" & sOldName & _
            ")の新しい名前が定義されていません。" & vbcrlf & MSG
    Else
        '実際に変更する
        Return = objComputer.rename(sNewName,sPassword,sUsername)
        If Return <> 0 Then
            WScript.Echo "名前の変更に失敗しました。エラーコード = " & Return _
                & vbcrlf & MSG
        Else
            WScript.Echo "コンピュータ名を変更しました。" _
               & vbcrlf & " コンピュータを再起動してください。"
        End If
    End If
Next

 

スクリプトをエンコード

ロジック的にはこれでいいんですが,このスクリプトをエディタで開かれると,7~8行目に書いてある管理者のアカウント情報がばれてしまいます。このスクリプトをエンコードして配布することにします。Windows Script Encoder をダウンロードしてインストールします。

C:\Program Files\Windows Script Encoder>screnc d:\Script\rename.vbs d:\Script\rename.vbe

とすると,スクリプトをエンコードできます。エンコードは全角文字で記述された日本語はそのまんまでしたので,ユーザーから隠したい情報を日本語で書かないようにしないといけません。

参考サイト

 

未解決問題

一部のPCで,renameメソッドが1219というエラーを返しました。これは,

ERROR_SESSION_CREDENTIAL_CONFLICT
同じユーザーによる、サーバーまたは共有リソースへの複数のユーザー名での複数の接続は許可されません。サーバーまたは共有リソースへの以前の接続をすべて切断してから、再試行してください。

というエラーで,なぜにこれがでたのかよくわかりません。

トラックバック


URL から "-MoIyadayo" を削除してトラックバックを送信してください。
トラックバックは承認後に表示されます。