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
相关产品推荐
相关产品推荐

