Используйте 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 для перезагрузки удаленного компьютера
Ответ показывает пример выполнения этого локально или удаленно.
Большое спасибо Хелен и Л-Уильямс.