В списке безопасного извлечения устройств в системном трее Windows могут отображаться устройства, которые пользователь в принципе не планирует извлекать. Например, USB сетевые адаптеры, мониторы подключенные через Type-C, SATA/SSD диски (которые определяются как съемные устройства), USB звуковые карты, мыши и т.д. Вы можете скрыть любое устройство из меню безопасного извлечения Windows (Safely Remove Hardware and Eject Media).
- Откройте диспетчер устройств (
devmgmt.msc
) - Откройте свойств устройства, которое вы хотите скрыть (в этом примере Wi-Fi адаптер TP-Link Wireless USB Adapter)
- Перейдите на вкладку Details -> свойство Hardware Ids и скопируйте идентификатор устройства. Например, USB\VID_2357&PID_010C
- Откройте редаткор реестра и перейдите в ветку
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB
- Найдите ветку вашего USB устройства и разверните ее
- Задайте параметру Capabilities hex значение 60
- Если в ветке с идентификатором устройства несколько вложенных под-веток, измените значение параметра Capabilities в каждой из них.
- Это скроет ваш USB сетевой адаптер из списка безопасного извлечения в трее
Однако после перезагрузки значение параметра реестра Capabilities вернется на исходное. Чтобы автоматически скрывать это устройство при загрузке Windows, создайте задание планировщика, которое будет менять его значение.
Можно создать задание с помощью графической консоли Task Scheduler (
taskschd.msc
) или такой командой (замените в команде путь к ветке реестра на ваш):
schtasks /create /tn "Hide_TPLinkUSBAdapter_Safe_Removal" /sc ONSTART /ru SYSTEM /rl HIGHEST /tr "reg.exe add 'HKLM\SYSTEM\CurrentControlSet\Enum\USB\VID_2357&PID_010C\00E04C0001' /v Capabilities /t reg_dword /d 0x00000060 /f"
Теперь указанное устройство будет автоматически скрываться из списка безопасного извлечения трея.
Если вы все-же хотите извлечь такое устройство, выполните команду
RunDll32.exe shell32.dll,Control_RunDLL hotplug.dll
Из этого диалога вы сможете безопасно остановить устройство в случае необходимости.
Я тоже боролся с этой ерундой на терминальном сервере.
Нашёл утилиту, которая аналогично прячет при запуске.
Не помню название уже.
Всё равно решение такое себе.
Странно что ms это не предусмотрело.
по поводу значения Capabilities = 0x60 не во всех случаях верно
нужно обнулить второй и третий бит
cfgmgr32.h
//
// Capabilities bits (the capability value is returned from calling
// CM_Get_DevInst_Registry_Property with CM_DRP_CAPABILITIES property)
//
#define CM_DEVCAP_LOCKSUPPORTED (0x00000001)
#define CM_DEVCAP_EJECTSUPPORTED (0x00000002)
#define CM_DEVCAP_REMOVABLE (0x00000004)
#define CM_DEVCAP_DOCKDEVICE (0x00000008)
#define CM_DEVCAP_UNIQUEID (0x00000010)
#define CM_DEVCAP_SILENTINSTALL (0x00000020)
#define CM_DEVCAP_RAWDEVICEOK (0x00000040)
#define CM_DEVCAP_SURPRISEREMOVALOK (0x00000080)
#define CM_DEVCAP_HARDWAREDISABLED (0x00000100)
#define CM_DEVCAP_NONDYNAMIC (0x00000200)