Используйте C# BCD WMI Provider для безопасной загрузки Windows

Я искал в Интернете решения о том, как выполнить SafeBoot в Windows, используя только C#. Начиная с Vista и выше, безопасная загрузка контролируется с помощью BCD. Конечно, вы можете использовать инструмент командной строки "bcdedit":

bcdedit /set {current} safeboot Minimal

Однако я не хочу использовать этот подход. Итак, мой вопрос:

Как перезагрузить компьютер в безопасном режиме, используя только C#?

Я уже посмотрел на этот пост, который начал меня. Но я все еще скучаю по этой головоломке.

Любая помощь с благодарностью. знак равно

Справочник поставщиков BCD WMI мало чем поможет.

1 ответ

Решение

Я написал следующий код на C#, который должен позволить вам установить значение safeboot и удалить это значение:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Management;
using System.Text;
using System.Threading.Tasks;

namespace EditBcdStore
{
    public class BcdStoreAccessor
    {
        public const int BcdOSLoaderInteger_SafeBoot = 0x25000080;

        public enum BcdLibrary_SafeBoot
        {
            SafemodeMinimal = 0,
            SafemodeNetwork = 1,
            SafemodeDsRepair = 2
        }

        private ConnectionOptions connectionOptions;
        private ManagementScope managementScope;
        private ManagementPath managementPath;

        public BcdStoreAccessor()
        {
            connectionOptions = new ConnectionOptions();
            connectionOptions.Impersonation = ImpersonationLevel.Impersonate;
            connectionOptions.EnablePrivileges = true;

            managementScope = new ManagementScope("root\\WMI", connectionOptions);

            managementPath = new ManagementPath("root\\WMI:BcdObject.Id=\"{fa926493-6f1c-4193-a414-58f0b2456d1e}\",StoreFilePath=\"\"");
        }

        public void SetSafeboot()
        {
            ManagementObject currentBootloader = new ManagementObject(managementScope, managementPath, null);
            currentBootloader.InvokeMethod("SetIntegerElement", new object[] { BcdOSLoaderInteger_SafeBoot, BcdLibrary_SafeBoot.SafemodeMinimal });
        }

        public void RemoveSafeboot()
        {
            ManagementObject currentBootloader = new ManagementObject(managementScope, managementPath, null);
            currentBootloader.InvokeMethod("DeleteElement", new object[] { BcdOSLoaderInteger_SafeBoot });
        }
    }
}

Я проверил это на своем Surface Pro, и он, кажется, работает, что можно проверить, выполнив:

bcdedit /enum {current} /v

Обновить:

Приведенный выше код предназначен только для установки или удаления значения, которое позволяет выполнить безопасную загрузку.

После того, как это было выполнено, требуется перезагрузка, которая также может быть выполнена с использованием WMI, как показано здесь:

WMI для перезагрузки удаленного компьютера

Ответ показывает пример выполнения этого локально или удаленно.

Большое спасибо Хелен и Л-Уильямс.

Другие вопросы по тегам