SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

Archive for 8月 12th, 2010

PowerShell でイベントログを保存

leave a comment

以前、このような投稿をしました。
WMIC で イベントログをローテーション

今回は PowerShell でイベントログを保存してみたいと思います。

イベントログ関連のコマンドレットとしては以下のようなものがあります。

PS >get-command "*EventLog" | Format-Table name

Name
—-
Clear-EventLog
Get-EventLog
Limit-EventLog
New-EventLog
Remove-EventLog
Show-EventLog
Write-EventLog

イベントログの情報取得 (Get-EventLog) や、イベントログに情報出力 (New-EventLog) はあるのですが、イベントログを
evt 形式で保存するようなコマンドレットはないみたいなのですよね。
# Export-CSV でファイルにリダイレクトすることはできますが。

evt 形式でイベントログを保存するためには、WMI を使って BackupEventLog をコールする必要があるようです。
結果、WMIC と一緒になりますね。

以下のような PowerShell を実行する事でイベントログを取得し、evt 形式でファイルに保存することが可能です。
# backupeventlog は既にファイルが存在していると保存されないため、Test-Path でファイルの存在確認をして
  ファイルが存在している場合は削除しています。

$LogDir = "C:temp"
$EventLog = Get-WmiObject win32_nteventlogfile
foreach ($Log in $EventLog){
??? $Log.PSBase.Scope.Options.EnablePrivileges = $true
??? $EvtFile = $Log.LogfileName + "_" + (Get-Date).ToString("yyyyMMddHHmm") + ".evt"
??? if((Test-Path ($LogDir + "" + $EvtFile)) -eq $true) {
??????? Remove-Item ($LogDir + "" + $EvtFile)
??? }
??? $Log.backupeventlog($LogDir + "" + $EvtFile)
}

ポイントとしては、

  1. [PSBase.Scope.Options.EnablePrivileges = $true] を設定する
  2. [Security] のログは、[管理者グループ (Administrators) かつ、[管理者として実行]] していないと取得できない

というところかと。

EnablePrivileges を設定しないで [BackupEventLog] をコールすると [アクセスが拒否されました] というエラーになることがあります。
# Windows Server 2003 だと現象が発生したのですが、Windows 7 だと発生しませんでした…。

この辺りに関しては以下の情報が参考になります。
Vista – Win32_NTEventLogFile BackupEventLog: Access denied
WMI による Windows の管理

Security のログは通常のイベントビューアーでも Administrators しか表示することができないのですが、PowerShell で
Security のログを操作するときは Administrators かつ、管理者として実行する必要があります。

セキュリティログに関しては、以下の情報が分かりやすいかと。
サーバー管理者のためのイベントログ運用の基本

Administrators グループのユーザーで管理者として実行していない場合の [Get-WmiObject win32_nteventlogfile] の実行結果がこちらです。

Get-WmiObject win32_nteventlogfile | Format-Table LogfileName

LogfileName
———–
Application
HardwareEvents
Internet Explorer
Key Management Service
Media Center
ODiag
OSession
System
Windows PowerShell

管理者として実行した結果がこちらになります。

Get-WmiObject win32_nteventlogfile | Format-Table LogfileName

LogfileName
———–
Application
HardwareEvents
Internet Explorer
Key Management Service
Media Center
ODiag
OSession
Security
System
Windows PowerShell

[Security] が取得できているのが確認できますね。

?

この辺の情報はお客様先で障害があったときに使用する事がありますのでバッチで簡単に EVT 形式のファイルに保存できると
問い合わせがあったときに情報を取得してもらうのが楽にできてよいですね。

Written by Masayuki.Ozawa

8月 12th, 2010 at 2:50 pm

Posted in PowerShell

PowerShell で Twitter のタイムラインを取得

leave a comment

PowerShell の勉強がてら、インターネット上で公開されている内容をつぎはぎしながら作ってみました。
エラートラップ一切なしでシーケンシャルに実行。

うん、Developer から ITPro になって良かったと思います(笑)

$RequestUrl = "http://api.twitter.com/1/statuses/home_timeline.xml?count=10"

$Request = [System.Net.WebRequest]::Create($RequestUrl)
$Request.Credentials = Get-Credential
# $Username = ""
# $Password = ""
# $Request.Credentials = new-object System.Net.NetworkCredential($Username,$Password)

$response = $Request.GetResponse()
$reader = new-object System.IO.StreamReader($response.GetResponseStream())

$returnvalue = $reader.ReadToEnd()
$reader.Close()
$Ary = @()

foreach ($child in $returnvalue.statuses.ChildNodes | Sort-Object created_at)
{
??? $DateAry = $child.created_at.ToString().Split(" ")???
??? $Date = $DateAry[3] -as [DateTime]
??? $Ary += (($Date.AddHours(9)).ToString("yyyy/MM/dd HH:mm:ss") + "? " + `
??? "[@" +$child.User.screen_name + "] " + $child.text).ToString()??
}

$Ary | Out-GridView

PowerShell をもっと基礎から勉強しないと駄目だな~。

Written by Masayuki.Ozawa

8月 12th, 2010 at 1:58 pm

Posted in PowerShell