【共有フォルダ全調査】WMI Win32_Share を用いた隠し共有(C$等)を含むローカル・リモート共有一覧の完全取得
レガシーシステムの深層において、VBScriptは依然としてインフラストラクチャの自動化と迅速な監査において独自の地位を維持している。
特に、エージェントレスでWindows環境の深部へアクセスし、OSの生の状態を暴き出すためには、WMI(Windows Management Instrumentation)とVBScriptのコンビネーションを超える軽量かつ即効性のある手段は稀有である。
本稿では、ネットワークセキュリティ監査の現場において最も見落とされがちであり、かつ最も危険なアタックサーフェスとなり得る「共有フォルダ(隠し共有・管理共有を含む)」の網羅的走査について、チーフアーキテクトの視点からその実装の極意を解説する。
—
1. なぜ `Win32_Share` なのか:APIの選定とアーキテクチャの罠
Windows環境における共有リソースの列挙には、いくつかのAPIアプローチが存在する。
- NetShareEnum(Win32 API)
- WMI `Win32_Share` クラス
- PowerShell (`Get-SmbShare`)
現代においてはPowerShellが主役であるが、Active Directoryドメインに参加していないワークグループ環境、あるいはPowerShellの実行ポリシー(ExecutionPolicy)が厳格に制限されたレガシー踏み台サーバーにおいて、「依存関係なしで即座に動作する」という点においてVBScript + WMIの優位性は揺るぎない。
しかし、`Win32_Share` を扱う際には、COMオブジェクトのライフサイクル管理と、リモート接続時のDCOM/RPCセキュリティコンテキストの罠を深く理解していなければならない。
—
2. 実装コード:セキュリティ監査用・共有一括走査スクリプト
以下のコードは、ローカルまたは指定したリモートマシンの共有フォルダを走査し、パス、共有タイプ、そしてセキュリティ上の要である「隠し共有(末尾が`$`の共有)」を識別してCSV形式(あるいはコンソール出力)でレポートするプロダクション品質のスクリプトである。
‘ ==============================================================================
‘ Script Name: Audit-ShareExplorer.vbs
‘ Description: WMI Win32_Shareを用いた隠し共有を含む共有一覧の完全取得と監査
‘ Author: Chief Architect
‘ ==============================================================================
Option Explicit
Const wbstrComputer = “.” ‘ “.” はローカル。リモートの場合は “192.168.1.50” 等を指定
Call Main()
Sub Main()
Dim objWMIService, colShares, objShare
Dim strTargetComputer
Dim shareTypeDesc, isHidden
Dim fso, ts
Dim reportPath
strTargetComputer = wbstrComputer
reportPath = “C:\Share_Audit_Report_” & Year(Now) & _
Right(“0” & Month(Now), 2) & Right(“0” & Day(Now), 2) & “.csv”
WScript.Echo “[INFO] WMIサービスへの接続を開始します: ” & strTargetComputer
‘ 1. WMIネームスペースへの接続(接続タイムアウトやセキュリティ権限を考慮)
On Error Resume Next
Set objWMIService = GetObject(“winmgmts:\\” & strTargetComputer & “\root\cimv2”)
If Err.Number <> 0 Then
WScript.Echo “[FATAL] WMI接続に失敗しました。エラーコード: 0 & Hex(Err.Number) & ” – ” & Err.Description
Exit Sub
End If
On Error GoTo 0
‘ 2. Win32_Share インスタンスのクエリ
‘ 隠し共有(C$, IPC$, ADMIN$等)も含めて全て取得する
Set colShares = objWMIService.InstancesOf(“Win32_Share”)
‘ 3. レポートファイル(CSV)の初期化
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set ts = fso.CreateTextFile(reportPath, True, False) ‘ ASCII形式で出力
‘ CSVヘッダーの書き込み
ts.WriteLine “ComputerName,ShareName,Path,Type,IsHidden,MaximumAllowed,Description”
WScript.Echo “[INFO] 共有フォルダの走査中…”
For Each objShare in colShares
‘ 共有タイプの文字列変換
shareTypeDesc = GetShareTypeDescription(objShare.Type)
‘ 隠し共有(名前に$が含まれる、または特定のシステム共有)の判定
If Right(objShare.Name, 1) = “$” Then
isHidden = “True (Hidden/Admin)”
Else
isHidden = “False”
End If
‘ CSV行の構築(パスがNullの場合のハンドリングを含む)
Dim sharePath
If IsNull(objShare.Path) Then
sharePath = “[N/A – Device or IPC]”
Else
sharePath = Replace(objShare.Path, “”””, “”””””) ‘ ダブルクォートのエスケープ
End If
ts.WriteLine “””” & strTargetComputer & “””,” & _
“””” & objShare.Name & “””,” & _
“””” & sharePath & “””,” & _
“””” & shareTypeDesc & “””,” & _
“””” & isHidden & “””,” & _
“””” & objShare.MaximumAllowed & “””,” & _
“””” & objShare.Description & “”””
Next
‘ 4. リソースの確実な解放(メモリリークの防止)
ts.Close
Set ts = Nothing
Set fso = Nothing
Set colShares = Nothing
Set objWMIService = Nothing
WScript.Echo “[SUCCESS] 監査レポートの出力が完了しました: ” & reportPath
End Sub
‘ ——————————————————————————
‘ Win32_Share.Type の数値定数を人間が読める形式に変換する関数
‘ ——————————————————————————
Function GetShareTypeDescription(ByVal shareType)
Select Case shareType
Case 0: GetShareTypeDescription = “Disk Drive”
Case 1: GetShareTypeDescription = “Print Queue”
Case 2: GetShareTypeDescription = “Device”
Case 3: GetShareTypeDescription = “IPC”
Case 2147483648: GetShareTypeDescription = “Disk Drive Admin”
Case 2147483649: GetShareTypeDescription = “Print Queue Admin”
Case 2147483651: GetShareTypeDescription = “IPC Admin”
Case Else: GetShareTypeDescription = “Unknown (” & shareType & “)”
End Select
End Function
—
3. シニアエンジニアが押さえるべき「極限の知見」
① 隠し共有(Administrative Shares)の脅威と監査の要諦
コード内でも判定している末尾が `$` の共有(`C$`、`ADMIN$`、`IPC$` 等)は、OSが管理目的で自動生成するものである。
これらは攻撃者にとって、資格情報(Credential)を奪取した後のラテラルムーブメント(横展開)の足がかりとして最初に狙われるポイントである。
監査レポートにおいて、意図しないカスタム隠し共有が存在しないか、あるいは不要な管理共有が無効化されているかを機械的にチェックすることが極めて重要となる。
② WMIクエリのメモリ管理と COM 参照の罠
VBScriptにおける最大の悪習は、オブジェクトを変数に入れたままスクリプトを終了させることによるCOMコンポーネントのメモリリークである。
特に `InstancesOf` や `ExecQuery` は、内部的に膨大なCOMラッパーを生成する。
スクリプトの終端において、以下のように逆順で明示的に `Nothing` を代入することが、長期稼働するバッチや監視エージェントにおいて必須の作法となる。
Set colShares = Nothing
Set objWMIService = Nothing
これを怠ると、WMIプロバイダホスト(`WmiPrvSE.exe`)のメモリ使用量が肥大化し、最終的にWindowsのパフォーマンス低下を引き起こす原因となる。
③ アクセス権限(DACL)への踏み込み
`Win32_Share` 自体は共有のメタデータ(名前やパス)しか持たない。もしNTFSアクセス権や共有パーミッション(ACL)まで踏み込んで監査したい場合、`Win32_LogicalShareSecuritySetting` クラスと連携し、関連付け(Associators of)クエリを使用する必要がある。
ただし、これはパフォーマンスコストが非常に高いため、全社一括調査を行う際は対象サーバーの負荷に十分配慮しなければならない。
—
結言
VBScriptは「レガシー」の代名詞として語られがちだが、その本質は「OSの根底に直接、最小限のオーバーヘッドでアクセスできる極めて洗練されたシェル言語」である。
インフラの自動化やセキュリティ監査の現場において、GUIや複雑なランタイムに依存しないこのアプローチを知ることは、システムアーキテクトとしての生存戦略そのものである。
コードをデプロイし、組織内のシャドーITや放置された共有フォルダの闇を暴き出すこと——それこそが、真のシステム管理者に課された責務である。
