Кажется, есть много проблем с прямым доступом к bcdedit.exe, но я смог выяснить, как использовать WMI в C # для доступа к BcdStore:
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"));
}
Это получает GUID каждого диспетчера загрузки Windowsв BcdStore и показывает их в MessageBox.Следует отметить, что у вас должны быть правильные ConnectionOptions и что эта программа должна запускаться от имени администратора.
Спасибо Россу Джонстону за его проект по адресу: http://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=18233, чтобы найти константы BCD и TranDinh Hop для своего проекта по адресу: http://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=19208, в котором есть весь код C # для работы с BcdStore (кроме вышеупомянутых констант).
Обновление:
Использование:
ManagementObject privateLateBoundObject = new ManagementObject(managementScope, new ManagementPath("root\\WMI:BcdObject.Id=\"{fa926493-6f1c-4193-a414-58f0b2456d1e}\",StoreFilePath=\"\""), null);
получит BcdObject для текущего запущенного диспетчера загрузки Windows.Если вы затем позвоните:
currentManObj.GetPropertyValue("Id")
, вы получите GUID текущего запущенного диспетчера загрузки Windows, который отличается от "{fa926493-6f1c-4193-a414-58f0b2456d1e}", который является ссылкойтекущий Менеджер загрузки.
Спасибо Microsoft Scripting Guys и их проекту по адресу: http://technet.microsoft.com/en-us/magazine/2008.07.heyscriptingguy.aspx?pr=blog за постоянную GUID, которая ссылается на текущий Менеджер загрузки.