如何为现有BSOD监控PowerShell函数添加计算机名参数实现远程使用?
远程可调用BSOD监控PowerShell函数改造
核心改造规则
- 参数添加位置:PowerShell 函数的参数必须定义在函数名后的
param()代码块中,是函数体的第一部分代码 - 远程运行逻辑调整:所有涉及文件下载、程序执行、结果读取的操作,必须转移到目标远程计算机上执行,避免本地调用无法读取远程系统事件/转储文件的问题
- 兼容本地调用:参数默认值设为当前本地计算机名,不传
ComputerName时完全兼容原有本地监控逻辑
改造后完整函数代码
Function Get-BSODInfo{ # 新增参数块,固定放在函数体最开头 param( [Parameter(Mandatory=$false, ValueFromPipeline=$true)] [string[]]$ComputerName = $env:COMPUTERNAME ) # 封装统一执行逻辑,支持本地/远程复用 $execScriptBlock = { try { # 修正原代码的临时文件名拼写错误 Invoke-WebRequest -Uri "https://www.nirsoft.net/utils/bluescreenview.zip" -OutFile "$($ENV:Temp)\bluescreenview.zip" Expand-Archive "$($ENV:Temp)\bluescreenview.zip" -DestinationPath "$($ENV:Temp)" -Force Start-Process -FilePath "$($ENV:Temp)\Bluescreenview.exe" -ArgumentList "/scomma `"$($ENV:Temp)\Export.csv`"" -Wait } catch { return [PSCustomObject]@{ Status = "Error" Message = "BSODView Command has Failed: $($_.Exception.Message)" } } # 读取导出的CSV并标准化时间格式 $BSODs = Get-Content "$($ENV:Temp)\Export.csv" | ConvertFrom-Csv -Delimiter ',' -Header Dumpfile, Timestamp, Reason, Errorcode, Parameter1, Parameter2, Parameter3, Parameter4, CausedByDriver | ForEach-Object { $_.Timestamp = [datetime]::Parse($_.timestamp, [System.Globalization.CultureInfo]::CurrentCulture) $_ } Remove-Item "$($ENV:Temp)\Export.csv" -Force -ErrorAction SilentlyContinue # 筛选最近24小时的BSOD事件 $BSODFilter = $BSODs | Where-Object { $_.Timestamp -gt ((Get-Date).AddHours(-24)) } if (!$BSODFilter) { return [PSCustomObject]@{ ComputerName = $env:COMPUTERNAME Status = "Healthy" Message = "No BSODs found in the last 24 hours" BSODRecords = $null } } else { return [PSCustomObject]@{ ComputerName = $env:COMPUTERNAME Status = "Unhealthy" Message = "BSOD found in last 24 hours" BSODRecords = $BSODFilter } } } # 批量遍历目标计算机执行检测 foreach ($targetPC in $ComputerName) { $execResult = if ($targetPC -eq $env:COMPUTERNAME) { # 本地检测无需远程会话 & $execScriptBlock } else { # 远程节点通过WinRM会话执行脚本块 Invoke-Command -ComputerName $targetPC -ScriptBlock $execScriptBlock -ErrorAction Stop } # 统一格式化输出检测结果 switch ($execResult.Status) { "Healthy" { Write-Host "$($execResult.ComputerName) - Healthy - $($execResult.Message)" } "Unhealthy" { Write-Host "$($execResult.ComputerName) - Unhealthy - $($execResult.Message)" $execResult.BSODRecords } "Error" { Write-Host "$($execResult.ComputerName) - Error - $($execResult.Message)" } } } }
使用注意事项
- 调用远程计算机时,需确保目标主机已开启WinRM服务,且当前运行账户对目标主机拥有本地管理员权限
- 改造后的函数支持批量巡检,例如执行
Get-BSODInfo -ComputerName "PC01","PC02","PC03"即可一次性完成多节点BSOD状态核查 - 移除了原代码中会中断远程会话的
exit 1语句,改为结构化返回检测结果,避免远程调用异常断开
内容的提问来源于stack exchange,提问作者Dre
相关产品推荐
相关产品推荐

