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

PowerShell批量检查AD域内Sophos安装状态异常排查

批量检测AD域内机器Sophos安装状态的脚本修正

问题描述

本地执行以下脚本时,能正确判断本机是否安装Sophos杀毒软件:

if ( [bool](Get-Process 'Sophos UI' -EA SilentlyContinue) ) {
        $resultado="Instalado"
    } else {
        $resultado="Nao instalado"
      }
return $resultado

但改为批量检测AD域内启用的计算机时,所有机器均显示为Instalado,即使未安装的机器也是如此。原批量脚本如下:

function verificaSophos {
    if ( [bool](Get-Process 'Sophos UI' -EA SilentlyContinue) ) {
        $resultado="Instalado"
    } else {
        $resultado="Nao instalado"
      }
  return $resultado
}

$Comps= Get-ADComputer -Filter {(Enabled -eq $True)} -properties *
$CompList = foreach ($Comp in $Comps) {
        [PSCustomObject] @{                    
        Name = $Comp.Name
        VerificaInstalacaoSophos = verificaSophos $Comp
        DataColeta = Get-Date -Format "dd/MM/yyyy HH:mm:ss"
    }
    }

$CompList | Export-CSV c:\temp\sophos.csv -NoTypeInformation -Encoding UTF8

错误原因

verificaSophos函数未使用传入的目标计算机参数,每次执行都是在本地机器上检测Sophos进程,而非远程目标机器。因此无论目标机器实际状态如何,返回的都是本地机器的检测结果,导致所有条目状态一致。

修正方案

以下提供两种可靠的远程检测方案,根据环境选择使用:

方案1:通过Invoke-Command远程检测进程

需确保目标机器开启WinRM服务,执行账户拥有远程机器管理员权限:

function verificaSophos {
    param(
        [Parameter(Mandatory=$true)]
        [string]$ComputerName
    )

    try {
        # 远程执行进程检测逻辑
        $processExists = Invoke-Command -ComputerName $ComputerName -ScriptBlock {
            [bool](Get-Process 'Sophos UI' -EA SilentlyContinue)
        } -ErrorAction Stop
        
        return $processExists ? "Instalado" : "Nao instalado"
    }
    catch {
        # 处理无法连接的异常
        return "无法连接机器"
    }
}

# 获取域内启用的计算机(仅获取Name属性,提升执行效率)
$Comps = Get-ADComputer -Filter {Enabled -eq $True} -Properties Name
$CompList = foreach ($Comp in $Comps) {
    [PSCustomObject] @{                    
        Name = $Comp.Name
        VerificaInstalacaoSophos = verificaSophos -ComputerName $Comp.Name
        DataColeta = Get-Date -Format "dd/MM/yyyy HH:mm:ss"
    }
}

$CompList | Export-CSV c:\temp\sophos.csv -NoTypeInformation -Encoding UTF8

方案2:通过WMI查询远程服务(无需WinRM)

若目标机器未开启WinRM,可通过WMI查询Sophos相关服务(杀毒软件通常会有常驻服务,检测更稳定):

function verificaSophos {
    param(
        [Parameter(Mandatory=$true)]
        [string]$ComputerName
    )

    try {
        # 查询远程机器上的Sophos相关服务
        $sophosService = Get-WmiObject -Class Win32_Service -ComputerName $ComputerName -Filter "Name LIKE '%Sophos%'" -ErrorAction Stop
        
        return $sophosService ? "Instalado" : "Nao instalado"
    }
    catch {
        return "无法连接机器"
    }
}

$Comps = Get-ADComputer -Filter {Enabled -eq $True} -Properties Name
$CompList = foreach ($Comp in $Comps) {
    [PSCustomObject] @{                    
        Name = $Comp.Name
        VerificaInstalacaoSophos = verificaSophos -ComputerName $Comp.Name
        DataColeta = Get-Date -Format "dd/MM/yyyy HH:mm:ss"
    }
}

$CompList | Export-CSV c:\temp\sophos.csv -NoTypeInformation -Encoding UTF8

注意事项

  • 执行脚本的账户需要具备域内远程机器的管理员权限
  • 方案1依赖WinRM服务,可通过Enable-PSRemoting命令在目标机器提前启用
  • 方案2依赖WMI服务,Windows系统默认开启该服务

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 08:05:58