潜在的解决方法

潜在的解决方法

我们的 IT 部门要求在 MSBuild 驱动的构建期间从 Defender 收集 ETW 数据。我们遇到了间歇性的构建失败,这显然是由于 Defender(好吧,它的用户模式服务)占用了具有独占访问权限的文件。这个问题很难捉摸,是一个典型的海森堡漏洞。尽管我在记录 ETW 数据时尝试重现这个问题,但尝试了二十多次后还是没能成功重现。

说明指出使用 ,New-MpPerformanceRecording -RecordTo <recording.etl>然后是Get-MpPerformanceReport -Path <recording.etl> ...。可以在 Microsoft 中找到相应的文档这里

现在我对这个过程的主要抱怨是New-MpPerformanceRecording需要:

  1. 按下ENTER可停止并保存录音,或按下Ctrl+C可取消录音。

这意味着我无法在构建的同时编写性能录制脚本,并且始终需要参与其中。这浪费了很多时间,我实际上不必一直回到窗口查看是否已经按下ENTER

问题:我如何才能端到端地自动化这个过程?我熟悉 PowerShell 脚本,但如何绕过这个愚蠢的提示我无法让它保存数据。任何取消捕获的操作都意味着我会丢失数据。

PS:问题不在于速度(“性能”)本身,而在于表现根本,因为 Defender 一直让我们的构建失败。但我明白他们为什么想要 ETW 或跟踪日志记录详细信息。

答案1

首先我将结合并引用描述:New-MpPerformanceRecording帖子至少可以提供有关供应商支持及其影响的宝贵见解。

New-MpPerformanceRecordingcmdlet 提供有关可能导致 Microsoft Defender 防病毒软件性能下降的问题文件的见解。此工具按“原样”提供,并非旨在提供排除建议。排除可能会降低端点的保护级别。如果有排除,应谨慎定义。

有关性能分析器的更多信息,请参阅性能分析器文档。

此外,我已经根据概述确定了一个潜在的解决方法示例 2我将首先引用并参考微软帖子部分的关键点以便清楚说明。

示例 2: 收集远程 PowerShell 会话的性能记录

$s = New-PSSession -ComputerName Server02 -Credential Domain01\User01 
New-MpPerformanceRecording -RecordTo C:\LocalPathOnServer02\trace.etl -Session $s 

上述命令收集Server02(参数 Session 的参数所指定$s) 上的性能记录并将其保存到指定路径:C:\LocalPathOnServer02\trace.etlon Server02

参数:New-MpPerformanceRecording

-RecordTo

指定保存 Microsoft Defender 反恶意软件性能记录的位置。

-Session

指定在其中创建和保存 Microsoft Defender 防病毒性能记录的 PSSession 对象。使用此参数时,该RecordTo参数指的是远程计算机上的本地路径. 适用于 Defender 平台版本 4.18.2201.10

潜在的解决方法

创建远程交互会话并将New-PSSession其存储在变量中(例如$s)。然后,使用变量-Session的参数New-MpPerformanceRecording

一旦有足够的时间来收集必要的事件,使用Remove-PSSession以及相应的变量(例如Remove-PSSession $s)来结束远程会话并停止会话捕获操作。

PowerShell 示例 1

$s = New-PSSession -ComputerName Server02 -Credential Domain01\User01
New-MpPerformanceRecording -RecordTo C:\LocalPathOnServer02\trace.etl -Session $s

## After enough time has passed, run this command or schedule it
Remove-PSSession $s

PowerShell 示例 2

$s = New-PSSession -ComputerName Server02 -Credential Domain01\User01

Invoke-Command -Session $s -ScriptBlock {
    New-MpPerformanceRecording -RecordTo C:\LocalPathOnServer02\trace.etl
}

## After enough time has passed, run this command or schedule it
Remove-PSSession $s

答案2

您可以尝试这样的事情:

# Define the path for recording.etl
$etlPath = "C:\Path\To\Your\Recording.etl"

# Start the performance recording
New-MpPerformanceRecording -RecordTo $etlPath

# Sleep to allow time for the recording to capture data (adjust as needed)
Start-Sleep -Seconds 60

# Stop the performance recording
Stop-MpPerformanceRecording

答案3

避免使用 powershell 并使用本机命令:

&"C:\Windows\system32\wpr.exe" -start C:\Windows\system32\WindowsPowerShell\v1.0\Modules\ConfigDefenderPerformance\MSFT_MpPerformanceRecording.wprp!Scans.Light -filemode -instancename MSFT_MpPerformanceRecording

&"C:\Windows\system32\wpr.exe" -stop C:\temp\Defender.etl -instancename MSFT_MpPerformanceRecording

相关内容