2017-05-14 7 views
0

私は、DNS要求履歴をログに記録します。 だから私は、以下のPowerShellスクリプトを作りました。は、どのように私はPowerShellとタスクスケジューラによって、すべてのDNS要求をログに記録することができますか?

$PROC_ID = Get-WinEvent microsoft-windows-dns-client/operational -MaxEvents 1 -FilterXPath "*[System/EventID=3006]" | Select-Object -ExpandProperty processid 
$TIMESTAMP = Get-WinEvent microsoft-windows-dns-client/operational -MaxEvents 1 -FilterXPath "*[System/EventID=3006]" | Select-Object -ExpandProperty timecreated  
$LOG_MSG = Get-WinEvent microsoft-windows-dns-client/operational -MaxEvents 1 -FilterXPath "*[System/EventID=3006]" | Select-Object -ExpandProperty message 

$PROC_NAME = Get-Process -id $PROC_ID | Select-Object -ExpandProperty processname 
$TIMESTAMP_SPLIT = $TIMESTAMP -split " "  
$LOG_DATE = $TIMESTAMP_SPLIT[0]   
$LOG_TIME = $TIMESTAMP_SPLIT[1]  
$LOG_URL = $LOG_MSG -replace '^\S{2}\s([^,]+).+','$1' 

$LOG = "$LOG_DATE`t$LOG_TIME`t$PROC_ID`t$PROC_NAME`t$LOG_URL" 
$LOG >> C:\dns.csv 

私は3006イベントが発生したときにスクリプトを実行するタスクスケジュールを作成しました。

C:\>schtasks /query /tn dns_history /fo list /v 

Folder:         \ 
HostName:        LG 
TaskName:        \dns_history 
Next Run Time:       N/A 
Status:         Ready 
Logon Mode:        Interactive/Background 
Last Run Time:       2017-05-14 오후 4:39:07 
Last Result:       0 
Author:         lg\Administrator 
Task To Run:      C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -file C:\Test\Powershell\dns.ps1 
Start In:        N/A 
Comment:        N/A 
Scheduled Task State:     Enabled 
Idle Time:        Disabled 
Power Management:      Stop On Battery Mode, No Start On Batteries 
Run As User:       LG\administrator 
Delete Task If Not Rescheduled:   Disabled 
Stop Task If Runs X Hours and X Mins: 72:00:00 
Schedule:        Scheduling data is not available in this format. 
Schedule Type:       When an event occurs 
Start Time:        N/A 
Start Date:        N/A 
End Date:        N/A 
Days:         N/A 
Months:         N/A 
Repeat: Every:       N/A 
Repeat: Until: Time:     N/A 
Repeat: Until: Duration:    N/A 
Repeat: Stop If Still Running:   N/A 

これは結果です。

enter image description here

しかし、すべてのDNS要求がログに記録されていません。

enter image description here

のみ同時に発生したDNSリクエストの中で私のスクリプトログの最後のDNS要求。それはタスクスケジューラの限界ですか?どのように私はすべてのDNS要求を記録できますか?

enter image description here

そしてrestless1987のコードを実行すると、それは以下のエラーが発生しています。

Register-WMIEvent : Wrong Class. 
Location D:\test.ps1:9 Character:1 
+ Register-WMIEvent -query "Select * From __InstanceCreationEvent within 3 $filter ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [Register-WmiEvent], ManagementException 
    + FullyQualifiedErrorId : System.Management.ManagementException,Microsoft.PowerShell.Commands.RegisterWmiEventCommand 

答えて

0

特定の状況では、タスクスケジューラは非常に信頼性が低い場合があります。

これはあなたのケースであることを起こる場合は、多分あなたはそこに作成されたすべてのインスタンスをログに記録する、PowerShellのWMIイベントウォッチャーの登録と一緒に行くことができます。

はまだ何かがあり、それが開始する場所でなければなりません。フィルタを適用して、正しいログファイルからイベントを取得する必要があります。

$class = 'Win32_NtEventLog' 
$EventCode = 3006 
$filter = "Where TargetInstance ISA '$class' and eventcode = '$EventCode'" 

$codeblock = { 
    $eventargs.newevent.targetinstance #<- should have all info you need 
} 

Register-WMIEvent -query "Select * From __InstanceCreationEvent within 3 $filter" ` 
-messageData "DNS event " -sourceIdentifier "New DNS query" -Action $codeblock 

While ($true){ 
    Start-Sleep 5 
} 
+0

ありがとうございました。しかし、私はパワーシェルには新しいです。あなたの答えは私にとっては難しいです。私はもっ​​と勉強する必要があります:) –

+0

私はエラーメッセージを追加しました。 –

関連する問題