web-dev-qa-db-ja.com

Powershellを介して単一のカテゴリのセキュリティイベントログを収集する方法

すべてのドメインコントローラーからセキュリティログを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 
} 
2
Darktux

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
_
6
Ryan Ries

申し訳ありませんが、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 を使用すると、さらに優れた圧縮を実現できる可能性があります。

0