こんにちは!エンジニアリングの世界へようこそ。
今日は、Windowsのネットワーク管理やセキュリティ監査の現場で即戦力となる、ちょっとディープで最高に実用的なテーマをお届けするよ。
テーマは「WMI `Win32_Share` を用いた隠し共有(C$等)を含むローカル・リモート共有一覧の完全取得」。
「難しそう……」なんて身構えなくて大丈夫。ここをクリアすれば、OSの裏側を覗き見るようなWMIの強力なパワーと、VBScriptのいぶし銀の魅力を同時に手に入れられるからね。
マクロの記録ボタンをポチるだけの世界から一歩抜け出して、インフラの自動化を語れるエンジニアへの階段を一緒に登っていこう!
—
1. なぜ「共有フォルダの監査」にVBScriptなのか?
現場のセキュリティ監査や資産管理で、こんな要望を受けたことはないかな?
- 「ウチの社内PC、不要な隠し共有(`C$` や `ADMIN$` など)が野放しになっていないか全台調べたい」
- 「PowerShellの実行ポリシー(ExecutionPolicy)が厳しく制限されていて、スクリプトが組めない環境がある」
そんな時、Windowsに標準搭載されており、追加のランタイムインストール一切不要で動くVBScriptが最強のカードになるんだ。
WMI(Windows Management Instrumentation)というOSの内部データベースにアクセスすることで、ネットワークの向こう側(リモート)であっても、ローカルと全く同じ感覚で情報を引き抜くことができる。
—
2. 隠し共有の正体とセキュリティリスク
Windowsには、管理目的のためにデフォルトで作成される共有が存在する。
- `C$`, `D$` などのドライブ共有
- `ADMIN$` (Windowsシステムフォルダへのアクセス)
- `IPC$` (プロセス間通信用)
これらは末尾に `$` がついているため、普通のネットワーク一覧(エクスプローラーなど)には表示されない。これが「隠し共有」と呼ばれるゆえんだ。
しかし、適切な権限管理がされていない場合、万が一アカウントが漏洩した際に、ここを踏み台にしてOSの根幹まで侵入されるリスクがある。だからこそ、定期的な全数調査と監査が必要不可欠なんだよ。
—
3. 【実践】共有一覧を完全取得するVBScriptコード
百聞は一見に如かず。デスクトップにメモ帳を開いて、以下のコードを `ShareAudit.vbs` という名前で保存してみてほしい。
※リモートPCを調査する場合は、1行目の `strComputer` の値を対象のホスト名やIPアドレスに変更するだけでOK(要管理者権限)。
‘ ==============================================================================
‘ スクリプト名: 共有フォルダ完全調査スクリプト (Win32_Share 監査用)
‘ 概要: ローカルまたはリモートマシンの全共有(隠し共有含む)を走査し、
‘ パスと説明文をコンソールおよびCSVライクに出力する
‘ ==============================================================================
Option Explicit
Sub CheckSharedFolders()
Dim strComputer, objWMIServices, colShares, objShare
Dim reportLine
‘ 調査対象PCの指定 (“.” はローカルコンピュータを意味する)
‘ リモートを調査する場合は “192.168.1.50” や “Server01” に書き換えます
strComputer = “.”
WScript.Echo “==================================================”
WScript.Echo ” 共有フォルダ監査レポート開始: ” & strComputer
WScript.Echo “==================================================”
On Error Resume Next
‘ WMIサービスへの接続 (cimv2 ネームスペース)
Set objWMIServices = GetObject(“winmgmts:\\” & strComputer & “\root\cimv2”)
If Err.Number <> 0 Then
WScript.Echo “[エラー] WMIへの接続に失敗しました。エラーコード: &H” & Hex(Err.Number)
WScript.Echo “詳細: ” & Err.Description
Exit Sub
End If
On Error GoTo 0
‘ Win32_Share クラスから共有情報のコレクションを取得
Set colShares = objWMIServices.InstancesOf(“Win32_Share”)
If colShares.Count = 0 Then
WScript.Echo “共有フォルダは検出されませんでした。”
Exit Sub
End If
‘ ヘッダー出力
WScript.Echo “共有名” & vbTab & “パス” & vbTab & “説明 / タイプ”
WScript.Echo “————————————————–”
‘ コレクションをループして各共有のプロパティを抽出
For Each objShare in colShares
‘ 隠し共有(末尾が$)かどうかの判定や、基本情報の取得
reportLine = objShare.Name & vbTab & _
objShare.Path & vbTab & _
objShare.Description
WScript.Echo reportLine
Next
WScript.Echo “————————————————–”
WScript.Echo ” 監査完了。総検出数: ” & colShares.Count & ” 件”
WScript.Echo “==================================================”
‘ オブジェクトのクリーンアップ(メモリ解放の作法)
Set colShares = Nothing
Set objWMIServices = Nothing
End Sub
‘ メイン処理の実行
Call CheckSharedFolders()
—
4. コードの深掘り解説:ここがVBScriptの真髄だ!
プログラミング初学者のために、エンジニアとして知っておくべきポイントをいくつか解説するね。
① `Option Explicit` はエンジニアの良心
行頭にある `Option Explicit`。これ、実は超重要。
これを記述しておくと、変数の宣言忘れ(スペルミスなどによる予期せぬバグ)をVBScriptが強制的に検知してエラーにしてくれるんだ。プログラミングの「お作法」として、必ず書く癖をつけよう。
② `GetObject(“winmgmts:\…”)` とWMIの魔法
OS内部のハードウェアやOS設定は、すべて「WMI」というデータベースに管理されている。
`GetObject` 関数を使うことで、OSの頭脳へ直接パイプをつなぐイメージだ。
`root\cimv2` というのは、Windowsの基本的なシステム情報を司る一番メジャーな部屋(ネームスペース)だと思ってほしい。
③ `Win32_Share` クラスの仕組み
WMIの中には、様々な「設計図(クラス)」がある。今回はその中から `Win32_Share` を指定した。
これにより、OSに登録されている共有フォルダの「名前 (`Name`)」「物理パス (`Path`)」「説明 (`Description`)」といったプロパティをごっそり(コレクションとして)取得できる。
—
5. 現場でよくある「陥りやすいエラー」と対策
現場でこのスクリプトを回すと、たまに壁にぶぶつかることがある。先輩からのアドバイスをここに残しておくね。
1. アクセス拒否エラー(エラー 0x80041003 など)
- 原因: 権限不足。リモートPCを叩く場合、実行しているユーザーが相手のPCの管理者権限(Administrator権限)を持っていないと、WMIは冷たく門前払いを食らわせる。
- 対策: スクリプトを「管理者として実行」する。または、ドメイン管理者権限を持つアカウントで実行すること。
2. パス (`Path`) が空欄になる共有がある?
- 原因: プリンタの共有や、特殊なIPC$共有など、物理的なフォルダパスを持たない共有が存在するため、`objShare.Path` が空になるのは仕様。
- 対策: 出力時に `If objShare.Path <> “” Then` などの条件分岐を挟むと、より綺麗なレポートになるよ。
—
おわりに:VBScriptから広がる自動化の世界
今回は `Win32_Share` を用いた共有フォルダの調査手法を解説した。
VBScriptは古くからある言語だけど、Windowsのアーキテクチャと直結しているため、インフラ管理やセキュリティ監査の現場では今でも現役バリバリで活躍する。
「ここをクリアすれば、VBScriptの基本はバッチリですよ!」
WMIの扉を開けた君は、もうただの初学者じゃない。立派なWindows自動化エンジニアの第一歩を踏み出したんだ。
このコードをベースに、CSVファイルへ出力するようにカスタマイズしたり、ログ保存の機能を付け加えてみたりして、さらに自分だけの強力なツールに育て上げてみてほしい。
それでは、次の自動化の現場でまた会おう!
