URL から "-MoIyadayo" を削除してトラックバックを送信してください。
トラックバックは承認後に表示されます。
Active Directory のドメインに参加しているPCのホスト名をある理由から変更しなければならなくなった。それも数十台。現場に行って作業をするのは面倒なので,スクリプトを書くことにしました。
ホスト名の変更は,Win32_ComputerSystem クラスの rename メソッドで変更できます。このメソッドを実行するには,ローカルPCに対して管理者権限を持っていなければなりません。今回の対応先では,Domain Users がローカルのAdministratorsグループに入っているので,その点は大丈夫です。ですがドメインに入っているPCのホスト名を変更するのですから,Domain Admins の権限が必要になります。ユーザーに管理者のユーザー情報を教えるわけに行きませんので,それはスクリプトに埋め込みたいところです。rename メソッドにドメインの管理者のユーザー情報を渡してやれますので,それを利用します。
古いホスト名を新しいホスト名にするわけですから,その対応表が必要になります。ここでは,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
同じユーザーによる、サーバーまたは共有リソースへの複数のユーザー名での複数の接続は許可されません。サーバーまたは共有リソースへの以前の接続をすべて切断してから、再試行してください。
というエラーで,なぜにこれがでたのかよくわかりません。