我们的 IT 部门要求在 MSBuild 驱动的构建期间从 Defender 收集 ETW 数据。我们遇到了间歇性的构建失败,这显然是由于 Defender(好吧,它的用户模式服务)占用了具有独占访问权限的文件。这个问题很难捉摸,是一个典型的海森堡漏洞。尽管我在记录 ETW 数据时尝试重现这个问题,但尝试了二十多次后还是没能成功重现。
说明指出使用 ,New-MpPerformanceRecording -RecordTo <recording.etl>
然后是Get-MpPerformanceReport -Path <recording.etl> ...
。可以在 Microsoft 中找到相应的文档这里。
现在我对这个过程的主要抱怨是New-MpPerformanceRecording
需要:
- 按下ENTER可停止并保存录音,或按下Ctrl+C可取消录音。
这意味着我无法在构建的同时编写性能录制脚本,并且始终需要参与其中。这浪费了很多时间,我实际上不必一直回到窗口查看是否已经按下ENTER。
问题:我如何才能端到端地自动化这个过程?我熟悉 PowerShell 脚本,但如何绕过这个愚蠢的提示和我无法让它保存数据。任何取消捕获的操作都意味着我会丢失数据。
PS:问题不在于速度(“性能”)本身,而在于表现根本,因为 Defender 一直让我们的构建失败。但我明白他们为什么想要 ETW 或跟踪日志记录详细信息。
答案1
首先我将结合并引用描述:New-MpPerformanceRecording帖子至少可以提供有关供应商支持及其影响的宝贵见解。
此
New-MpPerformanceRecording
cmdlet 提供有关可能导致 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.etl
onServer02
。参数:
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