すべてのドメインコントローラーからセキュリティログを1時間ごとに収集し、それらをリモートで保存するスクリプトを作成しようとしています。セキュリティログを収集できますが、DCからカテゴリまたはイベント番号ごとにセキュリティログを収集する方法はありますか?他にご不明な点がございましたら、お気軽にお問い合わせください。
私のコード:
$Eventlogs = Get-WmiObject -Class Win32_NTEventLogFile -ComputerName $computer
Foreach($log in $EventLogs)
{
if($Log.LogFileName -eq "Security")
{
$Now = [DateTime]::Now
$FileName = "Security" +"_"+$Now.Month+$Now.Day+$Now.Year+"_"+$Now.Hour+$Now.Minute+$Now.Second
$path = "\\{0}\c$\LogFolder\$folder\$FileName.evt" -f $Computer
$ErrBackup = ($log.BackupEventLog($path)).ReturnValue
if($clear)
{
if($ErrBackup -ne 0)
{
"Backup failed"
"Backup Error was " + $ErrBackup
}
}
}
}
Copy-EventLogsToArchive -path $path -Folder $Folder
}
Get-EventLogがタスクカテゴリを取得しないわけではありません。それを表示するためのコマンドレットのデフォルトの動作ではないだけです。しかし、データはまだそこにあります。
_Import-Module ActiveDirectory
foreach($server in Get-ADComputer -Filter *)
{
Get-EventLog -LogName Security -ComputerName $server | ? { $_.CategoryNumber -EQ 12544 }
}
_
これは、タスクカテゴリが実際には数値形式であるという事実によってさらに複雑になります。イベントビューアはCategoryMessageFilesを使用して、カテゴリ番号をカテゴリ名に変換します。
CategoryMessageFilesの場所は、レジストリの_HKLM\System\CurrentControlSet\services\eventlog\Security\Security
_にあります(各イベントログにはサブキーがあります)。
このように行われる理由は、開発者が独自のイベントログと独自のアプリケーション用の独自のタスクカテゴリを簡単に作成できるようにするためです。
ここにいくつかの開発者向けドキュメントがあります CategoryMessage文字列を取得する方法について、 しかし、私はあなたがそれらすべてを通過したくないことを知っているので、次善の策はあなたがフィルタリングしたい種類のイベントの例を見つけ、それらのカテゴリー番号を理解し、そしてSwitch($_.CategoryNumber)
それらを好きな文字列に変換します。
編集:実際にすべてをスクラッチします。今言ったことはすべて無視してください。これはあなたにはるかに役立つはずです:
_Get-WMIObject -Query "SELECT * FROM Win32_NTLogEvent WHERE LogFile='Security'" | Select EventCode, CategoryString
_
申し訳ありませんが、Windows Server 2003のコマンドラインからは実行できません(フィルタリングされたイベントログファイルを新しいイベントログファイルにバックアップします)。
イベントログ内のイベントのサブセットをXMLまたはCSVファイルにエクスポートできます。
Get-EventLog
そして、タスクカテゴリのすべてのイベントを Where-Object
。ライアンがすでに指摘しているように、タスクカテゴリはデフォルトの出力の一部ではありませんが、まだそこにあります
次の例onlyはWindows Server 2003(R2を含む)で機能し、カテゴリ「ログオン/ログオフ」および「オブジェクトアクセス」のすべてのセキュリティログイベントを返します。 「」
Get-EventLog -LogName Security | Where-Object {@("Logon/Logoff","Object Access") -contains $_.Category}
これは読み取りと保守が簡単ですが、PowerShellはフィルタリングの前にすべてのイベントログエントリをフェッチしてシリアル化するため、あまりうまく機能しません。
Ryansの例に基づいて、代わりにWQLフィルターを使用してそれを実現しましょう。
$events = Get-WMIObject -Query "SELECT * FROM Win32_NTLogEvent WHERE LogFile='Security' AND (CategoryString = 'Logon/Logoff' OR CategoryString = 'Object Access')"
フィルタリングされたイベントをファイルに保存するには、CSVファイルの行としてイベントをエクスポートします。
$events | Export-Csv C:\myEvents.csv -NoTypeInformation
または(バックアップの圧縮に問題はないが、メッセージのフォーマットを維持したい場合)Export-CliXMLコマンドレットを使用してXMLに出力します。
$events | Export-CliXML C:\myEvents.xml
その後、それらを検索する必要があるときに、コマンドラインにインポートできます。
$events = Import-CliXML C:\myEvents.xml
XML出力はシリアル化され、多くのストレージを必要としますが、セキュリティログイベントはほとんど空白文字で埋められているため、ファイルを圧縮することでディスクスペースを簡単に再利用できます。通常のZipフォルダで約98%の圧縮率が得られます。 200.000のセキュリティイベント。
7-Zip を使用すると、さらに優れた圧縮を実現できる可能性があります。