如何获取与 0x1 或 0x4 匹配的 Powershell > Get-WinEvent > Security > Message > Access Mask

Posted

技术标签:

【中文标题】如何获取与 0x1 或 0x4 匹配的 Powershell > Get-WinEvent > Security > Message > Access Mask【英文标题】:How to get Powershell > Get-WinEvent > Security > Message > Access Mask that match 0x1 or 0x4 【发布时间】:2019-01-28 16:22:29 【问题描述】:

如何获取消息为 0x1|0x4|等的安全 ID 4663。

我尝试了不同的代码,我只想将大约 5 个代码记录到 CSV,我可以导出到 CSV,我只能提取 4663 ID,但我无法过滤消息访问掩码,它是文本消息字段,任何人都有任何想法,这是我到目前为止构建的代码:-

$Results = foreach($server in "server-name")

    Get-WinEvent -ComputerName $Server -logname security -MaxEvents 10 -ErrorAction SilentlyContinue | where $_.id -eq "4663" | select Timecreated, ID, Message | Get-EventLog "Security" -before 4/10/2013 -InstanceId 4663 | % 
    New-Object psobject -Property @
        Index = $_.Index
        TimeGenerated = $_.TimeGenerated
        "Account Name" = $_.ReplacementStrings[1]
        "Object Type" = $_.ReplacementStrings[5]
        "Object Name" = $_.ReplacementStrings[6]
    
 | Write-Host

这会获取记录

#$Results = foreach($server in "file-server")
#
#    Get-WinEvent -ComputerName $Server -logname security -MaxEvents 10 -ErrorAction SilentlyContinue | where $_.id -eq "4663" | select #Timecreated, ID, Message | Write-Host

结果应该是

帐户名称:对象名称:WHERE 记录是访问掩码之一:“0x0”、“0x1”、“0x2”、“0x4”、“0x20”、“0x40”、“0x10000”

【问题讨论】:

我不是 100% 确定您要达到的目标。就像您在尝试解析消息一样? 【参考方案1】:

让我们更深入地了解窗口事件消息。

每条消息都有一个模板。您可以查看模板,如

(Get-WinEvent -ListProvider * -ErrorAction Ignore).Events |
    select Id, Version, Template |
    Format-List

我们可以向下挖掘找到我们正在寻找的事件也喜欢

(Get-WinEvent -ListProvider * -ErrorAction Ignore).Events |
        Where-Object $_.Id -eq 4663 |
        select Id, Version, Template |
        Format-List

我们可以看到在 windows 中使用了 2 个版本的模板。我们还可以看到专有名称是什么。

Template : <template xmlns="http://schemas.microsoft.com/win/2004/08/events">
             <data name="SubjectUserSid" inType="win:SID" outType="xs:string"/>
             <data name="SubjectUserName" inType="win:UnicodeString" outType="xs:string"/>
             <data name="SubjectDomainName" inType="win:UnicodeString" outType="xs:string"/>
             <data name="SubjectLogonId" inType="win:HexInt64" outType="win:HexInt64"/>
             <data name="ObjectServer" inType="win:UnicodeString" outType="xs:string"/>
             <data name="ObjectType" inType="win:UnicodeString" outType="xs:string"/>
             <data name="ObjectName" inType="win:UnicodeString" outType="xs:string"/>
             <data name="HandleId" inType="win:Pointer" outType="win:HexInt64"/>
             <data name="AccessList" inType="win:UnicodeString" outType="xs:string"/>
             <data name="AccessMask" inType="win:HexInt32" outType="win:HexInt32"/>
             <data name="ProcessId" inType="win:Pointer" outType="win:HexInt64"/>
             <data name="ProcessName" inType="win:UnicodeString" outType="xs:string"/>
             <data name="ResourceAttributes" inType="win:UnicodeString" outType="xs:string"/>
           </template>

在帖子中我们想要获取访问掩码。我们可以在模板中看到

<data name="AccessMask" inType="win:HexInt32" outType="win:HexInt32"/>

所以我们将获取所有符合我们想要的 ID 4663 的事件并将输出限制为 10

Get-WinEvent -logname security -FilterXPath "*[System[EventID=4663]]" -MaxEvents 10

我们会将输出转换为 XML 并解析到我们得到这些设置,然后创建一个 PSObject 来存储所有这些设置。然后我们将每个 PSObject 添加到一个 ArrayList 中。

$ArrayList = New-Object System.Collections.ArrayList
Get-WinEvent -logname security -FilterXPath "*[System[EventID=4663]]" -MaxEvents 10 | %
    $XML = [xml]$_.toXml()
    $PsObject =  New-Object psobject
    $XML.Event.EventData.Data | %
        $PsObject | Add-Member -MemberType NoteProperty -Name $_.Name -Value $_."#text"
    
    $ArrayList.add($PsObject) | out-null


$ArrayList | Select AccessMask

我们在arraylist上只选择AccessMask,我们很好。

在结束注释中,我为此编写了一个函数。

function Parse-WindowsEvents()
    param(
        [Parameter(Position=1, ValueFromPipeline)]
        [object[]]$Events
    )
    process
        $ArrayList = New-Object System.Collections.ArrayList
        $Events  | %
            $EventObj = $_
            $EventObjFullName = $_.GetType().FullName
            if($EventObjFullName -like "System.Diagnostics.EventLogEntry")   
                $EventObj = Get-WinEvent -LogName security -FilterXPath "*[System[EventRecordID=$($_.get_Index())]]"
            elseif($EventObjFullName -like "System.Diagnostics.Eventing.Reader.EventLogRecord")

            else
                throw "Not An Event System.Diagnostics.Eventing.Reader.EventLogRecord or System.Diagnostics.EventLogEntry"
            
            $PsObject =  New-Object psobject
            $EventObj.psobject.properties | %
                $PsObject | Add-Member -MemberType NoteProperty -Name $_.Name -Value $_.Value
            
            $XML = [xml]$EventObj.toXml()
            $PsObject2 = New-Object psobject
            $XML.Event.EventData.Data | %
                $PsObject2 | Add-Member -MemberType NoteProperty -Name $_.Name -Value $_."#text"
            
            $PsObject | Add-Member -MemberType NoteProperty -Name ParsedMessage -Value $PsObject2
            $ArrayList.add($PsObject) | out-null
        
        return $ArrayList
    

示例用法

Get-EventLog -LogName Security | select -first 3 | Parse-WindowsEvents | select id, recordid -ExpandProperty parsedmessage | fl

get-winevent -logName security | parse-winevents

该函数将向名为 ParsedMessage 的对象添加一个新属性

【讨论】:

这太棒了 ArcSet,多么棒的解释,这将进入我的 Evernote 笔记中。这是一种享受。祝你有美好的一天。 @DavidArmstrong 我在底部添加了一个可重用的函数 感谢 ArcSet,它看起来不错,但我无法解决错误,这就是我在调用函数的行中放入的内容:get-winevent -ComputerName $ComputerName -logname security | -FilterXPath "*[System[EventID=4663]] " -MaxEvents 5 显然我错了。这就是我所拥有的: Get-WinEvent -ComputerName $ComputerName -logname security -FilterXPath "*[System[EventID=4663]] " -MaxEvents 5 |其中 ($_.Message -match '\b0x0\b' - 或 $_Message -Match '\b0x1\b' - 或 $_.Message -match '\b0x4\b' - 或 $_.Message -match ' \b0x20\b' - 或 $_.Message -match '\b0x40\b' - 或 $_.Message -match '\b0x10000\b') @DavidArmstrong Get-WinEvent -ComputerName $ComputerName -logname security -FilterXPath "*[System[EventID=4663]] " -MaxEvents 5 | Parse-WindowsEvents | ? @("0x10000","0x40","0x20","0x4","0x1","0x0") -contains $_.ParsedMessage.AccessMask 使用我帖子中的函数,将函数粘贴到此行上方 ArcSet 延迟道歉,这很好用,只是花了我一点时间来过滤掉我需要的字段,非常感谢。这太棒了。我的过滤: $AccessMask = $PsObject | Select-String -Pattern "Access Mask.*?;" -AllMatches | foreach $_.matches.value $AccessMask = $AccessMask -replace "(\t)2|;","" $AccountName = $PsObject | Select-String -Pattern "Account Name.*?\n" -AllMatches | foreach $_.matches.value $AccountName = $AccountName -replace "(\t)2","" 我在 4 个我需要的文件上使用了这个过滤器,这样我就可以看到谁最后访问了一个文件。惊人的 ArcSet【参考方案2】:
Get-winEvent -Logname Security | where ($_.Id -eq '4663') -and ($_.Message -match '0x0' -or $_Message -Match '0x1' -or $_.Message -match '0x4' -or $_.Message -match '0x20' -or $_.Message -match '0x40' -or $_.Message -match '0x10000')

这是你要找的吗?

【讨论】:

感谢 Leon 抽出宝贵时间分享您的专业知识,这太好了,最后我使用了 ArcSet 的代码,因为它更容易添加我需要的其他信息。祝你有美好的一天。 只是想给 Leon 投票,因为我使用了您的过滤以及 ArcSet 的代码来检索和过滤数据。

以上是关于如何获取与 0x1 或 0x4 匹配的 Powershell > Get-WinEvent > Security > Message > Access Mask的主要内容,如果未能解决你的问题,请参考以下文章

Power Query 中的索引匹配或 Vlookup

如何在Power Query中获取数据——表格篇(3)

正则表达式将文件夹名称与Productivity Power Tools颜色编码匹配

如何从 Node-RED/ Octoblu 获取数据到 Power BI

不同狀況下的 bq25896 register

power pivot 数据导出到excel吗