如何使用WMI获取USB设备的盘符

2023-11-21

我需要跟踪 C# 应用程序中的 USB 插入和移除事件,因此我根据 SO 上的其他问题提出了以下想法。

我无法使用这个方法

var drives = DriveInfo.GetDrives()
    .Where(drive => drive.IsReady && drive.DriveType == DriveType.Removable).ToList();

因为当您需要区分已连接和已断开连接的设备时(新设备可以与之前缓存的设备具有相同的驱动器号和名称),这可能会导致很多麻烦。

所以我决定使用WMI来解决这个问题,但我发现无法通过以下方式获取指定USB设备的盘符Win32_USBHub班级。然后我想我可以像这样执行另一个查询

foreach (ManagementObject device in new ManagementObjectSearcher(@"SELECT * FROM Win32_USBHub").Get())
{
    string deviceID = (string)device.GetPropertyValue("DeviceID");

    Console.WriteLine("{0}", deviceID);

    string query = string.Format("SELECT * FROM Win32_LogicalDisk WHERE DeviceID='{0}'", deviceID);
    foreach (ManagementObject o in new ManagementObjectSearcher(query).Get())
    {
        string name = (string)o.GetPropertyValue("Name");
        Console.WriteLine("{0}", name);
    }

    Console.WriteLine("==================================");
}

但它根本不起作用——每次当我尝试执行适用于Win32_LogicalDisk table.

为什么?我究竟做错了什么?我该如何修复它?也许有更好的方法来解决这个问题?

提前致谢。


你会得到一个例外,因为你的deviceID包含需要转义的字符(反斜杠)。通过简单的替换,您不应该遇到异常。

string query = string.Format("SELECT * FROM Win32_LogicalDisk WHERE DeviceID='{0}'", deviceID.Replace(@"\", @"\\"));

然而,从 WMI 获取 USB 驱动器号有点复杂。您需要学习一些课程,如 @MSalters 在他的评论中发布的链接中所述:

Win32_DiskDrive-> Win32_DiskDriveToDiskPartition -> Win32_DiskPartition -> Win32_LogicalDiskToPartition -> Win32_LogicalDisk.

找到了代码的一点修改版本here为我工作:

foreach (ManagementObject device in new ManagementObjectSearcher(@"SELECT * FROM Win32_DiskDrive WHERE InterfaceType LIKE 'USB%'").Get())
{
    Console.WriteLine((string)device.GetPropertyValue("DeviceID"));
    Console.WriteLine((string)device.GetPropertyValue("PNPDeviceID"));                

    foreach (ManagementObject partition in new ManagementObjectSearcher(
        "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" + device.Properties["DeviceID"].Value
        + "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition").Get())
    {
        foreach (ManagementObject disk in new ManagementObjectSearcher(
                    "ASSOCIATORS OF {Win32_DiskPartition.DeviceID='"
                        + partition["DeviceID"]
                        + "'} WHERE AssocClass = Win32_LogicalDiskToPartition").Get())
        {
            Console.WriteLine("Drive letter " + disk["Name"]);
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用WMI获取USB设备的盘符 的相关文章

  • 删除文件的最后 10 个字符

    我想删除文件的最后 10 个字符 说一个字符串 hello i am a c learner 是文件内的数据 我只是希望该文件是 hello i am a 文件的最后 10 个字符 即字符串 c learner 应在文件内消除 解决方案 将
  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲

随机推荐

  • 在行内行块下方添加一个 div

    我有一个内联块元素列表 它们换行形成几行 我想在行之间显示一个 div 元素 具体取决于特定元素所在的位置 例如 前几行已编号 如果我想定位第三个元素并显示全长元素 包含块的 div 的 100 那么它将如下所示 对于任何块 1 5 全长
  • 如何将地图转换为 url 查询字符串?

    您是否知道任何实用程序类 库可以将 Map 转换为 URL 友好的查询字符串 Example 我有一张地图 param1 12 param2 cat 我想得到 param1 12 param2 cat 最终输出 relativeUrl pa
  • java和javaw的区别

    我搜索以了解之间的区别java exe and javaw exe 我通读了Java exe 和 Javaw exe 之间的区别 那里指出java exe用于控制台和javaw exe用于窗口应用程序 在其他一些帖子中提到控制台不可用jav
  • 具有延迟加载功能的单元素枚举类型单例

    我读了很多关于在 java 中实现单调模式的不同风格的论坛和帖子 似乎 枚举是在 java 中实现单调模式的最佳方法 我想知道如何使用 Java Enum 在 java 中实现 SingleTone 模式带有延迟加载能力 因为枚举只是类 第
  • 使用 Maven 将 Dll 打包在 Jar 中 - 单一目标

    我在我的 Maven 项目中添加了一个 DLL 作为依赖项 如下所示
  • Google Drive Rest API:未经身份验证的使用已超出每日限制。继续使用需要注册

    我正在将我的应用程序从已弃用的 Google Drive Android API 迁移到 Drive Rest API 我使用新包实现了所需的行为 并且在模拟器中一切正常 应用程序要求访问用户的云端硬盘并让它上传文件 当我开始在真实设备上测
  • 使用 JNA 单击鼠标

    我正在尝试使用 JNA 模拟鼠标在窗口中的单击 public class App public static final int WM LBUTTONUP 514 public static final int WM LBUTTONDOWN
  • 使用 ASP.NET Core 获取绝对 URL

    在 MVC 5 中 我使用以下扩展方法来生成绝对 URL 而不是相对 URL public static class UrlHelperExtensions public static string AbsoluteAction this
  • 什么是回调函数以及如何在 OOP 中使用它

    我想使用php 简单的 HTML DOM 解析器从充满文章的页面上的每篇文章中获取图像 标题 日期和描述 当查看 API 时 我注意到它有一个 set callback 来设置回调函数 但是我不确定它的作用或我将如何使用它 在其中一个示例中
  • 使用 unique_ptr 作为值初始化静态 std::map

    如何初始化静态地图 其中值是std unique ptr static void f static std map
  • 在 ruby​​ on Rails 中被 nokogiri 转换为“\u0092”

    我有一个 html 页面 其中包含一些 html 实体 例如 Here I am not pasting whole html page content just putting issue line only html file p th
  • ASP.NET Session 对象中的实体框架对象上下文?

    我们有一个多层的 Asp NET Web 窗体应用程序 数据层有一个类叫做DataAccess它实现了IDisposable并有一个实体框架对象上下文的实例作为私有字段 该类具有许多返回各种实体集合的公共方法 并且在释放其对象上下文时将释放
  • Django:在后台发送电子邮件的最佳方式?

    我正在从 Django 发送电子邮件 使用 Webfaction 然而 这非常慢 所以我想在后台发送电子邮件 即使电子邮件尚未发送 也会向用户返回响应 关于什么是最好的方法有什么想法吗 我读过有关芹菜的内容 但设置它的步骤似乎很多 http
  • 将 EXE 作为 DLL 加载,本地 vftable

    我有一个名为test exe通常用作独立应用程序 我想将此 exe 用作另一个应用程序 app exe 中的模块 dll test exe 中的代码做了一些非常简单的事情 例如 void doTest MyClass inst new My
  • Raphael JS 沿路径文本

    我正在寻找一个例子或对一个概念的一些确认 希望在应用程序上使用 Raphael JS 并希望能够像 Illustrator 等图形设计应用程序那样扭曲文本 以下是 Chris Wilson 代码的改编版 重构为嵌入式函数 并添加了一些功能
  • 从时间格式中删除前导零

    我收到这种格式的字符串 HH mm ss 我想删除前导零 但始终保留最后四个字符 例如m ss即使m将是零 我正在格式化音频持续时间 例子 00 03 15 gt 3 15 10 10 10 gt 10 10 10 00 00 00 gt
  • ASP.NET Web api:记录/指定服务

    我一直在看asp net 网络 API 而且我喜欢实现实用 Web 服务的简单性 但是 我如何记录 指定这样实现的服务的接口 例如 是否有任何规范我可以传递或生成给没有 NET 背景的 Java 人员 让他轻松调用和使用服务 我可以给 ja
  • 如何让 R 使用更多 CPU 使用率?

    我注意到 R 并没有使用我所有的 CPU 我想大幅增加它 高达 100 我不希望它只是并行化几个函数 我希望 R 使用更多的 CPU 资源 我正在尝试使用 lp 函数运行纯 IP 设置打包程序 目前 我运行 Windows 我的计算机上有
  • Android - 如何知道一个视图是否覆盖了RelativeLayout中的另一个视图

    我有一个RelativeLayout 里面有两个视图 view1 每十秒在布局内的随机位置重新创建一次 view2 处于静态位置并且比 view1 大 我想知道第一个视图何时在第二个视图区域内创建 我该怎么做 我目前正在尝试此代码 但 id
  • 如何使用WMI获取USB设备的盘符

    我需要跟踪 C 应用程序中的 USB 插入和移除事件 因此我根据 SO 上的其他问题提出了以下想法 我无法使用这个方法 var drives DriveInfo GetDrives Where drive gt drive IsReady