我在网上搜索了有关如何仅使用 C# 将 SafeBoot 导入 Windows 的解决方案。从 Vista 及以上版本开始,安全启动是使用 BCD 控制的。当然你可以使用命令行工具“bcdedit”:
bcdedit /set {current} safeboot Minimal
但是我不想使用这种方法。所以我的问题是:
如何仅使用 C# 重新启动到安全模式?
我已经看过这个 SO post,它让我开始了。但我仍然缺少这个难题的部分。
任何帮助是极大的赞赏。=)
我在网上搜索了有关如何仅使用 C# 将 SafeBoot 导入 Windows 的解决方案。从 Vista 及以上版本开始,安全启动是使用 BCD 控制的。当然你可以使用命令行工具“bcdedit”:
bcdedit /set {current} safeboot Minimal
但是我不想使用这种方法。所以我的问题是:
如何仅使用 C# 重新启动到安全模式?
我已经看过这个 SO post,它让我开始了。但我仍然缺少这个难题的部分。
任何帮助是极大的赞赏。=)
我在 C# 中编写了以下代码,它应该允许您设置安全启动值并删除该值:
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 完成,如下所示:
答案显示了一个在本地或远程执行此操作的示例。
非常感谢 Helen 和 L-Williams。