如果将笔式驱动器插入 USB 端口,如何使用 c# 检测?

Posted

技术标签:

【中文标题】如果将笔式驱动器插入 USB 端口,如何使用 c# 检测?【英文标题】:How to detect using c# if a pendrive is plugged into a USB port? 【发布时间】:2010-09-21 06:38:54 【问题描述】:

有没有办法查明在 LAN 中何时有人将随身碟插入 USB 端口? 以编程方式(最好在 C# 中)或通过某些工具。基本上我会想象一个客户端应用程序位于每个终端上并监视 USB 端口并将信息发送到服务器。

a.) 我可以获取正在复制的文件的详细信息吗? b.) 有没有办法在没有客户端应用程序的情况下做到这一点?

编辑

我不想完全禁用 USB 端口。它需要有依据。基本上只是希望 LAN 上的用户负责任地共享数据,并且知道传输的任何数据都会受到监控和记录,并且可以在以后受到质疑。

【问题讨论】:

【参考方案1】:

[假设 Windows,给定 C# 注释。请相应地标记]

是的,这是可能的。并且可以获得文件的详细信息。不过,这将需要编程。注意WM_DEVICECHANGE,然后重新枚举驱动器。它将为您提供 USB pendrives,但也为您提供 SD 卡。我希望这对你来说是一个奖励。

要在知道驱动器已到达后获取更多详细信息,请使用System.IO.FileSystemWatcher

更新 我找到了一个更好的解决方案 - 如果您注册音量接口通知,您将获得新驱动器的音量路径。 首先,使用dbcc_classguid=GUID_DEVINTERFACE_VOLUME 创建一个DEV_BROADCAST_DEVICEINTERFACE。然后将其传递给RegisterDeviceNotification()。您将再次获得 WM_DEVICECHANGE,但您现在可以将消息中的 lParam 转换为 DEV_BROADCAST_DEVICEINTERFACE*

您可以将收到的dbcc_name 传递给GetVolumeNameForVolumeMountPoint()。您还可以将所有驱动器号从GetLogicalDriveStrings() 传递到GetVolumeNameForVolumeMountPoint()。您将拥有一个匹配的卷名;这是新驱动器。

【讨论】:

呸,URL 解析器错误。 WM_DEVICECHANGE 文档@msdn.microsoft.com/en-us/library/aa363480(VS.85).aspx【参考方案2】:

还可以查看存储有关 USB 设备的所有信息的注册表。 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB

您可以挂钩注册表中该键的更改并据此采取行动。

这个免费实用程序在四处寻找时很有帮助:http://www.nirsoft.net/utils/usb_devices_view.html

您可以选择一个 USB 驱动器,选择打开该驱动器的注册表项并启用/禁用该设备等等。

在注册表中,您可以查看设备是否已连接、是否为大容量存储类型以及其他有趣的信息。它很容易过滤 regkeys 以获得 usb-massstorage 驱动器,然后连接并等待更改(连接/断开连接)。

使用 Windows Management Instrumentation,您可以注册以接收注册表事件: http://msdn.microsoft.com/en-us/library/aa393035(VS.85).aspx

查看 .Net 中的 System.Management

【讨论】:

【参考方案3】:

如果它是一个小环境并且你想阻止任何 USB 设备被使用,那么你可以在设备管理器中禁用 USB 端口,确保没有用户被设置为机器上的管理员,这应该会阻止所有 USB 使用.

如果您真的对此感到偏执,只需打开机器并拔掉端口即可。

【讨论】:

【参考方案4】:

您是否试图阻止使用 USB 拇指驱动器?如果是这样,则有一个组策略允许您限制访问。

【讨论】:

不完全。它需要有依据。基本上只是希望 LAN 上的用户负责任地共享数据,并且知道传输的任何数据都会受到监控和记录,并且可以在以后受到质疑。

以上是关于如果将笔式驱动器插入 USB 端口,如何使用 c# 检测?的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 通过“USB 虚拟串行端口”与 USB 设备通信?

查找可启动笔式驱动器是不是连接到 Windows [关闭]

如何使用网线接口转usb

是否有一种简单有效的方法可以在 C# 或 C/C++ 中列出所有 USB 设备?

如何确定正在使用哪个 USB 端口?

C# getdrives 类型固定但没有 USB 硬盘?