0

C#のみを使用してWindowsにセーフブートする方法に関するソリューションを探して、Webを精査しました。Vista 以降では、セーフ ブートは BCD を使用して制御されます。もちろん、コマンドライン ツール "bcdedit" を使用できます。

bcdedit /set {current} safeboot Minimal

しかし、私はこのアプローチを使用したくありません。だから私の質問は:

C# のみを使用してセーフ モードで再起動するにはどうすればよいですか?

私はすでにこの SO postを見てきました。これが私を始めさせました。しかし、私はまだこのパズルのピースが欠けています。

どんな助けでも大歓迎です。=)

BCD WMI プロバイダー リファレンスはほとんど役に立ちません。

4

1 に答える 1

2

セーフブート値を設定し、その値を削除できるようにする次のコードを 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 を使用して実行することもできます。

リモート マシンを再起動するための WMI

回答は、これをローカルまたはリモートで実行する例を示しています。

Helen と L-Williams に感謝します。

于 2014-08-14T23:17:48.587 に答える