You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非管理员权限下Get-WinEvent按ProviderName过滤遇权限异常问题

问题原因解析

这是因为Get-WinEvent使用ProviderName筛选时,需要先从系统注册表的HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Publishers分支读取该Provider对应的GUID——而这个注册表路径默认非管理员没有读取权限。

当你不带ProviderName查询时,只需要直接读取evtx文件本身的事件数据,不需要访问注册表,所以非管理员权限就能正常执行。但加上ProviderName后,命令第一步就要去注册表查映射关系,这就触发了UnauthorizedAccessException。

满足需求的解决方案

既然你的目标是筛选登录/注销事件、区分本地/远程并导出CSV,完全可以绕开ProviderName的限制,直接通过事件ID筛选+解析事件属性来实现,而且更高效。

这里给你一个完整的脚本示例,处理指定文件夹下的所有evtx文件:

# 配置参数:日志文件夹路径和导出CSV路径
$logFolder = "U:\test"
$outputCsvPath = "U:\test\登录注销事件汇总.csv"

# 获取文件夹下所有evtx文件
$evtxFiles = Get-ChildItem -Path $logFolder -Filter "*.evtx" -File

# 初始化存储结果的数组
$eventResults = @()

foreach ($file in $evtxFiles) {
    Write-Host "正在处理文件:$($file.FullName)"
    # 先通过事件ID筛选登录(4624)和注销(4634)事件,避开ProviderName的权限问题
    try {
        $events = Get-WinEvent -FilterHashtable @{
            Path = $file.FullName
            ID = 4624, 4634
        } -ErrorAction Stop
    }
    catch {
        Write-Warning "处理文件$($file.Name)失败:$($_.Exception.Message)"
        continue
    }

    foreach ($event in $events) {
        # 解析事件的关键属性,区分本地/远程登录
        $logonType = $event.Properties[8].Value
        $logonTypeDesc = switch ($logonType) {
            2 { "本地交互式登录(比如本地登录桌面)" }
            10 { "远程交互式登录(比如RDP、远程桌面)" }
            3 { "网络登录(比如访问共享文件夹)" }
            default { "其他登录类型(类型值:$logonType)" }
        }

        # 构建结果对象
        $resultItem = [PSCustomObject]@{
            日志文件名 = $file.Name
            事件时间 = $event.TimeCreated
            事件ID = $event.Id
            事件类型 = if ($event.Id -eq 4624) { "登录" } else { "注销" }
            用户名 = $event.Properties[5].Value
            域名 = $event.Properties[6].Value
            登录类型 = $logonTypeDesc
            源IP地址 = if ($event.Id -eq 4624) { $event.Properties[18].Value } else { "N/A" }
        }

        $eventResults += $resultItem
    }
}

# 导出结果到CSV(UTF8编码支持中文)
$eventResults | Export-Csv -Path $outputCsvPath -Encoding UTF8 -NoTypeInformation
Write-Host "处理完成!结果已导出到:$outputCsvPath"

补充说明

如果你一定要用ProviderName筛选(其实没必要,因为我们已经通过事件ID精准定位了安全审计事件),可以提前查询该Provider的GUID,用GUID代替ProviderName参数——这样Get-WinEvent就不需要访问注册表了。

比如Microsoft-Windows-Security-Auditing的GUID是{54849625-5478-4994-A5BA-3E3B0328C30D},对应的命令如下:

Get-WinEvent -FilterHashtable @{
    Path="U:\test\SavedSecurity.evtx"
    ProviderName="{54849625-5478-4994-A5BA-3E3B0328C30D}"
    ID="4624"
}

不过还是推荐用前面的脚本方案,更直观也更适配你的需求。

内容的提问来源于stack exchange,提问作者Peter Core

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:56:08