【发布时间】:2019-06-11 17:05:04
【问题描述】:
Windows 10 具有用于显示活动安全提供程序的 UI(在 Windows 安全应用程序中,单击“病毒和威胁防护”,然后单击“管理提供程序”)。如何以编程方式找出当前处于活动状态的安全提供程序?
(更具体地说,我需要确定 Windows Defender 是否是活动的安全提供程序,或者是否有其他防病毒应用程序处于活动状态)。
【问题讨论】:
Windows 10 具有用于显示活动安全提供程序的 UI(在 Windows 安全应用程序中,单击“病毒和威胁防护”,然后单击“管理提供程序”)。如何以编程方式找出当前处于活动状态的安全提供程序?
(更具体地说,我需要确定 Windows Defender 是否是活动的安全提供程序,或者是否有其他防病毒应用程序处于活动状态)。
【问题讨论】:
这并不理想,但您可以使用 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;
【讨论】: