CIMセッションを活用した大規模環境向けリモートシステム監視とログ集計の自動化

Tech

  • 語彙:技術的正確性を担保しつつ、現場の「痛み」を知るシニアエンジニアのトーン。

  • 構成:結論(H1)→ 課題解決 → 設計 → コード → 検証 → 注意点 → まとめ。

  • 視覚:Mermaidによる論理構造の可視化。

  • 構文:標準コマンドレット(CIM推奨)と、.NETによる効率化を重視。 本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証)です。

CIMセッションを活用した大規模環境向けリモートシステム監視とログ集計の自動化

【導入:解決する課題】 複数拠点に点在するWindows端末の負荷状況やエラーログを、エージェントレスで一括収集し、管理者の調査工数を劇的に削減します。(68文字)

【設計方針と処理フロー】 本スクリプトでは、従来のDCOM/RPC(WMI)ではなく、WinRMプロトコルを使用するCIM(Common Information Model)コマンドレットを採用します。これにより、ファイアウォール親和性を高め、セッションの再利用によるオーバーヘッド軽減を図ります。

graph TD
A[Start] --> B["Target List Input"]
B --> C["New-CimSession: Establish Sessions"]
C --> D{"Parallel Processing"}
D --> E["Collect OS/CPU/Disk via CIM"]
D --> F["Filter Critical Event Logs"]
E --> G["Consolidate Data Objects"]
F --> G
G --> H["Export to Central CSV"]
H --> I[Remove-CimSession]
I --> J[End]

【実装:コアスクリプト】 以下は、PowerShell 7の -Parallel 機能を活用し、効率的にリモートPCから情報を抽出するテンプレートです。

function Get-RemoteSystemStatus {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [string[]]$ComputerNames,

        [Parameter(Mandatory = $false)]
        [pscredential]$Credential
    )

    process {

        # セッションオプションの定義

        $sessionOption = New-CimSessionOption -Protocol Wsman -Encoding Utf8

        # 並列処理によるデータ収集 (PowerShell 7+ 推奨)

        $results = $ComputerNames | ForEach-Object -Parallel {
            $comp = $_
            $entry = [PSCustomObject]@{
                Timestamp    = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
                ComputerName = $comp
                Status       = "Success"
                OSVersion    = $null
                CPUUsage     = $null
                FreeDiskGB   = $null
                CriticalLogs = $null
                ErrorMessage = $null
            }

            try {

                # CIMセッションの確立

                $session = New-CimSession -ComputerName $comp -SessionOption $using:sessionOption -ErrorAction Stop

                # 1. システム情報の取得

                $os = Get-CimInstance -CimSession $session -ClassName Win32_OperatingSystem
                $cpu = Get-CimInstance -CimSession $session -ClassName Win32_Processor | Measure-Object -Property LoadPercentage -Average
                $disk = Get-CimInstance -CimSession $session -Query "SELECT FreeSpace FROM Win32_LogicalDisk WHERE DeviceID = 'C:'"

                $entry.OSVersion  = $os.Caption
                $entry.CPUUsage   = [Math]::Round($cpu.Average, 1)
                $entry.FreeDiskGB = [Math]::Round($disk.FreeSpace / 1GB, 2)

                # 2. 直近24時間のCriticalイベントログ(System)

                $logQuery = "SELECT * FROM Win32_NTLogEvent WHERE Logfile = 'System' AND Type = 'Error' AND TimeGenerated > '$( (Get-Date).AddDays(-1).ToString('yyyyMMddHHmmss.ffffff-000') )'"
                $logs = Get-CimInstance -CimSession $session -Query $logQuery
                $entry.CriticalLogs = ($logs | ForEach-Object { $_.Message.Replace("`n", " ") }) -join " | "

                Remove-CimSession $session
            }
            catch {
                $entry.Status = "Failed"
                $entry.ErrorMessage = $_.Exception.Message
            }

            return $entry
        } -ThrottleLimit 10

        return $results
    }
}

# 実行例とCSV出力


# $targets = Get-Content "C:\Path\To\PCList.txt"


# Get-RemoteSystemStatus -ComputerNames $targets | Export-Csv -Path "./SystemReport.csv" -NoTypeInformation -Encoding utf8

【検証とパフォーマンス評価】

  1. 実行時間の計測: Measure-Command を使用して、逐次処理と並列処理を比較。10台のターゲットに対し、逐次処理で約30秒要する環境が、-Parallel を用いることで約8秒(ネットワークレイテンシに依存)まで短縮されることを期待。

  2. スケーラビリティ: -ThrottleLimit を調整することで、メモリ消費と処理速度のトレードオフを管理します。通常、管理端末のスペックに応じて10〜50の値を設定します。

【運用上の落とし穴と対策】

  • WinRMの有効化: リモートPC側で Enable-PSRemoting が実行されている必要があります。ドメイン環境ではGPOでの一括設定を推奨します。

  • PS 5.1互換性: ForEach-Object -Parallel はPowerShell 7専用です。5.1環境では Workflow もしくは Start-Job を検討する必要がありますが、オーバーヘッドが大きいため可能な限りPS 7への移行を推奨します。

  • WMIのリポジトリ破損: 長期稼働しているPCでは WMI サービスがハングしている場合があります。Get-CimInstance がタイムアウトする場合は、RPCサービスの状態確認が必要です。

  • 文字コード: リモートからのログ取得時に日本語が化ける場合、CIMセッションオプションで明示的にエンコーディングを指定します。

【まとめ】

  1. CIMを優先せよ: 従来の Get-WmiObject は非推奨です。セッション管理が可能な Get-CimInstance を使用してください。

  2. 並列化で時短を: 大規模環境では同期処理は実用的ではありません。PS 7の並列処理パイプラインを活用してください。

  3. 例外処理の徹底: ネットワーク断や権限不足は必ず発生します。try/catchによる個別エラー捕捉を組み込み、全体処理を止めない設計にしてください。

ライセンス:本記事のテキスト/コードは特記なき限り CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。

コメント

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