Управление устройствами через командную строку — это не просто альтернатива графическому интерфейсу, а мощный инструмент автоматизации и удалённого администрирования. Когда RDP отказывается работать, а сервер находится в другом дата-центре, именно командная строка становится спасательным кругом. За 15 лет работы с серверными системами я убедился: профессионал должен владеть CLI-методами управления оборудованием так же уверенно, как хирург — скальпелем. Эта статья раскроет все тонкости использования диспетчера устройств из командной строки, от базовых команд до сложных сценариев автоматизации. 🖥️
Диспетчер устройств через командную строку: базовые команды
Командная строка Windows предоставляет доступ к диспетчеру устройств через несколько встроенных утилит. Базовое понимание этих инструментов формирует фундамент для более сложных операций управления оборудованием.
Самый простой способ запустить графический интерфейс диспетчера устройств из командной строки — использовать команду devmgmt.msc
. Однако наша цель — управление устройствами без использования GUI, поэтому рассмотрим встроенные CLI-инструменты.
Одной из ключевых утилит является pnputil
— встроенный инструмент для управления драйверами. Он доступен в Windows начиная с Vista и позволяет выполнять операции с драйверами из хранилища драйверов Windows.
Команда | Описание | Пример использования |
pnputil -e | Перечисление всех драйверов в хранилище | pnputil -e > drivers.txt |
pnputil -a [путь_к_inf] | Добавление драйвера в хранилище | pnputil -a C:\Drivers\printer.inf |
pnputil -d [имя_oem_файла] | Удаление драйвера из хранилища | pnputil -d oem10.inf |
pnputil -f -d [имя_oem_файла] | Принудительное удаление драйвера | pnputil -f -d oem12.inf |
Другой полезный инструмент — wmic
, предоставляющий интерфейс командной строки для WMI (Windows Management Instrumentation). С его помощью можно получать информацию об устройствах и управлять ими:
wmic path win32_pnpentity get /format:list
— вывод подробной информации о всех устройствахwmic path win32_pnpentity where "caption like '%NVIDIA%'" get name
— поиск устройств по имени производителяwmic path win32_pnpsigneddriver get devicename,driverversion
— вывод версий драйверов установленных устройств
В Windows 10 и Windows Server 2016+ рекомендуется использовать PowerShell вместо устаревающей утилиты WMIC:
Get-PnpDevice
— получение списка всех устройствGet-PnpDevice -Status Error
— отображение устройств с ошибкамиGet-PnpDevice -Class 'Display'
— вывод всех устройств определённого классаDisable-PnpDevice -InstanceId (Get-PnpDevice -FriendlyName "Intel(R) Wireless-AC 9560" | Select-Object -ExpandProperty InstanceId)
— отключение устройства по его имени
Для быстрого переключения устройств (например, отключения/включения) можно использовать комбинацию команд в PowerShell:
$device = Get-PnpDevice -FriendlyName "Realtek USB Audio"; Disable-PnpDevice -InstanceId $device.InstanceId -Confirm:$false; Start-Sleep -Seconds 2; Enable-PnpDevice -InstanceId $device.InstanceId -Confirm:$false
Алексей Петров, руководитель отдела системного администрирования
Однажды мне позвонили среди ночи — на удалённой площадке отказала система видеонаблюдения. Сервер был доступен только по SSH, а проблема заключалась в «зависшей» USB-камере. Ехать за 300 км ради перезагрузки USB-порта? Это было бы непростительной тратой времени.
Я подключился к серверу, работающему под управлением Windows Server 2019, и выполнил команду Get-PnpDevice | Where-Object {$_.FriendlyName -like "*USB Camera*"} | Select-Object Status,FriendlyName,InstanceId
, которая помогла быстро идентифицировать проблемное устройство. Затем последовательно выполнил Disable-PnpDevice
и Enable-PnpDevice
с найденным InstanceId. Через 30 секунд камера снова была в строю, а я — в своей постели.
С тех пор я создал целую библиотеку PowerShell-скриптов для удалённого управления устройствами и решения типовых проблем без физического присутствия. Это сэкономило компании сотни часов и десятки тысяч рублей на командировочных расходах.
Утилита DevCon: мощный инструмент управления оборудованием
DevCon (Device Console) — это специализированная утилита командной строки, разработанная Microsoft как часть Windows Driver Kit (WDK). Она представляет собой более мощную альтернативу стандартному диспетчеру устройств, предоставляя расширенные возможности для управления оборудованием. 🔧
Важно отметить, что DevCon не входит в стандартную поставку Windows и требует отдельной загрузки. Её можно получить путём установки WDK или загрузить отдельно с сайта Microsoft. Для 64-битных систем используется версия devcon.exe, для 32-битных — devcon_x86.exe.
После получения утилиты рекомендуется добавить путь к ней в переменную PATH или скопировать в системную директорию (например, C:\Windows\System32) для удобства использования.
Основные операции, доступные через DevCon:
devcon find *
— отображение всех устройств в системеdevcon find =usb
— поиск всех USB-устройствdevcon status @USB\*
— вывод статуса всех USB-устройствdevcon disable "PCI\VEN_8086*"
— отключение всех устройств определённого производителя (в данном случае Intel)devcon enable @"USB\VID_046D&PID_C52B\*"
— включение конкретного USB-устройства по идентификаторуdevcon remove @USB\ROOT_HUB*
— удаление USB-концентраторовdevcon rescan
— сканирование системы на наличие новых устройств
DevCon использует гибкую систему идентификаторов оборудования, которая позволяет точно указать устройство или группу устройств:
Шаблон идентификатора | Описание | Пример |
* | Все устройства | devcon find * |
=class | Устройства определённого класса | devcon find =net |
@instance-id | Устройство с конкретным ID экземпляра | devcon status "@PCI\VEN_10DE&DEV_2208&SUBSYS_86941043\*" |
hardware-id | Устройство с конкретным аппаратным ID | devcon status "PCI\VEN_10DE&DEV_2208" |
Одним из мощных применений DevCon является управление скрытыми устройствами, которые не отображаются в стандартном диспетчере устройств:
devcon findall =usb
— найти все USB-устройства, включая отключенные и скрытые
Для работы с драйверами можно использовать следующие команды:
devcon driverfiles =display
— вывод файлов драйверов для дисплеевdevcon drivernodes "PCI\VEN_10DE&DEV_2208"
— отображение доступных вариантов драйверов для устройстваdevcon update C:\Drivers\display\nvidia.inf "PCI\VEN_10DE&DEV_2208"
— обновление драйвера для видеокарты NVIDIA
При работе с серверными системами особенно полезна возможность перезагрузки драйверов без перезапуска системы:
devcon restart "PCI\VEN_8086&DEV_2723"
— перезапуск сетевой карты Intel
Для администраторов, управляющих парком однотипных машин, DevCon предоставляет возможность создания скриптов для массовой установки и обновления драйверов, что значительно упрощает процесс обслуживания.
Управление драйверами через CMD: установка и обновление
Управление драйверами через командную строку — это ключевой навык для системных администраторов и специалистов технической поддержки. В отличие от графического интерфейса, командная строка позволяет автоматизировать процессы и выполнять операции в средах с ограниченным доступом. 🔄
Для установки драйверов через командную строку можно использовать несколько инструментов, каждый из которых имеет свои особенности и преимущества.
Установка драйверов с помощью pnputil
:
pnputil -i -a C:\Drivers\printer.inf
— установка драйвера из INF-файла (Windows 7/Server 2008 R2)pnputil /add-driver C:\Drivers\network\driver.inf /install
— установка драйвера в Windows 10/Server 2016+pnputil /enum-drivers
— вывод списка всех установленных драйверов
В Windows 10 и Windows 11 синтаксис команды pnputil был обновлен, добавив новые возможности:
pnputil /scan-devices
— сканирование новых устройствpnputil /disable-device "USB\VID_046D&PID_C52B\5&1234567&0&1"
— отключение устройства по его IDpnputil /remove-device "USB\VID_046D&PID_C52B\5&1234567&0&1"
— удаление устройства
Для установки драйверов через DevCon можно использовать команды:
devcon install C:\Drivers\network\rtl8168.inf PCI\VEN_10EC&DEV_8168
— установка драйвера для сетевой карты Realtekdevcon update C:\Drivers\display\nvidia.inf "PCI\VEN_10DE&DEV_2208"
— обновление драйвера для видеокарты NVIDIAdevcon dp_add C:\Drivers\network\driver.inf
— добавление драйвера в хранилище драйверов
При работе с драйверами через командную строку важно учитывать вопросы совместимости и подписи драйверов. Для установки неподписанных драйверов в системах с включенным UEFI Secure Boot может потребоваться временное отключение этой функции или использование специальных параметров:
pnputil /add-driver C:\path\to\driver.inf /install /force
— принудительная установка драйвера, игнорирующая некоторые предупреждения
Для обновления драйверов особенно полезным может быть совместное использование PowerShell и DevCon:
$devices = Get-PnpDevice | Where-Object {$_.Status -eq "Error"}; foreach ($device in $devices) { devcon update C:\Drivers\update\driver.inf $device.InstanceId }
Михаил Соколов, инженер техподдержки корпоративных клиентов
Мне поступила задача: обновить драйверы на 127 рабочих станциях компании в течение выходных. Причем большинство станций находились в режиме удаленного доступа из-за пандемии. Делать это вручную было бы безумием.
Я создал скрипт, который сначала определял модель устройства, затем выбирал соответствующий пакет драйверов из нашего хранилища и устанавливал его с помощью комбинации pnputil и devcon команд. Для каждого типа оборудования был свой блок условий.
Ключевой частью скрипта было обновление проблемных сетевых адаптеров Intel, которые периодически теряли соединение:
$adapter = Get-PnpDevice | Where-Object {$_.FriendlyName -like "*Intel(R) Ethernet Connection*" -and $_.Status -eq "OK"} if ($adapter) { $id = $adapter.InstanceId devcon update "\\server\drivers\Intel\e1d68x64.inf" $id if ($LASTEXITCODE -eq 0) { Write-Log "Драйвер сетевого адаптера успешно обновлен" } else { Write-Log "Ошибка обновления драйвера: $LASTEXITCODE" } }
Это сработало на 124 из 127 машин. Оставшиеся три потребовали ручного вмешательства из-за проблем с правами доступа, но все равно экономия времени была колоссальной. Вместо предполагаемых трех выходных работа заняла у меня около 4 часов на написание скрипта и 2 часа на контроль выполнения.
Автоматизация работы с устройствами через командные сценарии
Автоматизация управления устройствами через командные сценарии позволяет значительно повысить эффективность обслуживания инфраструктуры, особенно в крупных организациях с сотнями или тысячами компьютеров. Правильно настроенные скрипты сокращают время выполнения рутинных задач и минимизируют человеческие ошибки. 🤖
Существует несколько подходов к автоматизации работы с устройствами:
- Создание пакетных (.bat) файлов для последовательного выполнения команд
- Разработка PowerShell-скриптов с расширенной логикой и обработкой ошибок
- Использование задач планировщика для регулярного выполнения сценариев
- Интеграция с системами управления конфигурациями (SCCM, Intune и т.д.)
Рассмотрим примеры сценариев для решения типичных задач.
Простой пакетный файл для отключения и повторного включения проблемного USB-устройства:
@echo off echo Поиск устройства... for /f "tokens=1,2 delims=:" %%a in ('devcon find "USB\VID_046D&PID_C52B*"') do set DEVICE_ID=%%a if "%DEVICE_ID%"=="" ( echo Устройство не найдено! exit /b 1 ) echo Отключение устройства %DEVICE_ID%... devcon disable "%DEVICE_ID%" timeout /t 5 echo Включение устройства... devcon enable "%DEVICE_ID%" echo Готово!
PowerShell-скрипт для обновления драйверов всех устройств определенного производителя:
$driverPath = "C:\Drivers\Intel\Network" $devices = Get-PnpDevice | Where-Object {$_.FriendlyName -like "*Intel*" -and $_.Class -eq "Net"} foreach ($device in $devices) { Write-Host "Обновление драйвера для $($device.FriendlyName)..." $instanceId = $device.InstanceId $result = & devcon update "$driverPath\e1d68x64.inf" $instanceId 2>&1 if ($LASTEXITCODE -eq 0) { Write-Host "Успешно обновлен драйвер для $($device.FriendlyName)" -ForegroundColor Green } else { Write-Host "Ошибка обновления драйвера для $($device.FriendlyName): $result" -ForegroundColor Red } }
Для массового развертывания можно создать более сложный скрипт, который будет сканировать сеть, подключаться к удаленным компьютерам и выполнять операции с устройствами:
$computers = Get-Content "C:\Scripts\computers.txt" $credential = Get-Credential -Message "Введите учетные данные администратора" foreach ($computer in $computers) { Write-Host "Подключение к $computer..." -ForegroundColor Cyan if (Test-Connection -ComputerName $computer -Count 1 -Quiet) { try { $session = New-PSSession -ComputerName $computer -Credential $credential Invoke-Command -Session $session -ScriptBlock { $problematicDevices = Get-PnpDevice -Status Error foreach ($device in $problematicDevices) { Write-Host "Обнаружено проблемное устройство: $($device.FriendlyName)" -ForegroundColor Yellow # Попытка перезапуска устройства Disable-PnpDevice -InstanceId $device.InstanceId -Confirm:$false Start-Sleep -Seconds 2 Enable-PnpDevice -InstanceId $device.InstanceId -Confirm:$false # Проверка состояния после перезапуска $updatedStatus = (Get-PnpDevice -InstanceId $device.InstanceId).Status Write-Host "Новый статус устройства: $updatedStatus" -ForegroundColor Green } } Remove-PSSession $session } catch { Write-Host "Ошибка при работе с $computer: $_" -ForegroundColor Red } } else { Write-Host "$computer недоступен" -ForegroundColor Red } }
Для регулярного контроля состояния устройств можно использовать планировщик задач Windows. Создайте следующий скрипт и добавьте его в планировщик:
$logPath = "C:\Logs\DeviceMonitoring.log" $errorDevices = Get-PnpDevice -Status Error Add-Content -Path $logPath -Value "--- Проверка устройств $(Get-Date) ---" if ($errorDevices) { foreach ($device in $errorDevices) { $message = "Проблема: $($device.FriendlyName), Status: $($device.Status), ID: $($device.InstanceId)" Add-Content -Path $logPath -Value $message # Отправка уведомления по электронной почте Send-MailMessage -To "admin@company.com" -From "monitoring@company.com" -Subject "Проблема с устройством" -Body $message -SmtpServer "smtp.company.com" } } else { Add-Content -Path $logPath -Value "Все устройства работают нормально" }
Для упрощения диагностики и решения типовых проблем можно создать интерактивный скрипт-меню:
function Show-Menu { Clear-Host Write-Host "===== Управление устройствами =====" Write-Host "1. Показать все устройства с ошибками" Write-Host "2. Перезапустить USB-устройства" Write-Host "3. Обновить драйверы сетевых адаптеров" Write-Host "4. Удалить неиспользуемые драйверы" Write-Host "5. Выход" } do { Show-Menu $choice = Read-Host "Выберите действие (1-5)" switch ($choice) { "1" { Get-PnpDevice -Status Error | Format-Table FriendlyName, Status, InstanceId pause } "2" { $usbDevices = Get-PnpDevice -Class USB | Where-Object { $_.Status -eq "OK" } foreach ($device in $usbDevices) { Write-Host "Перезапуск $($device.FriendlyName)..." Disable-PnpDevice -InstanceId $device.InstanceId -Confirm:$false Start-Sleep -Seconds 1 Enable-PnpDevice -InstanceId $device.InstanceId -Confirm:$false } Write-Host "USB-устройства перезапущены" -ForegroundColor Green pause } "3" { # Код обновления драйверов сетевых адаптеров pause } "4" { # Код удаления неиспользуемых драйверов pause } } } while ($choice -ne "5")
Диагностика и решение проблем с оборудованием через CLI
Диагностика и устранение проблем с оборудованием через командную строку — ключевой навык для эффективного администрирования систем, особенно когда графический интерфейс недоступен или работает нестабильно. Вместо привычных щелчков мышью и визуальных индикаторов необходимо полагаться на текстовый вывод команд и их корректную интерпретацию. 🔍
Процесс диагностики устройств через CLI можно разделить на несколько этапов:
- Идентификация проблемного устройства
- Определение характера проблемы
- Выполнение действий по устранению неисправности
- Проверка результатов
Для идентификации проблемных устройств можно использовать следующие команды:
Get-PnpDevice -Status Error
(PowerShell) — отображение всех устройств с ошибкамиdevcon status @ROOT\*\*
— показывает статус всех устройств, отмечая проблемныеwmic path win32_pnpentity where "ConfigManagerErrorCode!=0" get Caption,ConfigManagerErrorCode
— вывод устройств с кодами ошибок
После идентификации проблемного устройства необходимо определить характер неисправности. Коды ошибок конфигурации можно интерпретировать с помощью следующей таблицы:
Код ошибки | Описание | Рекомендуемое действие |
1 | Устройство не настроено | Перезапустить устройство или обновить драйвер |
3 | Драйвер для устройства может быть поврежден | Переустановить драйвер |
10 | Устройство не запускается | Проверить конфликты ресурсов, обновить драйвер |
12 | Требуется перезагрузка системы | Перезагрузить компьютер |
14 | Устройство отключено | Включить устройство |
22 | Устройство удалено | Запустить сканирование оборудования |
28 | Драйвер не установлен | Установить драйвер |
31 | Устройство не работает из-за несовместимости Windows | Обратиться к производителю за обновлением |
Для более детальной диагностики используйте следующие команды:
devcon hwids =display
— вывод аппаратных идентификаторов всех дисплеевpnputil /enum-devices /problem
— перечисление всех проблемных устройств (Windows 10+)Get-PnpDeviceProperty -InstanceId "INSTANCEID" -KeyName DEVPKEY_Device_ProblemCode
— получение кода проблемы для конкретного устройства
Частой проблемой является конфликт ресурсов между устройствами. Для диагностики конфликтов используйте:
devcon resources =*
— отображение распределения системных ресурсов между устройствами
После диагностики проблемы можно приступить к её устранению. Типичные сценарии решения проблем включают:
1. Перезапуск проблемного устройства:
devcon restart "PCI\VEN_10DE&DEV_2208"
или $instanceId = (Get-PnpDevice -FriendlyName "NVIDIA GeForce RTX 3080" | Select-Object -ExpandProperty InstanceId); Disable-PnpDevice -InstanceId $instanceId -Confirm:$false; Start-Sleep -Seconds 2; Enable-PnpDevice -InstanceId $instanceId -Confirm:$false
2. Удаление и переустановка драйвера:
devcon remove "PCI\VEN_10DE&DEV_2208" devcon rescan devcon update C:\Drivers\nvidia\driver.inf "PCI\VEN_10DE&DEV_2208"
3. Сканирование на наличие изменений в оборудовании:
pnputil /scan-devices
или devcon rescan
4. Откат драйвера к предыдущей версии:
$instanceId = (Get-PnpDevice -FriendlyName "Intel(R) Wi-Fi 6 AX201 160MHz" | Select-Object -ExpandProperty InstanceId) $previousDriver = (Get-PnpDeviceProperty -InstanceId $instanceId -KeyName DEVPKEY_Device_DriverRank | Where-Object Data -lt (Get-PnpDeviceProperty -InstanceId $instanceId -KeyName DEVPKEY_Device_DriverRank).Data | Sort-Object Data -Descending | Select-Object -First 1) if ($previousDriver) { pnputil /add-driver "$($previousDriver.Data)" /install }
5. Управление скрытыми устройствами:
Скрытые устройства (например, отключенные или удаленные) не видны через стандартные команды. Для работы с ними используйте:
set DEVMGR_SHOW_NONPRESENT_DEVICES=1 devcon findall =*
Для удаления этих устройств:
devcon remove @USB\VID_046D&PID_C52B\*
При диагностике проблем с периферийными устройствами часто бывает полезно просмотреть историю подключений USB-устройств:
Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Enum\USB\*\*\ | Select-Object FriendlyName, DeviceDesc
После выполнения действий по устранению неисправности необходимо проверить результаты:
Get-PnpDevice -InstanceId $instanceId | Select-Object Status, Problem
Если проблема не устранена, можно использовать системные журналы для более глубокого анализа:
Get-WinEvent -LogName "Microsoft-Windows-DriverFrameworks-UserMode/Operational" | Where-Object {$_.Message -like "*устройств*"} | Select-Object TimeCreated, Message | Format-List
Для диагностики сложных проблем с устройствами также полезны следующие команды:
dism /online /cleanup-image /restorehealth
— восстановление системных файлов, которые могут влиять на работу диспетчера устройствsfc /scannow
— проверка целостности системных файловdevcon dp_delete
— очистка хранилища драйверов (использовать с осторожностью)
Мастерство управления устройствами через командную строку — не просто технический навык, а стратегическое преимущество для каждого IT-специалиста. Изученные инструменты — от базовых команд диспетчера устройств до сложных сценариев автоматизации — позволяют эффективно решать задачи, которые казались невыполнимыми через графический интерфейс. Применение этих методов значительно сокращает время простоя систем, автоматизирует рутинные операции и открывает новые возможности для удаленного администрирования. Внедрите эти техники в свою повседневную практику, и ваша продуктивность как специалиста выйдет на качественно новый уровень.