Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to detect using c# if a pendrive is plugged into a USB port?

Is there a way to find out when in a LAN anyone plugs in a pendrive to the USB port? Programatically (in C# preferably) or through some tool. Basically I'd imagine a client application sits on each terminal and monitors the USB ports and sends the information to the server.

a.) Can I get the details of the file(s) being copied? b.) Is there a way to do this without a client application?

EDIT

I dont want to disable the USB port entirely. its to be on a need to have basis. Basically just want the users on the LAN to share data responsibly and know that whatever data is tranfered is monitored and logged and can be questioned later.

like image 366
user20358 Avatar asked Nov 07 '08 12:11

user20358


1 Answers

[Assuming Windows, given the C# remark. Please tag accordingly]

Yes, this is possible. And it is possible to get the details of the file. It will require programming, though. Watch for WM_DEVICECHANGE and re-enumerate drives afterwards. It will get you USB pendrives, but also SD cards. I expect that's a bonus for you.

To get more details once you know a drive has arrived, use System.IO.FileSystemWatcher

Update I found a better solution - if you register for volume interface notifications, you'll get the volume path for the new drive. First, create a DEV_BROADCAST_DEVICEINTERFACE with dbcc_classguid=GUID_DEVINTERFACE_VOLUME. Then pass this to RegisterDeviceNotification(). You will again get a WM_DEVICECHANGE but you can now cast the lParam from the message to DEV_BROADCAST_DEVICEINTERFACE*.

You can pass the dbcc_name you receive to GetVolumeNameForVolumeMountPoint(). You can also pass all drive letters from GetLogicalDriveStrings() to GetVolumeNameForVolumeMountPoint(). You'll have one matching volume name; this is the new drive.

like image 146
MSalters Avatar answered Sep 29 '22 17:09

MSalters