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

基于VB.NET从wscui.cpl获取杀毒软件名称的可行方案问询

如何用VB.NET获取系统杀毒软件名称

嘿,我来帮你搞定这个问题!首先明确一点:直接读取wscui.cpl文件本身是行不通的——这个控制面板项只是Windows安全中心的入口,它的显示数据其实来自Windows底层的WMI(Windows Management Instrumentation)接口,而非存储在cpl文件里。所以咱们换个更靠谱的思路,直接用VB.NET调用WMI,或者修正之前的PowerShell脚本,这两种方式都能稳定获取杀毒软件信息。

一、先解决你之前的PowerShell脚本问题

很多失败的脚本都是用了旧的WMI命名空间。Windows 10及以上版本需要使用root/SecurityCenter2命名空间,而不是旧的root/SecurityCenter(那个是给Windows 7及更早版本用的)。正确的PowerShell命令应该是:

Get-CimInstance -Namespace root/SecurityCenter2 -ClassName AntiVirusProduct | Select-Object displayName

如果你的脚本之前用的是Get-WmiObject,建议换成Get-CimInstance,后者是更现代的API,兼容性更好。

二、VB.NET直接调用WMI(推荐)

比起执行PowerShell再解析输出,直接在VB.NET里调用WMI更高效也更可靠。步骤如下:

  1. 首先在项目中添加对System.Management程序集的引用。
  2. 使用以下代码获取杀毒软件名称:
Imports System.Management

Public Class AntivirusHelper
    Public Shared Function GetInstalledAntivirus() As List(Of String)
        Dim antivirusList As New List(Of String)()
        Dim namespacesToTry As String() = {"root/SecurityCenter2", "root/SecurityCenter"}

        For Each ns As String In namespacesToTry
            Try
                Dim scope As New ManagementScope($"\\.\{ns}")
                scope.Connect()

                Dim query As New ObjectQuery("SELECT displayName FROM AntiVirusProduct")
                Dim searcher As New ManagementObjectSearcher(scope, query)

                For Each obj As ManagementObject In searcher.Get()
                    Dim displayName As String = obj("displayName")?.ToString()
                    If Not String.IsNullOrEmpty(displayName) AndAlso Not antivirusList.Contains(displayName) Then
                        antivirusList.Add(displayName)
                    End If
                Next

                ' 如果成功获取到数据,就不用尝试旧命名空间了
                If antivirusList.Count > 0 Then Exit For
            Catch ex As Exception
                ' 忽略当前命名空间的错误,继续尝试下一个
                Console.WriteLine($"尝试命名空间 {ns} 失败: {ex.Message}")
            End Try
        Next

        Return antivirusList
    End Function
End Class

这段代码会先尝试现代的SecurityCenter2命名空间,失败后回退到旧的SecurityCenter,兼容绝大多数Windows系统。

三、关键注意事项

  • 权限问题:在部分Windows系统中,读取SecurityCenter命名空间需要管理员权限。如果你的程序部署在数百台机器上,可能需要确保程序以管理员身份运行,或者在代码中请求权限提升。
  • 多杀毒软件场景:有些系统可能安装了多个杀毒软件(比如主防+辅助工具),这段代码会返回所有符合条件的名称。
  • 避免解析cpl:再次强调,wscui.cpl只是个界面入口,没有可直接读取的结构化数据,所以不要浪费时间在解析它上面。

测试方法

你可以在VB.NET项目中调用AntivirusHelper.GetInstalledAntivirus(),然后遍历返回的列表,就能得到所有已安装的杀毒软件名称了。如果是测试PowerShell命令,记得以管理员身份打开PowerShell再执行,避免权限不足导致的失败。

内容的提问来源于stack exchange,提问作者D. Teulings

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:22:39