如何使用C#检测U盘是否插入USB端口?

13
有没有办法找出何时有人将U盘插到局域网中的USB端口上? 可以通过编程(首选C#)或某些工具来实现。基本上,我想像每个终端一样有一个客户端应用程序坐在那里监控USB端口并将信息发送到服务器。
a.) 我能否获得正在复制的文件的详细信息? b.) 是否有方法可以在没有客户端应用程序的情况下完成此操作?
编辑
我不想完全禁用USB端口。这是基于需求的。基本上,只想让局域网上的用户负责共享数据,并知道传输的任何数据都受到监视和记录,稍后可以对其进行质询。
4个回答

13

[假设使用的是Windows,鉴于C#的说明。请相应地打标签]

是的,这是可能的。并且可以获取文件的详细信息。但需要通过编程来实现。监听 WM_DEVICECHANGE 并在此后重新枚举驱动器。它将为您获取USB闪存驱动器,以及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文档请参考http://msdn.microsoft.com/en-us/library/aa363480(VS.85).aspx。 - MSalters

3
同时查看注册表,其中存储了有关usb设备的所有信息。 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB
您可以钩入注册表中该键的更改并采取行动。
这个免费的实用程序在浏览时非常有帮助: http://www.nirsoft.net/utils/usb_devices_view.html 您可以选择一个usb驱动器,选择打开该驱动器的注册表键,并启用/禁用设备等等。
在注册表中,您可以看到设备是否连接,是否为大容量存储类型以及其他有趣的信息。很容易过滤掉regkeys以仅获取usb-massstorage驱动器,然后钩入并等待更改(连接/断开)。
使用Windows管理工具,您可以注册接收注册表事件: http://msdn.microsoft.com/en-us/library/aa393035(VS.85).aspx 查看.Net中的System.Management

1
如果是一个小型环境并且想要防止使用任何 USB 设备,那么您可以在设备管理器中禁用 USB 端口,并确保没有用户被设置为机器管理员,这应该能够防止所有的 USB 使用。
如果你真的很担心的话,就打开机器然后拔掉 USB 端口。

0

你想防止使用USB闪存驱动器吗? 如果是,那么有一个组策略可以让您限制访问。


不完全是这样。这是根据需要的基础。基本上只是希望局域网上的用户负责地共享数据,并知道传输的任何数据都受到监控和记录,以便以后可以进行询问。 - user20358

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接