You need to enable JavaScript to run this app. 如何为现有BSOD监控PowerShell函数添加计算机名参数实现远程使用?
优惠活动
大模型
产品
解决方案
定价
更多

如何为现有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 04:12:05