【问题标题】:How to find out the active security provider on Windows programmatically?如何以编程方式找出 Windows 上的活动安全提供程序?
【发布时间】:2019-06-11 17:05:04
【问题描述】:

Windows 10 具有用于显示活动安全提供程序的 UI(在 Windows 安全应用程序中,单击“病毒和威胁防护”,然后单击“管理提供程序”)。如何以编程方式找出当前处于活动状态的安全提供程序?

(更具体地说,我需要确定 Windows Defender 是否是活动的安全提供程序,或者是否有其他防病毒应用程序处于活动状态)。

【问题讨论】:

    标签: c# c++ windows


    【解决方案1】:

    这并不理想,但您可以使用 WMI 获取一些信息。请注意,这在 Windows Server 上不起作用,并且需要 Vista 或更高版本。您可以从 Vista 之前的 Workstation OS 上的 SecurityCenter 命名空间获得更清晰的信息。

    void Main() {
        var av_searcher = new ManagementObjectSearcher(@"root\SecurityCenter2", "SELECT * FROM AntivirusProduct");
        foreach (ManagementObject info in av_searcher.Get()) {
            Console.WriteLine(info.Properties["displayName"].Value.ToString());
    
            var ps = ConvertToProviderStatus((uint)info.Properties["ProductState"].Value);
            Console.WriteLine(ps.SecurityProvider.ToString());
            Console.WriteLine(ps.AVStatus.HasFlag(AVStatusFlags.Enabled) ? "Enabled" : "Disabled");
            Console.Write("Signatures are ");
            Console.WriteLine(ps.SignatureStatus.HasFlag(SignatureStatusFlags.UpToDate) ? "up to date" : "out of date");
            Console.WriteLine()l
        }
    }
    
    [Flags]
    public enum ProviderFlags : byte {
        FIREWALL = 1,
        AUTOUPDATE_SETTINGS = 2,
        ANTIVIRUS = 4,
        ANTISPYWARE = 8,
        INTERNET_SETTINGS = 16,
        USER_ACCOUNT_CONTROL = 32,
        SERVICE = 64,
        NONE = 0,
    }
    
    [Flags]
    public enum AVStatusFlags : byte {
        Unknown = 1,
        Enabled = 16
    }
    
    [Flags]
    public enum SignatureStatusFlags : byte {
        UpToDate = 0,
        OutOfDate = 16
    }
    
    [StructLayout(LayoutKind.Sequential)]
    public struct ProviderStatus {
        public SignatureStatusFlags SignatureStatus;
        public AVStatusFlags AVStatus;
        public ProviderFlags SecurityProvider;
        public byte unused;
    }
    
    public static unsafe ProviderStatus ConvertToProviderStatus(uint val) => *(ProviderStatus*)&val;
    

    【讨论】:

    • 非常感谢!这确实给了我需要的信息。
    猜你喜欢
    • 2010-11-20
    • 2014-11-17
    • 1970-01-01
    • 2022-01-22
    • 2011-01-18
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多