【入門編】【デフォルトプリンター自動変更】WScript.Network と WMI を組み合わせたオフィス環境別印刷先切替 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは!情シスや業務自動化の現場で、日々VBScriptとWSH(Windows Script Host)の魔力に頼り切っている先輩エンジニアです。

Excelのマクロ(VBA)の記録ボタンから一歩進んで、「Windowsの環境そのものを自在にコントロールしたい」と思ったことはありませんか?
今回は、社内の移動やテレワークのたびに「デフォルトプリンターの切り替え忘れ」で発生する地味なストレスを完全消滅させる、【ネットワーク環境に応じたデフォルトプリンターの自動切り替えスクリプト】を伝授します。

ここをクリアすれば、WSHとWMIを組み合わせたOS直結の自動化の本質がバッチリ見えてきますよ。さあ、一緒にVBScriptの奥深い世界へ足を踏み入れましょう!

なぜ「印刷先の手動切り替え」は無くならないのか?

ノートPCを抱えて、本社オフィス、支店、そして自宅を行き来する現代のワークスタイル。
「あれ? さっき自宅で印刷した設定のまま、会社の分厚いA3レーザープリンターじゃなくて、ローカルのPDF出力になってた……」なんて失敗、ありませんか?

これを人間の記憶力や手動操作に頼るのではなく、「今つながっているネットワーク(IPアドレス)」をスクリプト自らが検知し、瞬時にデフォルトプリンターを切り替える仕組みを作ります。

ここで使う武器は、以下の2つです。
1. WMI (Windows Management Instrumentation):現在のIPアドレスやネットワーク設定をOSの深部から暴き出す。
2. `WScript.Network` オブジェクト:Windowsのデフォルトプリンターを書き換える。

この2つを連携させることで、レガシーと言われがちなVBScriptが、現代のハイブリッドワークを支える超強力なツールに生まれ変わります。

完成版:環境別プリンター自動切替スクリプト

まずは、実際の現場でそのままコピペして使える実用コードを公開します。
メモ帳を開いて、以下のコードを貼り付け、拡張子を `.vbs` (例:`change_printer.vbs`)で保存してください。

‘ ==============================================================================
‘ スクリプト名: ChangeDefaultPrinter.vbs
‘ 概要: 接続されているIPアドレスのセグメントを判定し、最適なプリンターを既定に設定する
‘ ==============================================================================
Option Explicit

Dim objWMIService, colAdapters, objAdapter
Dim strIPAddress, targetPrinter
Dim net

‘ 1. WScript.Network のインスタンス化(プリンター操作の必須アイテム)
Set net = CreateObject(“WScript.Network”)

‘ 2. WMIサービスに接続し、有効なIPアドレスを持つネットワークアダプターを探索
Set objWMIService = GetObject(“winmgmts:\\.\root\cimv2”)
Set colAdapters = objWMIService.ExecQuery _
(“SELECT IPAddress FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True”)

strIPAddress = “”

‘ 複数のアダプター(Wi-Fiと有線など)がある場合を考慮し、IPを取得
For Each objAdapter in colAdapters
If Not IsNull(objAdapter.IPAddress) Then
strIPAddress = objAdapter.IPAddress(0) ‘ IPv4アドレスの先頭を取得
Exit For ‘ 最初に見つかった有効なIPで確定
End If
Next

‘ IPアドレスが取得できなかった場合のガード処理
If strIPAddress = “” Then
WScript.Echo “ネットワークに接続されていないか、IPアドレスの取得に失敗しました。”
WScript.Quit
End If

‘ 3. IPアドレスのセグメント(前方一致)によるプリンターのルーティング判定
‘ ※社内の環境に合わせてセグメントやプリンター名を書き換えてください
If Left(strIPAddress, 10) = “192.168.1.” Then
‘ 【本社オフィス環境】
targetPrinter = “\\PrintServer\HQ-Laser-A3”

ElseIf Left(strIPAddress, 10) = “10.0.50.” Then
‘ 【支店オフィス環境】
targetPrinter = “\\BranchServer\Branch-Color-01”

Else
‘ 【自宅・外出先(VPN外)環境】
targetPrinter = “Microsoft Print to PDF”

End If

‘ 4. デフォルトプリンターの変更実行
On Error Resume Next
net.SetDefaultPrinter targetPrinter

If Err.Number = 0 Then
WScript.Echo “【自動切替成功】” & vbCrLf & _
“現在のIP: ” & strIPAddress & vbCrLf & _
“既定のプリンターを以下に変更しました:” & vbCrLf & targetPrinter
Else
WScript.Echo “【エラー】プリンターの変更に失敗しました。” & vbCrLf & _
“指定されたプリンターがインストールされているか確認してください。” & vbCrLf & _
“エラー詳細: ” & Err.Description
End If

‘ 5. クリーンアップ
Set net = Nothing
Set colAdapters = Nothing
Set objWMIService = Nothing

コードの急所を解説!ここがVBScriptの醍醐味

初心者のうちは呪文のように見えるコードも、パーツごとに分解すれば「OSと対話するエレガントな仕組み」であることが分かります。

① `Option Explicit` はプロの証

これをスクリプトの最上行に書くことで、変数の宣言漏れ(スペルミスなど)を強制的にエラーにしてくれます。
「動かない原因が変数名のタイポだった」というVBScriptあるあるの悲劇を防ぐため、必ず書く癖をつけましょう。

② WMIを使った「OSの深部へのアクセス」

Set objWMIService = GetObject(“winmgmts:\\.\root\cimv2”)

この一文が、Windowsの管理情報データベース(WMI)への扉を開きます。
`Win32_NetworkAdapterConfiguration` というクラスをクエリ(SQLに似た構文)で叩くことで、コマンドプロンプトで `ipconfig` を叩くのと同じ情報を、プログラム側で構造化データとして取得できるのです。

③ `SetDefaultPrinter` の重み

ネットワーク経由でプリンターを指定する場合、プリンターのパスは正確に記述する必要があります(例: `\\サーバー名\共有プリンター名`)。
また、社内ネットワークの構築状況によってはプリンターサーバーとの通信にタイムラグが発生することがあるため、`On Error Resume Next` でエラーをいなし、`Err.Number` で優しくハンドリングするのが実務で使えるコードの条件です。

陥りやすい罠とエラー回避の知見

実際にこのスクリプトを運用に乗せる際、現場でよくある「つまずきポイント」を先回りして解説します。

罠1: 「プリンターが見つかりません」エラー (Error 80070709等)

  • 原因: スクリプトが実行された瞬間に、指定したプリンターがPCに接続されていない、あるいはネットワークプリンターのドライバが当たっていない。
  • 対策: あらかじめ対象のプリンターがPCにインストール(マッピング)されていることが大前提です。スクリプトでプリンターの「追加」まで自動化したい場合は、`net.AddWindowsPrinterConnection targetPrinter` を `SetDefaultPrinter` の前に挟むことで解決します。

罠2: Wi-Fiと有線LANが両方有効で、意図しないIPが拾われる

  • 原因: `For Each` ループで最初に見つかったアダプターのIPを無条件に採用しているため、VPNアダプターや仮想環境(WSLやHyper-V)のIPを先に掴んでしまうことがあります。
  • 対策: 本格的な運用では、`If Left(objAdapter.Description, 5) = “Intel”` のように、ネットワークアダプターの名称(ベンダー名など)でフィルタリングすると完璧です。

さらなる高みへ:ログオン時に自動実行させるには?

このスクリプトを毎朝手動で叩くのでは意味がありません。真の自動化とは「ユーザーに意識させないこと」です。

1. 作成した `ChangeDefaultPrinter.vbs` を、社内の共有フォルダやローカルの決まった場所(例: `C:\Scripts\ChangeDefaultPrinter.vbs`)に配置します。
2. Windowsのタスクスケジューラを開き、「ログオン時」をトリガーにしてこのスクリプトを実行するタスクを登録します。

これだけで、出社してPCを立ち上げた瞬間、ネットワークを自動検知し、その場所に最適なプリンターが既定に設定された状態で業務をスタートできるようになります。

おわりに

VBScriptは「古い言語」と言われることもありますが、Windows環境において、外部の重たい開発環境を一切必要とせず、メモ帳一つでOSの挙動を意のままに操れるという点で、今なお最強のクイックソリューションです。

今回マスターした「WMIによる環境検知」と「WScriptによる環境設定」の組み合わせは、プリンター以外にも、ネットワークドライブの割り当て、タイムゾーンの変更、ローカルツールの自動配布など、あらゆる業務自動化に応用できます。

ぜひあなたの職場環境に合わせてカスタマイズし、まわりの同僚たちをあっと言わせる自動化エンジニアを目指してくださいね!

タイトルとURLをコピーしました