| 2005年01月 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
特定の種類のイベントログが発生したらメールで通知します。
このスクリプトは登録するだけなので、登録が完了したらスクリプトをマシンに置いておく必要はありません。
WMITools に含まれる CIM Studio だけで(もっと言えば wmitest.exe だけで)登録することも可能なはずですが、実際には確認してません。
動作確認:SBS2000(Windows 2000 Server SP4), SBS2003 RC(Windows Server 2003)
Windows 2000 の場合は SMTPイベントコンシューマを登録しておく必要があります。
C:\>mofcomp -N:root\cimv2 %SYSTEMROOT%\system32\wbem\smtpcons.mof
SendMailOnEventUsingSMTPEventConsumer.vbs
Option Explicit' 設定対象のコンピュータ名
Const TargetComputerName = "."' イベントフィルタのインスタンス名
Const EventFilterName = "UsingSMTPTestFilter"
' イベントコンシューマのインスタンス名
Const EventConsumerName = "UsingSMTPTestConsumer"Const PolingInterval = "60" ' ポーリング間隔(秒)
' 通知するイベントの各プロパティ
' 限定しないものは空文字列とする
Const Logfile = "Security" ' ログファイル Application, Security, System
Const EventType = "4" ' イベントの種類 1:エラー 2:警告 3:情報 4:監査成功 5:監査失敗
Const SourceName = "Security" ' ソース
Const EventCode = "540" ' イベントID(正しくは EventIdentifier の下位16bit)' 通知メールの各プロパティ
Const SMTPServer = "SMTPサーバ"
Const FromLine = "差出人アドレス"
Const ToLine = "宛先アドレス"Dim Locator
Dim Services
Dim OperatingSystemCollection
Dim OperatingSystem
Dim VersionString
Dim Version
Dim XPOrLater
Dim FilterClass
Dim Filter
Dim WQL
Dim Consumer
Dim BindingClass
Dim Binding' WMIに接続
Set Locator = CreateObject("WbemScripting.SWbemLocator")
Set Services = Locator.ConnectServer(TargetComputerName, "root\cimv2")
' OS バージョンを取得する
Set OperatingSystemCollection = Services.ExecQuery("SELECT * FROM Win32_OperatingSystem")
For Each OperatingSystem In OperatingSystemCollection
' Windows XP, Windows Server 2003 以上の場合は root\subscription 名前空間に接続
VersionString = OperatingSystem.Version
Version = Left(VersionString, _
InStr(VersionString, ".") + _
InStr(Right(VersionString, Len(VersionString) - InStr(VersionString, ".")), ".") - 1)
If Version > 5.0 Then
XPOrLater = True
Set Services = Nothing
Set Services = Locator.ConnectServer(TargetComputerName, "root\subscription")
End If
Next' フィルタオブジェクトの作成
Set FilterClass = Services.Get("__EventFilter")
Set Filter = FilterClass.SpawnInstance_()' WQL 文字列の作成
WQL = "SELECT * FROM __InstanceCreationEvent WITHIN " & PolingInterval & " " & _
"WHERE TargetInstance ISA 'Win32_NTLogEvent'"If Logfile <> "" Then WQL = WQL & " AND TargetInstance.Logfile = '" & Logfile & "'"
If EventType <> "" Then WQL = WQL & " AND TargetInstance.EventType = '" & EventType & "'"
If SourceName <> "" Then WQL = WQL & " AND TargetInstance.SourceName = '" & SourceName & "'"
If EventCode <> "" Then WQL = WQL & " AND TargetInstance.EventCode = '" & EventCode & "'"' イベントログフィルタの作成
With Filter
.Name = EventFilterName
If XPOrLater Then
.EventNamespace = "root\cimv2"
End If
.QueryLanguage = "WQL"
.Query = WQL
End With
Filter.Put_()
' SMTPイベントコンシューマの作成
Set Consumer = Services.Get("SMTPEventConsumer").SpawnInstance_()
With Consumer
.Name = EventConsumerName
.SMTPServer = SMTPServer
.FromLine = FromLine
.ToLine = ToLine
.Subject = "Event fired on %TargetInstance.ComputerName%"
.Message = "Event fired on %TargetInstance.ComputerName%" & vbCrLf & _
"Logfile:%TargetInstance.Logfile%" & vbCrLf & _
"EventType:%TargetInstance.EventType%" & vbCrLf & _
"SourceName:%TargetInstance.SourceName%" & vbCrLf & _
"EventCode:%TargetInstance.EventCode%" & vbCrLf & _
""End With
Consumer.Put_()' フィルタをコンシューマにバインドする
Set BindingClass = Services.Get("__FilterToConsumerBinding")
Set Binding = BindingClass.SpawnInstance_()
With Binding
.Filter = Filter.Path_.RelPath
.Consumer = Consumer.Path_.RelPath
End With
Binding.Put_()Set Binding = Nothing
Set BindingClass = Nothing
Set Filter = Nothing
Set FilterClass = Nothing
Set Consumer = Nothing
Set Services = Nothing
SMTPイベントコンシューマでは SMTP認証ができないので、スクリプトで送れたら良いですね。
その場合は、ActiveScriptEventConsumer を使います。
その方法はそのうち書きます。
スクリプトで書くと結構複雑に見えるので、MOF ファイルで書いてみようと思い立ちました。
MOFファイルの場合は Windows 2000 と Windows Server 2003(あるいは XP) とで分けて書かなければいけないだろうけど、見た目わかりやすいかなと。
うーん、しかしなかなかうまくいかない。
Windows Server 2003 では登録もされない。Windows 2000 では登録されているのにちっとも動かない。
2000 の場合がこれです。(コメントもそのまま。ただし From,To,SMTPServer は書き換えてあります)
#pragma namespace ("\\\\.\\root\\cimv2")
instance of __EventFilter as $FILTER
{
//
Name = "UsingSMTPTestFilter";
Query = "SELECT * FROM __InstanceCreationEvent WITHIN 60 "
"WHERE TargetInstance ISA 'Win32_NTLogEvent'"
" AND TargetInstance.Logfile = 'Security'";
// " AND TargetInstance.EventType = 4"
// " AND TargetInstance.SourceName = 'Security'"
// " AND TargetInstance.EventCode = 540"
// "";
QueryLanguage = "WQL";
};
instance of SMTPEventConsumer as $CONSUMER
{
//
SMTPServer = "SMTPサーバ";
Name = "UsingSMTPTestConsumer";
FromLine = "差出人アドレス";
ToLine = "宛先アドレス";
// CcLine = "";
// ReplyToLine = "";
Subject = "Event fired on %TargetInstance.ComputerName%";
Message = "Event fired on %TargetInstance.ComputerName%\n"
"Logfile:%TargetInstance.Logfile%\n"
"EventType:%TargetInstance.EventType%\n"
"SourceName:%TargetInstance.SourceName%\n"
"EventCode:%TargetInstance.EventCode%\n"
"";
};
instance of __FilterToConsumerBinding
{
Consumer = $CONSUMER ;
Filter = $FILTER ;
};
なぜかしらん???