none
イベントログの取得について RRS feed

  • 質問

  • 日次でシェルスクリプトを使用しイベントログの取得を行っています。
    シェルスクリプト内で実行されているコマンドは以下になります。
    先日から以下に記載したエラーが出力されるようになり、イベントログの取得が正常に完了しない状態となってしまいました。
    手動でコマンドを実行してみたところエラーが出力されず、正常にイベントログの取得ができてしまいました。
    以下エラーの原因がわかる方がいらっしゃいましたらご教示願います。

    ・実行されているコマンド
    Get-EventLog -ComputerName <Host_Name> -LogName security -after <シェル実行時か48時間前のタイムスタンプ> -before <シェル実行時のタイムスタンプ> | Format-Table -Wrap -Autosize | Out-File -Encoding default -filepath <ログ出力先指定>

    ・エラー内容
    out-lineoutput : GetBytes() または GetByteCount() を呼び出す前に、Convert() 操作を完了するか、または Encoder.Reset() を呼び出さなければなりません。エンコーダ '日本語 (シフト JIS)' フォールバック 'System.Text.InternalEncoderBestFitFallback'。
        + CategoryInfo          : NotSpecified: (:) [out-lineoutput]、ArgumentException
        + FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.Commands.OutLineOutputCommand
    2014年6月19日 1:52

回答

  • チャブーンです。

    この件ですが、securityイベントのサイズが巨大なため、オブジェクトサイズが2GBを超えている状態で操作しているので、C#の仕様上でエラーが出ているのかもしれないですね。

    http://www.shise.net/wiki/wiki.cgi?page=C%23%2F%CC%E4%C2%EA%A4%C8%B2%F3%C8%F2%BA%F6

    Get-Eventlogの-beforeや-afterオプションで条件抽出した場合、全エントリをオブジェクトとして掴むと思うので(実質Where-Objectと同じ)、ソースの改修がいると思います。以下のような感じでしょうか?

    $EntryStartData=Get-date
    $EntryEndDate=($EntryStartDate).addHours(-48)
    $Entries=@()
    
    Get-EventLog Security |Foreach-Object {
    		IF (($_.TimeGenerated -le $EntryStartData) -and ($_.TimeGenerated -ge $EntryEndDate)) {
    			$Entries+=$_
    			}
    		ElseIf ($_.TimeGenerated -lt $EntryEndDate) {
    			Return
    			}
    		}
    
    $Entries | Format-Table -Wrap -Autosize | Out-File -Encoding default -filepath <ログ出力先指定>

    • 回答の候補に設定 佐伯玲 2014年6月23日 1:14
    • 回答としてマーク 佐伯玲 2014年6月27日 6:08
    2014年6月19日 3:13
    モデレータ
  • チャブーンです。

    腑に落ちない、ということでしたら、まずは切り分けを行っていただくといいと思います。エラーが発生した際にシェルを実行した時刻を起点として、コマンドレットを実行してみてください。前回エラーが出ているとのことですので、同じようにエラーが出たのであれば、オブジェクトサイズの問題の可能性があります。

    Get-EventLog -ComputerName <Host_Name> -LogName security -after <エラーが発生した際のシェルの実行時刻から48時間前の時刻> -before <エラーが発生した際のシェルの実行時刻> | Format-Table -Wrap -Autosize | Out-File -Encoding default -filepath <ログ出力先指定>

    もし再現ができた場合ですが、したのスクリプトを実行していただき、問題が解決するか確認してください。問題が解決すればオブジェクトサイズの問題だと思いますが、解決しなかった場合は別の理由になると思います。

    $EntryStartData=[datetime]"<エラーが発生した際のシェルの実行時刻>"
    $EntryEndDate=($EntryStartDate).addHours(-48)
    $Entries=@()
    
    Get-EventLog -ComputerName <ホスト名> -LogName Security |Foreach-Object {
    		IF (($_.TimeGenerated -le $EntryStartData) -and ($_.TimeGenerated -ge $EntryEndDate)) {
    			$Entries+=$_
    			}
    		ElseIf ($_.TimeGenerated -lt $EntryEndDate) {
    			Return
    			}
    		}
    
    $Entries | Format-Table -Wrap -Autosize | Out-File -Encoding default -filepath <ログ出力先指定>

    あと、「「セキュリティグループの管理の監査」の設定値を【成功】に変更しています。」とのことですが、これは「未構成」だったところをこのように構成した、ということなのでしょうか?であるなら、セキュリティログのエントリの絶対量が増え、ログサイズが増えますので、問題に関連している可能性が高いといえるでしょう。



    2014年6月20日 2:04
    モデレータ

すべての返信

  • チャブーンです。

    この件ですが、securityイベントのサイズが巨大なため、オブジェクトサイズが2GBを超えている状態で操作しているので、C#の仕様上でエラーが出ているのかもしれないですね。

    http://www.shise.net/wiki/wiki.cgi?page=C%23%2F%CC%E4%C2%EA%A4%C8%B2%F3%C8%F2%BA%F6

    Get-Eventlogの-beforeや-afterオプションで条件抽出した場合、全エントリをオブジェクトとして掴むと思うので(実質Where-Objectと同じ)、ソースの改修がいると思います。以下のような感じでしょうか?

    $EntryStartData=Get-date
    $EntryEndDate=($EntryStartDate).addHours(-48)
    $Entries=@()
    
    Get-EventLog Security |Foreach-Object {
    		IF (($_.TimeGenerated -le $EntryStartData) -and ($_.TimeGenerated -ge $EntryEndDate)) {
    			$Entries+=$_
    			}
    		ElseIf ($_.TimeGenerated -lt $EntryEndDate) {
    			Return
    			}
    		}
    
    $Entries | Format-Table -Wrap -Autosize | Out-File -Encoding default -filepath <ログ出力先指定>

    • 回答の候補に設定 佐伯玲 2014年6月23日 1:14
    • 回答としてマーク 佐伯玲 2014年6月27日 6:08
    2014年6月19日 3:13
    モデレータ
  • チャブーンさん

    お世話になります。渡邉と申します。

    ご回答いただきありがとうございます。

    1点気になる点があったので、返信させていただきます。

    オブジェクトサイズが2GBを超えているためにエラーが発生している可能性があるとのことなんですが、上記のGet-EventLogコマンドを手動で実行した際には、エラーは出力されることなくイベントログの取得ができたのですが、C#の仕様上のエラーに該当するのでしょうか?

    また追加情報を記載させていただきます。

    エラーが出力されるようになる前日に、以下の設定変更を行っていたことがわかりました。

    「ローカルセキュリティポリシー」⇒「監査ポリシーの詳細な構成」⇒「システム監査ポリシー - ローカルグループポリシーオブジェクト」⇒「アカウント管理」を表示し、「セキュリティグループの管理の監査」の設定値を【成功】に変更しています。

    エラーが出力されるようになったことと、上記設定変更についてなにか関連があるでしょうか?

    以上、ご確認よろしくお願いいたします。

    2014年6月19日 6:48
  • チャブーンです。

    腑に落ちない、ということでしたら、まずは切り分けを行っていただくといいと思います。エラーが発生した際にシェルを実行した時刻を起点として、コマンドレットを実行してみてください。前回エラーが出ているとのことですので、同じようにエラーが出たのであれば、オブジェクトサイズの問題の可能性があります。

    Get-EventLog -ComputerName <Host_Name> -LogName security -after <エラーが発生した際のシェルの実行時刻から48時間前の時刻> -before <エラーが発生した際のシェルの実行時刻> | Format-Table -Wrap -Autosize | Out-File -Encoding default -filepath <ログ出力先指定>

    もし再現ができた場合ですが、したのスクリプトを実行していただき、問題が解決するか確認してください。問題が解決すればオブジェクトサイズの問題だと思いますが、解決しなかった場合は別の理由になると思います。

    $EntryStartData=[datetime]"<エラーが発生した際のシェルの実行時刻>"
    $EntryEndDate=($EntryStartDate).addHours(-48)
    $Entries=@()
    
    Get-EventLog -ComputerName <ホスト名> -LogName Security |Foreach-Object {
    		IF (($_.TimeGenerated -le $EntryStartData) -and ($_.TimeGenerated -ge $EntryEndDate)) {
    			$Entries+=$_
    			}
    		ElseIf ($_.TimeGenerated -lt $EntryEndDate) {
    			Return
    			}
    		}
    
    $Entries | Format-Table -Wrap -Autosize | Out-File -Encoding default -filepath <ログ出力先指定>

    あと、「「セキュリティグループの管理の監査」の設定値を【成功】に変更しています。」とのことですが、これは「未構成」だったところをこのように構成した、ということなのでしょうか?であるなら、セキュリティログのエントリの絶対量が増え、ログサイズが増えますので、問題に関連している可能性が高いといえるでしょう。



    2014年6月20日 2:04
    モデレータ
  • チャブーンさん

    初歩的な質問で、申し訳ありません。

    ご説明ありがとうございます、内容理解いたしました。

    いただいた情報を元に切り分けから対応を行ってみたいと思います。

    2014年6月23日 0:25