そこには多くの問題に直接Bcdedit.exeをアクセスしているようだが、私はBcdStoreにアクセスするためにC#でWMIを使用する方法を見つけ出すことができました:
ConnectionOptions connectionOptions = new ConnectionOptions();
connectionOptions.Impersonation = ImpersonationLevel.Impersonate;
connectionOptions.EnablePrivileges = true;
// The ManagementScope is used to access the WMI info as Administrator
ManagementScope managementScope = new ManagementScope(@"root\WMI", connectionOptions);
// {9dea862c-5cdd-4e70-acc1-f32b344d4795} is the GUID of the System BcdStore
ManagementObject privateLateBoundObject = new ManagementObject(managementScope, new ManagementPath("root\\WMI:BcdObject.Id=\"{9dea862c-5cdd-4e70-acc1-f32b344d4795}\",StoreFilePath=\"\""), null);
ManagementBaseObject inParams = null;
inParams = privateLateBoundObject.GetMethodParameters("GetElement");
// 0x24000001 is a BCD constant: BcdBootMgrObjectList_DisplayOrder
inParams["Type"] = ((UInt32)0x24000001);
ManagementBaseObject outParams = privateLateBoundObject.InvokeMethod("GetElement", inParams, null);
ManagementBaseObject mboOut = ((ManagementBaseObject)(outParams.Properties["Element"].Value));
string[] osIdList = (string[]) mboOut.GetPropertyValue("Ids");
// Each osGuid is the GUID of one Boot Manager in the BcdStore
foreach (string osGuid in osIdList)
{
ManagementObject currentManObj = new ManagementObject(managementScope, new ManagementPath("root\\WMI:BcdObject.Id=\"" + osGuid + "\",StoreFilePath=\"\""), null);
MessageBox.Show("" + currentManObj.GetPropertyValue("Id"));
}
これは、内のすべてのWindowsブートマネージャーのGUIDを取得しますBcdStoreを呼び出し、それらをMessageBoxに表示します。正しいConnectionOptionsが必要であり、このプログラムを管理者として実行する必要があることに注意してください。 (前述の定数を除く)BcdStoreで動作するようにC#コードのすべてを持っているhttp://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=19208:で、彼のプロジェクトのためのBCD定数を見つけるためにhttp://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=18233とトラン・ディンホップへ:
彼のプロジェクトのためのロス・ジョンストンのおかげで。
更新:
使用:
ManagementObject privateLateBoundObject = new ManagementObject(managementScope, new ManagementPath("root\\WMI:BcdObject.Id=\"{fa926493-6f1c-4193-a414-58f0b2456d1e}\",StoreFilePath=\"\""), null);
は、現在、実行中のWindowsブートマネージャのためのBcdObjectを取得します。あなたが呼び出す場合:
currentManObj.GetPropertyValue("Id")
を、あなたは異なっているWindowsブートマネージャを実行して、現在のGUIDを取得します「{fa926493-6f1c-4193-a414-58f0b2456d1e}」現在のブートへのリンクですマネージャー。
Microsoft Scripting Guysとそのプロジェクト:http://technet.microsoft.com/en-us/magazine/2008.07.heyscriptingguy.aspx?pr=blogのおかげで、現在のブートマネージャーにリンクするGUID定数を持つことができます。
'ProcessStartInfo procStartInfo =新しいProcessStartInfo(" cmd "、"/c "bcdedit/enum {現在}/v \" "))'。 –
私もそれを試みましたが、cmdは管理者の代わりに通常のユーザーとして実行されるため、bcdeditが見つかりませんでした。私はコードにユーザー名とパスワードを入れて管理者として実行させることができましたが、それは私たちが望むものではありません。また、これはユーザー名とパスワードが異なる場合があるマシン全体で使用されます。 –
質問からのコードで 'procStartInfo.UseShellExecute = true;'を試しましたか? –