🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

2回答

7602閲覧

監視設定の確認のため、Windowsでイベントログにテストで出力したい

nozomu0321

総合スコア18

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

0クリップ

投稿2019/10/31 13:39

編集2019/11/07 14:03

※自己解決に伴い、余裕が出来たところで記述内容があまりにもひどかったので今後参考にする人の為にも内容修正しました。追記個所は太字にしています。

###実現したいこと
PowerShellにこだわりはないので、WindowsServer2008でイベントビューアにPerflibのイベントを出力させたいです。

###背景
WindowsServer2008で出ているアラートがあるのですが、そのアラートを抑止する予定です。監視ソフトは日立のJP1なのですが、日立のサイトには以下の記述があり、下記の文字列が出ないようにイベントログを出力しないと、作業時の正常性確認として正しく動作を確認したとは言えないのではないかと考えていました。
(よくよく見返してみると文言微妙に違いましたね…。テスト環境では正しく動いていたので「トラップできない可能性もある」程度の意味合いだったのかと思ってましたが…。)

イベントログトラップ動作定義ファイル(Windows限定)

メッセージDLLが正しく設定されていない場合,イベントビューアに「メッセージDLLファイルがない可能性があり,説明が見つからない」という旨の文字列が出力されます。この文字列はイベントビューアが出力している文字列のため,イベントログトラップではトラップできません。

###発生している問題
会社でイベント監視のテストを行っていたところ、テストメッセージの出力自体はできるが、「ソース (<application name>) 内のイベント ID (<####>) に関する説明が見つかりませんでした。」という文言も入ってしまう事象が発生しました。
監視ソフトのマニュアルによると、これになってしまうと正しくフィルタの動作をしてくれないらしく、テストがうまくいきません。(本メッセージはメッセージの登録自体が無いと発生するアラートのようですが、該当PCから出ていることは確認しており、イベントビューアのコンピュータもそのPC自身であることを確認しています。)

家のPC(Windows 10 Pro)でも気になったので以下のコードでPowershellにて実行してみました。

Write-EventLog -LogName Application -Source Perflib -EventID 1020 -EntryType Error -Message '必要なバッファー サイズが、"LSM" サービスの "C:\Windows\System32\perfts.dll" 拡張可能カウンター DLL の Collect 関数に渡されたバッファー サイズを超えています。指定されたバッファー サイズは 29568、必要なサイズは 39112 でした。'

※可読性の為、改行しています。本来は1行です。

実行したところ、イベントビューアへの出力は以下の通りになりました。
「必要なバッファー サイズが、"%2" サービスの "%1" 拡張可能カウンター DLL の Collect 関数に渡されたバッファー サイズを超えています。指定されたバッファー サイズは %3、必要なサイズは %4 でした。」
ダブルクォーテーションのせいかもと思い、外したりも試しましたが、変わりませんでした。

いくつかの可変値について、なんらかの値の渡し方があるのだろうと推察しますが、ネットで調べてもこういった値の渡し方がわかりませんでした。(WindowsServer2008と同じように可変値が正しく渡せてないために起きているものだと私の中では思っていたので、類似事例として掲載しました。)

正しくイベントビューアにイベントを出力する方法を知りたいです…。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

なんとなく

「ソース (<application name>) 内のイベント ID (<####>) に関する説明が見つかりませんでした。」という文言も入ってしまう事象

これと

「必要なバッファー サイズが、"%2" サービスの "%1" 拡張可能カウンター DLL の Collect 関数に渡されたバッファー サイズを超えています。指定されたバッファー サイズは %3、必要なサイズは %4 でした。」

これの原因は違うと思う。

前者はイベントソースがちゃんと登録されてないっぽい。(やり方は調べれば出てくると思う)
後者はググれば対応策がヒットする。

https://kzstock.blogspot.com/2019/07/eventid1020-perflib-LSMservice.html

投稿2019/10/31 17:04

gentaro

総合スコア8947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nozomu0321

2019/11/07 13:45 編集

これを類似事例と上げたことには理由があったのですが、 そもそも私の質問内容を見返したらそのあたりの説明が無く、 エスパーでもない限りわかるわけないですよね…。 一応、これらのイベントログについては、どちらも可変値として、XMLでデータを渡してるという特徴があったので類似事例として掲載しました。 で、もうひとつ…これも自分の質問内容に記載されておらず 本当に申し訳ないのですが、これを行いたい背景というのが 同アラートの解決ではなく、監視の抑止設定を行いたい。 工事を行うので、正常性確認としてアラートを再現する必要がある…。 というところからでした。 一応解決はしましたが、問題解決のためのご協力誠にありがとうございました。 また、今後同様のトラブルが発生した人のために質問内容は添削しておきます。
guest

0

自己解決

以下のサイトの投稿を参考に解決しました。
https://kevinholman.com/2016/04/02/writing-events-with-parameters-using-powershell/

#Script to create events with parameters #Define the event log and your custom event source $evtlog = "Application" $source = "Perflib" #Load the event source to the log if not already loaded. This will fail if the event source is already assigned to a different log. #if ([System.Diagnostics.EventLog]::SourceExists($source) -eq $false) { # [System.Diagnostics.EventLog]::CreateEventSource($source, $evtlog) #} #↑は何かの間違いで登録されたら怖いのでコメントアウト #function to create the events with parameters function CreateParamEvent ($evtID, $param1, $param2) { #$id = New-Object System.Diagnostics.EventInstance($evtID,1); #INFORMATION EVENT #$id = New-Object System.Diagnostics.EventInstance($evtID,1,2); #WARNING EVENT $id = New-Object System.Diagnostics.EventInstance($evtID,1,1); #ERROR EVENT $evtObject = New-Object System.Diagnostics.EventLog; $evtObject.Log = $evtlog; $evtObject.Source = $source; $evtObject.WriteEvent($id, @($param1,$param2)) } #Command line to call the function and pass whatever you like CreateParamEvent 1020 "C:\Windows\System32\perfts.dll" ”LSM”

上記のコードを応用すればパラメーターで可変値を渡しているような類の
イベントログについては正常に出力されると思われます。

※注意:開発環境等でテストする際は、その環境で同イベントログの出力履歴がある事を確認してください。
今回の目的は出力実績のあるイベントログを任意のタイミングで出す。
というものなので、そもそもメッセージDLLがその環境に無ければ当然「〇〇の説明が見つかりませんでした」という形で出力されてしまうと思います。

投稿2019/11/07 13:49

nozomu0321

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問