问题标签 [removable-storage]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
2509 浏览

c# - 通过 USB 或其他方式连接新驱动器时获取通知 (C#)

我需要检测新驱动器何时通过 USB 端口、火线端口等插入 Windows 系统。我知道WM_DEVICECHANGE消息,但这需要打开一个窗口才能使用它。有没有办法在 C# 中创建一个后台进程来检测何时插入新驱动器?

背景信息:我想编写此应用程序以从公司可移动驱动器中删除蠕虫。常规的防病毒软件无法将其删除。我们有一个可以删除蠕虫的脚本,但它必须手动运行,这不足以控制爆发。

0 投票
1 回答
7055 浏览

delphi - 如何找到闪存设备的唯一序列号?

我发现了几个片段和 .pas 文件,它们可以检测何时插入和移除 USB 闪存驱动器。有些提供了各种好的信息,但我需要的是设备的唯一序列号,而不是卷的序列号。

我当前的 .pas 文件(我不记得我在哪里找到的)似乎也检测到了 SD 卡(我喜欢)。如果你想看看,你可以在这里找到它(它只返回驱动器号和插入/删除):

PS 代码高亮失败。

总而言之; 插入/删除可移动设备时,获取驱动器号及其唯一序列号。也许将已经给出的代码与 WMI 调用“where Index=found_index”结合起来。

****编辑!**** 我删除了 RRUZ 给出的代码中的“where”子句。我终于找到了如何处理数组,所以我用它来查找 Capabilities[i]=7 来获取所有可移动媒体。现在我只需要将这段代码与上面的代码连接起来。我正在考虑使用 Index,但我不知道如何使用 GetDrive MapInfo。如果你能给我提供一个获取驱动器号的例子,我的问题就解决了。

0 投票
2 回答
5444 浏览

delphi - 始终检测可移动设备的最佳方法

在我之前的问题“如何找到闪存设备的唯一序列号?” 我最终要求一种获取驱动器号的方法。那个问题就解决了。

但是,我最初的问题没有得到回答。我希望能够区分可移动设备(USB 驱动器、SD 卡、(外部 HDD?)等),并且在重新连接时始终能够再次识别它们。这在任何其他计算机上也应该是可能的。幸运的是,我不关心被格式化的驱动器(如果/当它们被格式化时,它们在我的程序中被视为新驱动器),所以我可以使用分区和卷 ID 作为我识别的一部分吗?我问这个是因为 PNPDeviceID不是唯一的。我发现它取决于读取它的硬件,见下图:

替代文字

替代文字

所以,我正在寻找的是一种使用以下方法检测和识别任何计算机上的任何可移动设备的方法:Win32_DiskDriveWin32_DiskPartitionWin32_LogicalDisk。我感谢RRUZ的原始代码:

编辑
我应该补充一点,在插入驱动器时检测驱动器的代码已经在工作,尽管它只给了我驱动器号。我使用该驱动器号从 WMI 获取所有其他信息。

最终编辑
我读到开发人员可以安全地使用分区/卷 ID 进行识别。我可以指望吗?

解决方案:
因此,由于读取“唯一” id 不是一个可行的解决方案,有两种方法可以解决这个问题:

  1. 使用程序可以识别的唯一 ID 在驱动器上保存一个隐藏文件(与本地数据库相比)。
  2. 以隐藏设置文件的形式将与驱动器相关的所有内容保存在驱动器上。我采用这种方法是因为程序本身没有任何设置。所有设置都是针对每个分区的。这也使设置/程序可移植。
0 投票
2 回答
213 浏览

wmi - 漂亮的(无制造商)设备名称,我在哪里可以找到这些名称?

我想做一些涉及(可移动)设备的事情,所以我正在查看 WMI 和其他 API、“设备和打印机”屏幕和“安全删除硬件”弹出窗口,因为我希望获得尽可能无缝的体验。然而问题..是我找不到任何方法来获取名称,因为我的用户在他的 PC 中“知道”它们。

示例...我连接了一个 iPod,这在 DaP 和 SRH 中都显示为“iPod”,这太棒了。在 WMI 中,我能找到的最接近的是“Apple Inc. iPod”和“Apple iPod USB Device”。类似的故事适用于其他硬件,如 WD My Book 和其他此类硬件。我在哪里可以找到正确的字符串?

由于我开始怀疑我是否正在使用 WMI 从正确的方向接近更大的图景,因此需要更多解释……我们在这里对可移动硬件做了相当多的工作,99% 的磁盘驱动器。我考虑过硬编码从 A 到 Z 的循环并检查每个驱动器,但据我所知,可移动卷不需要安装在字母上,但也可以转储到 ntfs 上的空文件夹中。那个和我的小疑问可能有其他(非驱动器)硬件在拔出之前需要“最终确定”,这增加了一个小问题,即我可能会一起提出错误的问题。(编辑:如果这是太多不相关的信息,请随意编辑这个问题。)

0 投票
2 回答
9488 浏览

c++ - 检测可移动驱动器(例如 USB 闪存驱动器)C/C++

如何检测可移动磁盘驱动器何时(断开)连接到系统?如何获取挂载路径(适用于 Linux)和驱动器号(适用于 Windows)?

编辑:有没有办法检测当前连接的设备?

0 投票
1 回答
2202 浏览

windows - 在终端服务会话中访问可移动驱动器

我有一个托盘应用程序,它向外壳注册以在将驱动器添加到系统或将媒体插入驱动器时接收通知(通过 SHChangeNotifyRegister)。收到这些通知后,我尝试打开驱动器以从中查询一些属性。对于我的测试,我使用的是一个简单的 USB 闪存驱动器。当我在物理控制台登录时,这工作正常,但如果我通过远程桌面登录,则 CreateFile 调用失败并显示 ERROR_ACCESS_DENIED。

我将 CreateFile 称为:

其中 szDrive 的形式为"\\\\.\\G:". 在此之后,我进行了几次 DeviceIoControl 调用。

奇怪的是,我已经在此运行了 Process Monitor,并且在远程桌面场景中,我的托盘应用程序的驱动器上没有 CreateFile 记录。我知道我的托盘应用程序正在调用它,因为我编写了一个日志文件,并且我在 Process Monitor 日志中看到了对日志文件的 CreateFile 调用。就好像它还远远没有被进程监视器所吸引。

这台机器是 Windows 7,所有默认设置(即 UAC)。我的帐户是本地管理员。在这两种情况下(本地和远程桌面),我都以标准用户身份运行我的托盘应用程序(即没有提升)。但是,如果我提升我的托盘应用程序,那么远程桌面方案将成功打开驱动器。

这最终可能会成为我们不支持的场景,但我仍然想知道这里发生了什么。有任何想法吗?

编辑1:再次查看后,所有驱动器(不仅仅是可移动驱动器)似乎都会发生这种情况。观察到的行为是相同的: CreateFile 失败并出现 ERROR_ACCESS_DENIED 并且进程监视器中没有日志。

编辑2:似乎远程登录被拒绝读取访问;如果我将 GENERIC_READ 替换为 0,那么它会成功打开驱动器(尽管 DeviceIoControl 调用失败并出现 ERROR_ACCESS_DENIED)。我正在使用 WinObj 尝试查看是否可以授予远程登录对驱动器的读取访问权限。

0 投票
4 回答
7277 浏览

c++ - 使用 Windows 消息检测将媒体插入驱动器

我目前正在使用 WM_DEVICECHANGE 在新的 USB 驱动器连接到计算机时收到通知。这对于像拇指驱动器这样的设备非常有用,一旦设备到达,它就可以从中读取文件。对于像 SD 卡读卡器这样的设备,它不会,因为在设备连接时会发送一次消息,但当用户实际将卡插入设备时不会发送消息。

是否可以检测新媒体插入现有 USB 设备而无需使用轮询?

0 投票
1 回答
145 浏览

.net - 存储卡信息

我正在检测存储卡(可移动媒体)的插入。我可以获得有关插入媒体的信息 - 类型、制造商等吗?

0 投票
2 回答
1427 浏览

c# - 搜索 SD 卡

我需要在我的程序中实现对 SD 卡的搜索。

目前我正在使用搜索所有可移动设备,例如:

但它也可以找到 USB 闪存驱动器。有没有一种正确的方法可以只找到 SD 卡?我需要的通常只是可用 SD 卡的驱动器号(如“F:”左右)。

0 投票
2 回答
10690 浏览

winapi - 如何弹出 USB 可移动磁盘/卷,类似于 Windows 资源管理器中的“弹出”功能?

您知道什么是 API 或 API 调用序列,Windows 使用这些 API 来完成可移动卷的 shell 上下文菜单中提供的“弹出”功能吗?

到目前为止,我已经尝试了两件事:

  1. 使用CM_Request_Device_Eject,我枚举可移动磁盘(使用SetupDiXXX API),找到我感兴趣的磁盘,遍历设备管理器层次结构(使用CM_XXX API),最后调用我感兴趣CM_Request_Device_EjectdevInst设备。这个从某种意义上说,它确实从我的电脑中删除了卷并使设备“安全删除”(准备删除),但它与外壳上下文菜单“弹出”功能不同我知道这是因为我试图弹出的设备在弹出时应该做一些事情,当我使用CM_Request_Device_Eject.

  2. DeviceIoControlIOCTL_STORAGE_EJECT_MEDIA控制代码一起使用。事件的顺序是:

    这根本行不通。每个调用都以(0x00000001)DeviceIoControl失败。ERROR_IVALID_FUNCTION我不知道为什么通话失败。我已经验证了对 DeviceIoControl 的其他调用对于同一个文件句柄(例如IOCTL_STORAGE_GET_DEVICE_NUMBER)工作正常

最后,我的开发机器运行的是 Windows 7 x64,为了让第二种方法工作,我尝试以管理员权限运行我的应用程序,但这并没有改变任何东西。

编辑

最终,我发现我在方法#2 中犯了错误。事实证明,由于某种原因,在使用CreateFile. 正确的访问模式是GENERIC_READ | GENERIC_WRITE,我通过了 0。纠正错误后,我能够使用 成功弹出设备DeviceIoControl - IOCTL_STORAGE_EJECT_MEDIA,以及使用方法#1,使用CM_Request_Device_Eject.

事实证明,方法 #2 确实是 shell 上下文菜单的“弹出”功能使用的方法。使用这种方法,设备会做出正确的反应。