幸い今回のログオン失敗の検知では、全イベント・カテゴリを通じて目的を一意的に識別できるイベントID(529)が見つかった。しかし一般には、イベントIDを指定するだけでは目的とするイベントの発生を絞り込んで検知することは難しい。このような場合には、イベントのカテゴリ(システム、アプリケーション、セキュリティ)やソース(Service
Control Manager、MSSQLServer、eventlogなど)、イベントIDで絞り込む必要がある。あるいはイベントの発生パターンとメッセージ内容が決まっているなら、メッセージ内容の一部も絞り込みの条件として指定するとよいだろう。
例えば、クラッシュダンプやCHKDSKの後に記録されるイベントを検知するのに EventIdentifier(例えば1000や1001)だけで検索を行うと、Windows
XP や Windows Server 2003では、OSのクラッシュだけではなく、アプリケーションのハングアップや、サーバ・ベンダなどが独自に提供しているサーバ管理ツールによるメッセージまで拾ってしまい、極めて精度が粗くなってしまう。このような場合には、EventType(情報、警告、エラー、成功の監査、失敗の監査)やSourceName(ソース名)を併せて指定するとよいだろう。
■警告の発信
イベントが発生したら、イベントから得られた情報をメールで送信する。今回はWindows 2000以降で汎用的に使用可能なCollaboration Data
Object(CDO)for Windows 2000を用いた。CDOはスクリプトから利用可能な送信専用のメール・クライアントである。利用に当たっては、送信用として利用可能なSMTPサーバを適切に設定しておく必要がある。詳細については関連記事「Windows標準機能とWSHを使ってメールを送信する」を参照されたい。
Dim WshShell, env, events, NTEvent, objConfig, Fields, objMessage, subj
' WMIを通じて抽出するイベントの条件指定
'Set WshShell = WScript.CreateObject("WScript.Shell")
'set env = WshShell.Environment("SYSTEM")
Set events = GetObject("winmgmts:{impersonationLevel=impersonate,(security)}")
_
.ExecNotificationQuery("SELECT * FROM " & _
"__instancecreationevent WHERE "
& _
"targetinstance isa 'Win32_NTLogEvent' " & _
"and targetInstance.EventIdentifier=
'529' " )
' 指定されたイベントの発生に伴い実行するアクションの指定
if err <> 0 then
WScript.Echo Err.Description, Err.Number, Err.Source
end if
Do
'CDOメッセージの作成
Set NTEvent = events.NextEvent
subj ="[Notice] ログオンの失敗発生: " & NTEvent.TargetInstance.ComputerName
Set objConfig = CreateObject("CDO.Configuration")
Set Fields = objConfig.Fields
With Fields
.Item(cdoSendUsingMethod) = cdoSendUsingPort
.Item(cdoSMTPServer)
= booster
.Item(cdoSMTPServerPort) = 25
.Item(cdoSMTPConnectionTimeout) = 10
.Item(cdoSMTPAuthenticate) = cdoBasic
.Item(cdoSendUserName) =
"username"
.Item(cdoSendPassword) =
"password"
.Update
End With
Set objMessage = CreateObject("CDO.Message")
Set objMessage.Configuration = objConfig