以编程方式确定 Windows 8 安全启动是否已启用

5
我正在编写一个安全应用程序,用于验证用户计算机上的许多安全规则和策略。我需要实现一个测试方法,当Windows 8的安全启动功能启用时返回true,或者当它被禁用时返回false。
我搜索了相关信息并发现这是一个BIOS功能。所以我的问题是:是否可能使用C#代码获取Windows 8安全启动的状态?如果可以,如何实现?

Secure Boot from BIOS


更新: 请查看@magicandre1981的答案,需要提到只有支持安全启动功能时才存在状态注册表键。如果您在计算机上找不到此键,则可能您的计算机不支持安全启动。
要检查安全启动状态/支持,请转到运行 - > msinfo32.exe并搜索“Secure Boot State”。

3
我认为你最终会使用 P/Invoke GetFirmwareEnvironmentVariableEx,但我自己没有尝试过,因此无法提供更多指导或经过测试的答案。 - Damien_The_Unbeliever
2
有一个名为 Confirm-SecureBootUEFI 的 PowerShell 命令。您可以 反编译 命令以查看它调用了哪些 Windows / .NET API。 - CodeCaster
2个回答

9
MSinfo32.exe可以在注册表的 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecureBoot\State 下读取UEFISecureBootEnabled的值。在我的系统中,SecureBoot已禁用并返回值为0,因此我认为1表示已启用。enter image description here请注意保留HTML标记。

我的机器上没有状态密钥。在SecureBoot密钥中,我有“可用更新”和(默认)密钥。我更改了BIOS中的安全启动配置,但没有看到任何变化。 - Ofir
这里有一个键状态。这是它的值。我会插入一张图片。 - magicandre1981
是的,我通过BIOS打开了安全启动,现在它完全像你所想的那样。 - Ofir
在这些系统上,msinfo32.exe 告诉你什么? - magicandre1981
1
我假设当不支持安全启动时,状态密钥根本不存在。当其被禁用时,状态密钥的值为0。 - Ofir
显示剩余8条评论

2

当然适用于Windows 10的好代码应该处理大多数情况,包括传统或缺少的密钥和异常,以及未来的情况。在打印到控制台的同时,还可以返回批处理或脚本使用的标志:

最初的回答:

using System;
using Microsoft.Win32;

namespace CheckSecureBoot
{
    class Program
    {
        static int Main()
        {
            int rc = 0;
            string key = @"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecureBoot\State";
            string subkey = @"UEFISecureBootEnabled";
            try
            {
                object value = Registry.GetValue(key, subkey, rc);
                if (value != null)
                    rc = (int)value;
            }
            catch { }
            Console.WriteLine($@"{subkey} is {(rc >= 1 ? "On" : "Off")} ({rc.ToString()})");
            return rc;
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接