我试图获得与bcdedit命令“bcdedit/enum ALL”相同的信息,但使用wmi和C#。我知道如何获取bootmgr条目(请参阅代码),但我无法获取所有条目,特别是设备选项是我正在查找的信息。有没有人有一个想法如何实现这一目标?如何使用wmi获得与bcdedit/enum ALL相同的结果?
这是我用来获取标准和传统os启动项的代码。
public class BCDWMI
{
public static readonly UInt32 BCDE_STANDARD_OS_ENTRY = 0x10200003;
public static readonly UInt32 BCDE_LEGACY_OS_ENTRY = 0x10300006;
public static readonly UInt32 BcdLibraryElementTypeString_Description = 0x12000004;
public static Dictionary<string, string> EnumerateObjectsByType(uint bcdType, string storePath)
{
Dictionary<string, string> dictEntries = null;
ConnectionOptions options = new ConnectionOptions();
options.Impersonation = ImpersonationLevel.Impersonate;
options.EnablePrivileges = true;
ManagementScope MgmtScope = new ManagementScope("root\\WMI", options);
ManagementPath MgmtPath = new ManagementPath("root\\WMI:BcdStore.FilePath='" + storePath + "'");
ManagementObject bcdStore = new System.Management.ManagementObject(MgmtScope, MgmtPath, null);
ManagementBaseObject[] mboArray;
bool success = EnumerateObjects(bcdStore, bcdType, out mboArray);
if (success)
{
dictEntries = new Dictionary<string, string>();
foreach (ManagementBaseObject mbo in mboArray)
{
ManagementPath BcdObjectPath = new ManagementPath("root\\WMI:BcdObject.Id=\"" + mbo.GetPropertyValue("Id") + "\",StoreFilePath='" + storePath + "'");
ManagementObject BcdObject = new ManagementObject(MgmtScope, BcdObjectPath, null);
ManagementBaseObject Element;
String Description = String.Empty;
try
{
bool getDescripStatus = GetElement(BcdObject, BcdLibraryElementTypeString_Description, out Element);
if (getDescripStatus)
Description = Element.GetPropertyValue("String").ToString();
}
catch (Exception)
{
}
dictEntries.Add((string)mbo.GetPropertyValue("Id"), String.Format("Type: {0:X8} {1}", mbo.GetPropertyValue("Type"), Description));
}
}
return dictEntries;
}
public static bool EnumerateObjects(ManagementObject bcdStore, uint Type, out System.Management.ManagementBaseObject[] Objects)
{
System.Management.ManagementBaseObject inParams = null;
inParams = bcdStore.GetMethodParameters("EnumerateObjects");
inParams["Type"] = ((uint)(Type));
System.Management.ManagementBaseObject outParams = bcdStore.InvokeMethod("EnumerateObjects", inParams, null);
Objects = ((System.Management.ManagementBaseObject[])(outParams.Properties["Objects"].Value));
return System.Convert.ToBoolean(outParams.Properties["ReturnValue"].Value);
}
public static bool GetElement(ManagementObject bdcObject, uint Type, out System.Management.ManagementBaseObject Element)
{
System.Management.ManagementBaseObject inParams = null;
inParams = bdcObject.GetMethodParameters("GetElement");
inParams["Type"] = ((uint)(Type));
System.Management.ManagementBaseObject outParams = bdcObject.InvokeMethod("GetElement", inParams, null);
Element = ((System.Management.ManagementBaseObject)(outParams.Properties["Element"].Value));
return System.Convert.ToBoolean(outParams.Properties["ReturnValue"].Value);
}
}
要查询系统商店,我打电话这样的功能。
Dictionary<string, string> StdOSEntries = BCDWMI.EnumerateObjectsByType(BCDWMI.BCDE_STANDARD_OS_ENTRY, String.Empty);
foreach (String guid in StdOSEntries.Keys)
Debug.WriteLine(String.Format("Id={0} {1}", guid, StdOSEntries[guid]));
如果您在'ManagementObject'上使用'EnumerateElements'方法并设置断点,则可以检查结果并将其复制到您的问题中。 – Hackerman