Powershellでサーバ管理のための前日のイベントログを出力するプログラムを作成する際の疑問

このQ&Aのポイント
  • 初めてPowershellを使用してサーバ管理のための前日のイベントログを出力するプログラムを作成しましたが、一部エラーが発生しています。
  • エラーが発生している箇所は、HostNameの出力方法です。正しいHostNameを表示させるためにはどのように書けば良いのでしょうか?
  • ご指導いただけると幸いです。
回答を見る
  • ベストアンサー

Powershell プログラミングについて

サーバ管理をしている中で、日次で前日のイベントログを出力するプログラムを書きました。 初めてPowershellを使用し、ネットを観ながら見よう見まねで書いていたのですが、 ひとつ躓いてしまい・・・教えていただけないでしょうか? ---------------------------------------------------------------------------------- # system、application、securityのログを出力(ErrorとWarningのみ) $type = [string] $event = [system.diagnostics.eventLogEntry] $count = [int] $count = 0 foreach ($type in "system","application","security"){ # ログ取得 $event = get-EventLog -logname $type -after $start_time_yesterday -before $end_time_yesterday | ` Where-Object { $_.EntryType -eq "Warning" -or $_.EntryType -eq "Error" } | ` Where-Object { $_.EventID -ne "1111" -and $_.EventID -ne "5722" -and $_.EventID -ne "5719" }| ` Select-Object EntryType,EventID,TimeGenerated,Source,Message,HostName[$hostname] # テキストファイルに出力 $event >> $fPath ---------------------------------------------------------------------------------- このようなプログラムを書いたところ、 出力結果は以下のようになりました。 ---------------------------------------------------------------------------------- EntryType : Warning EventID : 14 TimeGenerated : 2012/10/10 8:54:05 Source : W32Time Message : タイム ソースとして使うドメイン コントローラを見つけることができません でした。15 分後に再試行します。 HostName[SAKURAI-PC] : ---------------------------------------------------------------------------------- HostName :[SAKURAI-PC] にするにはどのように書いたらよいのでしょうか? ご指導お願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • maesen
  • ベストアンサー率81% (646/790)
回答No.1

間違っていたら申し訳ないのですが、Get-EventLogの出力にHostNameは無いと思いますので、Get-EventLogの結果にカスタマイズでHostNameを追加したいということでいいでしょうか? また、$hostnameは質問文に設定が出て来ませんのでどこかで設定されていると考えていいでしょうか? >HostName[SAKURAI-PC] : このように表示されるのは、 >Select-Object EntryType,EventID,TimeGenerated,Source,Message,HostName[$hostname] ここで定義されていないオブジェクトをselectしているので空の値が表示されているのでこのようになっていると思います。 前提が正しければ、$eventにプロパティとしてHostNameを追加してやればご希望の結果が得られると思います。 $a = "[$hostname]" Add-Member -InputObject $event -MemberType noteproperty -Name HostName -Value $a $eventのパイプの中に入れたければ InputObjectを外した形にすればいいでしょう。 Add-Memberについてはヘルプで確認して見て下さい。 違っていたらごめんなさいです。

sakuraiy2
質問者

お礼

無事ホスト名を出力させることができました! ありがとうございます。 Add-Memberすら知らなくて…ご迷惑をお掛けしました。 結局、下記のようにプログラムを追加しました。 # ログ取得 $event = get-EventLog -logname $type -after $start_time_yesterday -before $end_time_yesterday | ` Where-Object { $_.EntryType -eq "Warning" -or $_.EntryType -eq "Error" } | ` Where-Object { $_.EventID -ne "1111" -and $_.EventID -ne "5722" -and $_.EventID -ne "5719" -and $_.EventID -ne "1530" }| ` Add-Member NoteProperty HostName $hostname -pass | ` Select-Object EntryType,EventID,TimeGenerated,Source,HostName,Message 本当にありがとうございます。

関連するQ&A

  • Powershellで実行した結果を

    Powershellで実行した結果を イベントビューアに出力したいと考えております。 出力メッセージを「番号:使用ユーザ名:メッセージ内容」を出力したいのですが (1)は使用ユーザ名が出力されず (2)は{使用ユーザ名}で出力されます。 (1)Write-EventLog -LogName Application test -EventId 1234 -EntryType Error -Message "0000001:$env:username:処理に失敗しました。" (2)Write-EventLog -LogName Application test -EventId 1234 -EntryType Error -Message "0000001:{$env:username}:処理に失敗しました。" 記述方法で「番号:使用ユーザ名:メッセージ内容」を出力する方法を ご存知でしたらご教授頂ければと思います。

  • eventquery.vbsとバッチの使い方について教えて下さい。

    初めての投稿致します。 よろしくお願いします。 現在Windows2003 Server SP2 R2(ENG)の環境のサーバーのイベントログを取得したいと思っており、eventquery.vbsを使用してバッチを作成しているのですが、下記点が突破できずにいます。 どのように改善したらよいか教えて頂けますでしょうか? やりたいこと ・月曜日に実行するときには金曜日、土曜日、日曜日分のイベント(エラー、警告)を取得したい。 ・火曜日、水曜日、木曜日、金曜日は1日前のイベントを取得したい。 現在は単純に全てのイベント(エラー、警告)を取得する。だけのバッチファイルしか作成出来ておりません。 下記のようなバッチです。 ------------------------------------------------------------ @echo on @REM ------------------------------- 日時 SET YYYYMMDD=%date:~-10,4%%date:~-5,2%%date:~-2,2% SET HHMM=%time:~0,2%%time:~3,2% SET FNAME=%YYYYMMDD: =%_%HHMM: =0% @REM ------------------------------- ホスト/出力先、出力ログファイル SET VBSP=c:\windows\system32\eventquery.vbs SET H1=server1 SET LOG=C:\command\%FNAME%_Event_log.csv @REM ------------------------------- 実行日時 @echo %date% %Time:~0,5% に実行しました。> %LOG% @REM ------------------------------- server1出力結果 cscript %VBSP% /s %H1% /fi "type eq warning" /l system /fo csv /v >> %LOG% cscript %VBSP% /s %H1% /fi "type eq Error" /l system /fo csv /v >> %LOG% cscript %VBSP% /s %H1% /fi "type eq warning" /l application /fo csv /v >> %LOG% cscript %VBSP% /s %H1% /fi "type eq Error" /l application /fo csv /v >> %LOG% どのようにすればよいのでしょうか? お手数ですが、ご教授お願い致します。

  • perl初心者です。宜しくお願い致します。

    ファイルの容量が大きく。perlを使用してデータの集計をしています。 "A"がきたらflag1をたてなさい。 "B"がきたらflag2をたてなさい。 "C"がきたらflag3をたてなさい。 これでAとBとCを抜き取ること&AからCまでの時間を取得したのですが、 Bの数のmaxの値だけを抜き取りたいのですが、Bがきたときの数をすべて 出力してしまいます。下記の文だと、Bが4回きたら、1,2,3,4と出力してしまいます。 それで4だけを出力したいのですがどのように書き換えたらようか教えて頂けますでしょうか。 '----------------------------------------------------------------------------- open (IN,"< $ARGV[0].txt") or die; open (OUT,"> $ARGV[0]_out.txt") or die; $flag =0; my $a, $b, $c; $count = 0; ####################################################### while($line =<IN>){ ($time,$data) = split(/\s+/,$line); if($data eq "A") { $flag=1; $a = $time; #print OUT $line; #print OUT "\n"; } elsif($data eq "B"){ $flag=2; $count++; $count == $data; print OUT ("$count\n") } #print OUT ("$count\n"); elsif($data eq "C"){ $flag=0; $count=0; $b = $time; $c = $b - $a; print OUT ("time $c\n") } } -------------------------------------------------------------------------------

  • Powershellでzip圧縮が出来ない

    Powershellでzip圧縮しようとしているのですが、 ・Powershell ISEで実行すると正常に圧縮 ・コマンドプロンプトで実行すると、「圧縮(zip形式)フォルダーエラー」が発生し、圧縮できない という現象が発生しています。コマンドプロンプトで実行できるようにしたいのですが、原因がわからないので、御教示をお願いします。 ・環境 Windows XP SP3 Powershell 2.0 ・Powershellソース # 引数チェック # 引数の数が2以外の時は異常終了 if ($args.Length -ne 2 ) { write-host "引数エラー" exit 2; } # 圧縮zipファイル名 $ZipFilePath = $Args[0] # 圧縮対象ファイル名 $TargetItems = $Args[1] # 圧縮先パス存在チェック if((Test-Path (Split-Path $ZipFilePath -Parent)) -ne $True){ write-host "圧縮先パスエラー" exit 3; } # 圧縮対象ファイル存在チェック if((Test-Path ($TargetItems)) -ne $True){ write-host "圧縮対象ファイルエラー" exit 4; } # Zipファイルが存在する場合は削除 if(Test-Path -Path $ZipFilePath) { Remove-Item -Path $ZipFilePath } # Zipファイル作成 Set-Content $ZipFilePath ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) (dir $ZipFilePath).IsReadOnly = $false # Zipファイルにファイルを投入 $shell = New-Object -com Shell.Application $zipfile = $shell.NameSpace($ZipFilePath) $archivedItems = New-Object Collections.ArrayList # 圧縮対象ファイルの数だけループ foreach($item in ($TargetItems | %{Get-Item -Path $_})) { # ファイルをZipファイルに投入。圧縮処理は非同期なので、その終了を待つ。 $archivedItems.Add($item) | Out-Null $zipfile.CopyHere($item.FullName) while($true) { if($archivedItems.Count -eq $zipfile.Items().Count) { break } Start-Sleep -Seconds 1 } } write-host "処理終了" exit 0

  • イベントログに怪しいLOGが・・・

    DCP-J982ユーザです。 Windows10をクリーンインストール後にイベントログに怪しいメッセージが出力されるようになりました。 (1) ログの名前: Application ソース: USBAppControl 日付: 2020/04/14 23:15:08 イベント ID: 65535 タスクのカテゴリ: なし レベル: エラー キーワード: クラシック ユーザー: N/A コンピューター: DESKTOP-8OAL2OR 説明: Start Server... イベント XML: <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> <System> <Provider Name="USBAppControl" /> <EventID Qualifiers="0">65535</EventID> <Level>2</Level> <Task>0</Task> <Keywords>0x80000000000000</Keywords> <TimeCreated SystemTime="2020-04-14T14:15:08.391203500Z" /> <EventRecordID>3017</EventRecordID> <Channel>Application</Channel> <Computer>DESKTOP-8OAL2OR</Computer> <Security /> </System> <EventData> <Data>Start Server...</Data> </EventData> </Event> (2) ログの名前: Application ソース: USBAppControl 日付: 2020/04/14 23:15:08 イベント ID: 65535 タスクのカテゴリ: なし レベル: エラー キーワード: クラシック ユーザー: N/A コンピューター: DESKTOP-8OAL2OR 説明: Wait Workflow Commands request from device. イベント XML: <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> <System> <Provider Name="USBAppControl" /> <EventID Qualifiers="0">65535</EventID> <Level>2</Level> <Task>0</Task> <Keywords>0x80000000000000</Keywords> <TimeCreated SystemTime="2020-04-14T14:15:08.406829900Z" /> <EventRecordID>3018</EventRecordID> <Channel>Application</Channel> <Computer>DESKTOP-8OAL2OR</Computer> <Security /> </System> <EventData> <Data>Wait Workflow Commands request from device.</Data> </EventData> </Event> (3) ログの名前: Application ソース: WorkflowAppControl 日付: 2020/04/14 23:15:08 イベント ID: 65535 タスクのカテゴリ: なし レベル: エラー キーワード: クラシック ユーザー: N/A コンピューター: DESKTOP-8OAL2OR 説明: 値を Null にすることはできません。 パラメーター名:ipString イベント XML: <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> <System> <Provider Name="WorkflowAppControl" /> <EventID Qualifiers="0">65535</EventID> <Level>2</Level> <Task>0</Task> <Keywords>0x80000000000000</Keywords> <TimeCreated SystemTime="2020-04-14T14:15:08.422453500Z" /> <EventRecordID>3020</EventRecordID> <Channel>Application</Channel> <Computer>DESKTOP-8OAL2OR</Computer> <Security /> </System> <EventData> <Data>値を Null にすることはできません。 パラメーター名:ipString</Data> </EventData> </Event> いくつかネットで検索したところ、Brotherのdriverが悪さをしているようです。 C:\Program Files (x86)\Brother\iPrint&Scan\USBAppControl.exe C:\Program Files (x86)\Brother\iPrint&Scan\WorkflowAppControl.exe どなたか解決法をご存じありませんか? windows10は、Ver1909 Build 18363.720 です。 ※OKWAVEより補足:「ブラザー製品」についての質問です。

  • イベント ビューアーでのコントローラー エラー

    ログの名前: System ソース: Disk 日付: 2009/12/22 19:36:37 イベント ID: 11 タスクのカテゴリ: なし レベル: エラー キーワード: クラシック ユーザー: N/A コンピューター: nox-PC 説明: ドライバーは \Device\Harddisk6\DR6 でコントローラー エラーを検出しました。 イベント XML: <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> <System> <Provider Name="Disk" /> <EventID Qualifiers="49156">11</EventID> <Level>2</Level> <Task>0</Task> <Keywords>0x80000000000000</Keywords> <TimeCreated SystemTime="2009-12-22T11:36:37.872070300Z" /> <EventRecordID>303727</EventRecordID> <Channel>System</Channel> <Computer>nox-PC</Computer> <Security /> </System> <EventData> <Data>\Device\Harddisk6\DR6</Data> <Binary>0E02680001000000000000000B0004C003010000000000000000000000082D000000000000000000F09A090000000000FFFFFFFF0600000040000000000000000000061208000010000000003C0000000000000000A2C5880000000038B33B89000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000</Binary> </EventData> </Event> こんなんのが出てきましたが、問題のデバイスはどれなのかさっぱりわかりません。 問題箇所を特定する方法を教えてください。 宜しくお願いします。

  • DataSet(DataTable)の使い方

    GridViewやListViewなどに動的にデータを追加していきたいので、 DataTableを使おうと思いました。 下記、(1)のようにPageLoadイベントで1行追加することはできたのですが、 ボタンを押すごとに、1行ずつ追加していきたいので(2)のように修正したのですが、 ボタンを押したときのポストバックで、DataSetもDataTableもnullになってしまい、 行の追加ができません。 ボタンを押すごとにどんどん行を追加していきたいのですが、このような場合は どのようにDataSetもDataTableを保持しておけば良いのでしょうか。 (1) public partial class WebForm1 : System.Web.UI.Page { int count = 0; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { DataSet dS = new DataSet("dS"); DataTable dT = new DataTable("dT"); // データテーブル カラム作成 dT.Columns.Add("no", typeof(int)); dT.Columns.Add("name", typeof(string)); dT.Columns.Add("kind", typeof(string)); dT.Columns.Add("time", typeof(int)); dS.Tables.Add(dT); DataRow dR = dT.NewRow(); dR["no"] = count; dR["name"] = count.ToString(); dR["kind"] = count.ToString(); dR["time"] = count; dT.Rows.Add(dR); // リストビュー データソース選択 ListView2.DataSource = dS; ListView2.DataBind(); } } } (2) public partial class WebForm2 : System.Web.UI.Page { int count = 0; DataSet dS; DataTable dT; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { dS = new DataSet("dS"); dT = new DataTable("dT"); // データテーブル カラム作成 dT.Columns.Add("no", typeof(int)); dT.Columns.Add("name", typeof(string)); dT.Columns.Add("kind", typeof(string)); dT.Columns.Add("time", typeof(int)); dS.Tables.Add(dT); } } protected void Button1_Click(object sender, EventArgs e) { count = count + 1; DataRow dR = dT.NewRow(); dR["no"] = count; dR["name"] = count.ToString(); dR["kind"] = count.ToString(); dR["time"] = count; dT.Rows.Add(dR); // リストビュー データソース選択 ListView2.DataSource = dS; ListView2.DataBind(); } }

  • 「システム時刻の同期は とれていません」のイベントの警告が記録されます。

    イベントの種類: 警告 イベント ソース: W32Time イベント カテゴリ: なし イベント ID: 36 日付: 2005/2/7 時刻: 20:44:06 ユーザー: N/A コンピュータ: *** 説明: タイム プロバイダが使用可能なタイム スタンプを提供できていないため、 システム時刻を 49152 秒同期することができません。システム時刻の同期は とれていません。 このようなイベントの警告ログが記録されます。これは一体どういう事なのでしょうか?何かシステムに不具合があるのでしょうか? PCはNECのVALUESTAR WinXP SP2です。

  • Windows7 Schannelのエラー3688

    Windows7(SP1)イベントログにSchannelのエラー ID: 3688が連続的に記録されています。 どのような原因で発生し、何か対応が必要でしょうか。よろしくお願いします。 ログの名前: System ソース: Schannel 日付: 2013/03/30 12:23:30 イベント ID: 36888 タスクのカテゴリ: なし レベル: エラー キーワード: ユーザー: SYSTEM コンピューター: 説明: 次の致命的な警告が生成されました: 10。内部エラーの状態は 10 です。 イベント XML: <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> <System> <Provider Name="Schannel" Guid="{1F678132-5938-4686-9FDC-C8FF68F15C85}" /> <EventID>36888</EventID> <Version>0</Version> <Level>2</Level> <Task>0</Task> <Opcode>0</Opcode> <Keywords>0x8000000000000000</Keywords> <TimeCreated SystemTime="2013-03-30T03:23:30.801106200Z" /> <EventRecordID>104102</EventRecordID> <Correlation /> <Execution ProcessID="644" ThreadID="5440" /> <Channel>System</Channel> <Computer>      </Computer> <Security UserID="     " /> </System> <EventData> <Data Name="AlertDesc">10</Data> <Data Name="ErrorState">10</Data> </EventData> </Event>

  • EXCELファイルからの値取得に関して

    環境:Visual Basic 2008 教えて下さい。 画面上から2つのEXCELファイルを指定し、1回の処理でその2つの EXCELからそれぞれ値を取得したいと考えています。 その為、以下のような記述をしましたが、2回目の値取得のところで "オブジェクト参照がオブジェクト インスタンスに設定されていません。" というエラーメッセージとなってしまいます。 1つのファイルから取得する事は経験ありましたが、同時に2回は初めてで ある為、記述方法が正しいのか、、、 どのように記述したら良いかを教えて下さい。 初歩的な質問で申し訳ありませんが、よろしくお願いします。 《記述内容》 'EXCELファイルを開く Dim xlFilePath As String = ofd1.FileName '起動時の処理 Dim xlApp As Object xlApp = CreateObject("Excel.Application") Dim xlBooks As Object = xlApp.Workbooks Dim xlBook As Object = xlBooks.Open(xlFilePath) '現シート数 Dim S_COUNT As Integer = xlBook.Worksheets.Count Dim xlSheets As Object = xlBook.Worksheets Dim xlSheet As Object = CType(xlSheets.Item(1), Object) '現シート数 S_COUNT = xlBook.Worksheets.Count Dim R_名称 As String R_名称 = "" R_名称 = xlSheet.Cells(1, 1).Value 'COM オブジェクトの解放 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks) 'Excel のプロセス終了 xlApp.DisplayAlerts = False xlApp.Quit() System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp) GC.Collect() 'のEXCELファイルを開く Dim xlFilePath2 As String = ofd2.FileName '起動時の処理 Dim xlApp2 As Object xlApp2 = CreateObject("Excel.Application") Dim xlBooks2 As Object = xlApp2.Workbooks Dim xlBook2 As Object = xlBooks2.Open(xlFilePath2) '現シート数 Dim S_COUNT2 As Integer = xlBook2.Worksheets.Count Dim xlSheets2 As Object = xlBook2.Worksheets Dim xlSheet2 As Object = CType(xlSheets2.Item(1), Object) '現シート数 S_COUNT = xlBook2.Worksheets.Count Dim R_番号 As String R_番号 = "" R_番号 = xlSheet2.Cells(I_COUNT2, 1).Value 'COM オブジェクトの解放 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks) 'Excel のプロセス終了 xlApp.DisplayAlerts = False xlApp.Quit() System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp) GC.Collect()

専門家に質問してみよう