5️⃣

PowerShell 5.1でイベントログを出力する方法

2024/03/25に公開

概要

Windows標準でインストールされているPowerShell 5.1の環境でイベントログを出力する方法を紹介。

なお、バージョンが6.0以降(PowerShell Core Edition)では、同じ方法を使えません。

※ PowerShell 6.0以降でイベントログを出力する方法は、こちらの記事を参照してください。

この記事のターゲット

  • PowerShell ユーザーの方
  • PowerShell バージョン 5.1 環境でイベントビューアーにログを出力したい方
    • 【パターンA】自作のイベントソースとイベントIDで出力
    • 【パターンB】既存のイベントソースとイベントIDで出力

環境

PS C:\WINDOWS\system32> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.19041.4046
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.19041.4046
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1


PS C:\WINDOWS\system32>

対応方法

イベントログに出力する方法は、一般ユーザーでも実行可能なWrite-EventLogコマンドレット。
 
出力するログの種類が既存のイベントIDやイベントソース(イベントプロバイダー)ではなく、自作したものを指定したい場合は、事前にNew-EventLogでイベントソースの作成が必要となります。
なお、New-EventLogは、管理者権限が必要なコマンドレットです。

【パターンA】自作のイベントソースとイベントIDで出力

イベントビューアーにある Windows ログ -> アプリケーション内 に自作のソース "MyAppSource" でログを出力。

  1. イベントソースを作成

    “管理者として実行”の必要あり
    New-EventLog -LogName "ログの種類を指定(ログの保存場所)" -Source "作成するイベントソース名"
    
    実際に実行した結果
    PS C:\WINDOWS\system32> New-EventLog -LogName Application -Source MyAppSource
    PS C:\WINDOWS\system32>
    
    すでに指定したイベントソースが存在する場合はエラー
    PS C:\WINDOWS\system32> New-EventLog -LogName Application -Source MyAppSource
    New-EventLog : "MyAppSource" ソースは、既に "localhost" コンピューターに登録されています。
    発生場所 行:1 文字:1
    + New-EventLog -LogName Application -Source MyAppSource
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [New-EventLog]、InvalidOperationException
        + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.NewEventLogCommand
    
    PS C:\WINDOWS\system32>
    
    イベントソースを削除する場合 < クリックで折りたたみが開く >
    “管理者として実行”の必要あり
    Remove-EventLog -Source MyAppSource
    
    実際に実行した結果
    PS C:\WINDOWS\system32> New-EventLog -LogName Application -Source MyAppSource
    PS C:\WINDOWS\system32>
    
  2. 自作のイベントログを出力

    ここでは管理者権限は不要(前の工程でイベントソース作成済みのため)
    Write-EventLog -LogName "ログの種類" -Source "対象のイベントソース" -EntryType "エラーレベル" -EventId "対象のイベントID" -Message "出力するメッセージ内容"
    

    前述で作成したイベントソースを指定してイベントログを出力。

    実際に実行した結果
    PS C:\Users\"ユーザー名"> Write-EventLog -LogName Application -Source MyAppSource -EntryType Information -EventId 1001 -Message "Test Message."
    PS C:\Users\"ユーザー名">
    

    出力したログをイベントビューアーで確認
    画像:Write-EventLogコマンドレットにより出力したログをイベントビューアーで確認

【パターンB】既存のイベントソースとイベントIDで出力

  1. 指定するイベントソース・イベントIDを決定

    ※ 既存のイベントソースやイベントIDを確認する方法は、こちらの記事を参照してください。

  2. 既存のイベントIDでイベントログを出力

    作成済みのイベントソースを指定する為、管理者権限なしで実行可能
    Write-EventLog -LogName "ログの種類" -Source "対象のイベントソース" -EntryType "エラーレベル" -EventId "対象のイベントID" -Message "出力するメッセージ内容"
    

    前述で作成したイベントソースを指定してイベントログを出力。

    実際に実行した結果
    PS C:\Users\"ユーザー名"> Write-EventLog -LogName Application -Source "Microsoft-Windows-Winsrv" -EntryType Error -EventId 10002 -Message "Test Data"
    PS C:\Users\"ユーザー名">
    

    出力したログをイベントビューアーで確認
    画像:出力したログをイベントビューアーで確認

まとめ

  • 自作のイベントログを出力する方法

    1. イベントソースを作成

      “管理者として実行”の必要あり
      New-EventLog -LogName "ログの種類を指定(ログの保存場所)" -Source "作成するイベントソース名"
      
    2. 作成したイベントソースを指定しイベントログを出力

      自作のイベントソースとイベントIDを指定(管理者権限は不要)
      Write-EventLog -LogName "ログの種類" -Source "対象のイベントソース" -EntryType "エラーレベル" -EventId "対象のイベントID" -Message "出力するメッセージ内容"
      
  • 既存のイベントソース・イベントIDを指定する方法

    既存のイベントソースとイベントIDを指定(管理者権限は不要)
    Write-EventLog -LogName "ログの種類" -Source "対象のイベントソース" -EntryType "エラーレベル" -EventId "対象のイベントID" -Message "出力するメッセージ内容"
    

関連記事

https://zenn.dev/haretokidoki/articles/48de2dc693f9c0
https://zenn.dev/haretokidoki/articles/af3e404855c54b
https://haretokidoki-blog.com/pasocon_powershell-startup/
https://zenn.dev/haretokidoki/articles/7e6924ff0cc960

GitHubで編集を提案

Discussion