c# - 如何以编程方式查找 Windows 上的事件安全提供程序?

标签 c# c++ windows

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

(更具体地说,我需要查明 Windows Defender 是否是事件的安全提供程序,或者不同的防病毒应用程序是否处于事件状态)。

最佳答案

这并不理想,但您可以使用 WMI 来获取一些信息。请注意,这不适用于 Windows Server,需要 Vista 或更高版本。在 Vista 之前的 Workstation 操作系统上,您可以从 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;

关于c# - 如何以编程方式查找 Windows 上的事件安全提供程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56548616/

相关文章:

c++ - 如何在字符串替换后获得有效的迭代器

c++ - 在析构函数中删除的问题

windows - 如何在 Dart SDK 的 Windows 中以字符串形式获取路径而无需前导 "slash"?

c# - 仅使用 XNA dll 运行 XNA 游戏?

c# - 自定义setter添加多对多关系.net core

c# - AspIdentiy ApplicationUserManager 是静态的,如何扩展以使其参与我的 IoC 框架?

c++ - 获取 C++ double 函数以在满足特定条件时报告消息而不是返回数字

c# - LINQ 查询婴儿步骤

c# - 子属性更改时更新内容绑定(bind)

windows - 字符串匹配后输出行的批处理文件,文件名