首页 > 解决方案 > 从 PowerShell 中的消息中提取

问题描述

也许我正在以错误的方式解决这个问题,但这就是我所拥有和得到的:

Get-WinEvent -FilterHashtable @{logname='security'; id=4663;} | ?{$_.message -match "DELETE" -And $_.message -match "C:\\Shares\\Share" -And $_.message -NotMatch ".tmp|~\\$"} | Select -expand Message

我得到这个输出:

Subject:
        Security ID:            S-1-5-21-
        Account Name:           name
        Account Domain:         domain
        Logon ID:               0x9CD04EC

Object:
        Object Server:          Security
        Object Type:            File
        Object Name:            C:\Shares\
        Handle ID:              0x5504
        Resource Attributes:    S:AI

Process Information:
        Process ID:             0x4
        Process Name:

Access Request Information:
        Accesses:               DELETE

        Access Mask:            0x10000
An attempt was made to access an object.

有没有办法只提取登录 ID 和对象名称?

标签: powershell

解决方案


假设您将单个条目的值设置为变量$message。该值将是包含多行的单个字符串。

您需要搜索字符串的内容,有多种方法可以做到这一点。这里有两种方法:

管道到findstr

& "echo" $message | findstr /im /C:"Logon ID"
& "echo" $message | findstr /im /C:"Object Name"

拆分NewLine,管道到foreach并使用正则表达式:

$message -split [Environment]::NewLine | foreach{if ($_ -match "Logon ID|Object Name") {$_}}

请注意,这将为您提供如下所示的输出:

Logon ID:       0x9CD04EC
Object Name:        C:\Shares\

您仍然需要做一些工作来将这些值与这些行分开。就像是:

$logonID = & "echo" $message | findstr /im /C:"Logon ID"
($logonID -split "      ")[1]

推荐阅读