【问题标题】:C# - Get last known parent from USB device property detailsC# - 从 USB 设备属性详细信息中获取最后一个已知的父级
【发布时间】:2021-12-04 12:41:30
【问题描述】:
我想尝试使用 c# 从 Windows 10 中的 USB 设备中读取最后一个已知的父设备,这在设备管理器 -> 设备属性 -> 详细信息中可见。我搜索了很多,找到了很多解决方案来获取制造商等,但我无法检索到想要的信息。在我看到的微软网站上,Win32Pnp Entity 类只返回以下内容:https://i.stack.imgur.com/DCAT7.png
还有其他方法可以读取最后一个已知的父母吗?
非常感谢??????????
最好的问候,
戴夫
【问题讨论】:
标签:
c#
winapi
device-manager
【解决方案1】:
截至今天,“最后已知的父级”属性键未记录在案。它的名字是DEVPKEY_Device_LastKnownParent,它的值是{83DA6326-97A6-4088-9453-A1923F573B29} 10。
而Win32_PnPEntity 有一个GetDeviceProperties method,您可以使用它的键名来读取任何属性。
因此,这里有一个示例控制台 C# 代码,它为系统中的所有设备转储它(和友好名称):
foreach (var mo in new ManagementObjectSearcher(null, "SELECT * FROM Win32_PnPEntity").Get().OfType<ManagementObject>())
{
// ask for 2 properties
var args = new object[] { new string[] { "DEVPKEY_Device_FriendlyName", "DEVPKEY_Device_LastKnownParent" }, null };
// or this works too using the PK's value formatted as string
//var args = new object[] { new string[] { "DEVPKEY_Device_FriendlyName", "{83DA6326-97A6-4088-9453-A1923F573B29} 10" }, null };
// call Win32_PnPEntity.GetDeviceProperties
mo.InvokeMethod("GetDeviceProperties", args);
var mbos = (ManagementBaseObject[])args[1]; // one mbo for each device property key
var name = mbos[0].Properties.OfType<PropertyData>().FirstOrDefault(p => p.Name == "Data")?.Value;
if (name != null)
{
Console.WriteLine(name);
var parent = mbos[1].Properties.OfType<PropertyData>().FirstOrDefault(p => p.Name == "Data")?.Value;
Console.WriteLine(" " + parent);
}
}