因工作原因需做外设管控方面的内容,今天借这个话题聊一发。外设是各种各样的,仅拿U盘来讲一讲。
首先,最容易想到的是禁用U盘相关驱动程序,我们知道要显示U盘,必须启用Usbstor.sys驱动,修改一下注册表:

修改Start值即可
把上图中Start值由3改为4即可(想知道为什么可点击看我的文章 闲聊Windows注册表-基础)。不过你一旦知道这种方法是不是还可以改回来,大笑!
其次,还有Windows策略可以设置:

Windows策略禁止U盘
设置完后,记得调用gpupdate /force更新,否则不生效。同样的,如果用户有管理员权限,可以随时改过来。
唉呀呀,如何是好?我们换个想法,Windows对U盘的插入和卸载是有事件通知的,我们可以在那里做点儿事情:
LRESULT CHWDetectDlg::OnMyDeviceChange(WPARAM wParam, LPARAM lParam)
{
if ( DBT_DEVICEARRIVAL == wParam || DBT_DEVICEREMOVECOMPLETE == wParam ) {
PDEV_BROADCAST_HDR pHdr = (PDEV_BROADCAST_HDR)lParam;
PDEV_BROADCAST_DEVICEINTERFACE pDevInf;
PDEV_BROADCAST_HANDLE pDevHnd;
PDEV_BROADCAST_VOLUME pDevVolume;
switch( pHdr->dbch_devicetype ) {
case DBT_DEVTYP_DEVICEINTERFACE:
pDevInf = (PDEV_BROADCAST_DEVICEINTERFACE)pHdr;
break;
case DBT_DEVTYP_VOLUME:
pDevVolume = (PDEV_BROADCAST_VOLUME)pHdr;
break;
}
}
return 0;
}
可以想到,在上面程序检测到事件通知后,可以判断是否U盘并做一个实时的启用禁用,仿佛就象U盘没插入一样。
爱思考的同学可有就想了,你弄一个程序来做,我可以把你程序给停掉哇,只好祭出终极大杀器,搞个Windows驱动程序来做,驱动也有多种做法,这里提一下:
- 注册系统模块加载回调,停止usbstor.sys的加载
- Hook设备PNP分发例程,禁止设备启动
- 写一个标准的设备过滤驱动, UpperFilter即可
这里抛砖引玉,感兴趣的同学可以试一试啦!