Тема: VBS: запуск «Диспетчера устройств» с отображением скрытых устройств
Запуск «Диспетчера устройств» с отображением скрытых устройств и вкладки «Сведения» («Details») в свойствах устройства.
Как известно, по умолчанию «Диспетчера устройств» отображает не все устройства. К скрытым устройствам относятся не Plug&Play устройства и фантомные устройства (отсутствующие сейчас, но когда-либо ранее подключавшиеся к системе устройства). Иногда нужно включить это отображение, дабы удалить то или иное неиспользуемое устройство.
Для отображения не Plug&Play устройств требуется установить флажок «Показать скрытые устройства» («Show hidden devices») в меню «Вид» («View») «Диспетчера устройств». Для отображения фантомных устройств — дополнительно задать переменную окружения «DEVMGR_SHOW_NONPRESENT_DEVICES» равной единице перед вызовом «Диспетчера устройств»:
set DEVMGR_SHOW_NONPRESENT_DEVICES=1
start devmgmt.msc
Кроме того, в Windows 2000, Windows XP SP1 и в Windows Server 2003 вкладка «Сведения» («Details») в свойствах устройства по умолчанию не отображается [для более поздних версий — напротив, эта вкладка по умолчанию отображается]. Для отображения вкладки «Сведения» («Details») в свойствах устройства требуется задать переменную окружения «DEVMGR_SHOW_DETAILS» так же равной единице перед вызовом «Диспетчера устройств»:
set DEVMGR_SHOW_DETAILS=1
start devmgmt.msc
1. Простой способ при помощи пакетного файла:
@echo off
setlocal
set DEVMGR_SHOW_NONPRESENT_DEVICES=1
set DEVMGR_SHOW_DETAILS=1
start "" "%SystemRoot%\SYSTEM32\mmc.exe" "%SystemRoot%\SYSTEM32\devmgmt.msc"
endlocal
exit /b 0
Минус этого способа — всё равно приходится вручную устанавливать в меню флажок «Показать скрытые устройства».
2. Более сложный способ при помощи скрипта VBScript, автоматически устанавливающий флажок «Показать скрытые устройства»:
Option Explicit
Const SW_HIDE = 0
Dim elem
Dim strNewEnvironment
Dim objSWbemObjectEx
Dim lngProcessID
Dim objMenuItem
Dim strTempFileName
If Not WScript.Arguments.Named.Exists("ShowDevMgmt") Then
With GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
strNewEnvironment = _
"DEVMGR_SHOW_NONPRESENT_DEVICES=1" & vbCrLf & _
"DEVMGR_SHOW_DETAILS=1"
For Each elem In WScript.CreateObject("WScript.Shell").Environment("Process")
If Left(elem, 1) <> "=" Then
strNewEnvironment = strNewEnvironment & vbCrLf & elem
End If
Next
Set objSWbemObjectEx = .Get("Win32_ProcessStartup").SpawnInstance_
objSWbemObjectEx.ShowWindow = SW_HIDE
objSWbemObjectEx.EnvironmentVariables = Split(strNewEnvironment, vbCrLf)
If .Get("Win32_Process").Create( _
"wscript.exe """ & WScript.ScriptFullName & """ /ShowDevMgmt", Null, objSWbemObjectEx, lngProcessID _
) <> 0 Then
WScript.Echo "Process [wscript.exe """ & WScript.ScriptFullName & """] could not be created."
End If
Set objSWbemObjectEx = Nothing
End With
Else
With WScript.CreateObject("MMC20.Application")
.Load "devmgmt.msc"
With .Document
With .ActiveView
.Frame.Maximize
For Each objMenuItem In .ScopeNodeContextMenu
If objMenuItem.Path = "Вид->Показать скрытые устройства" Then
If objMenuItem.Enabled = 1 Then
objMenuItem.Execute
Exit For
End If
End If
Next
End With
If .IsSaved = 0 Then
strTempFileName = GetTemporaryFileName()
.SaveAs strTempFileName
WScript.CreateObject("Scripting.FileSystemObject").DeleteFile strTempFileName, True
End If
End With
.UserControl = 1
End With
End If
WScript.Quit 0
'=============================================================================
'=============================================================================
Function GetTemporaryFileName()
Const TEMP_FOLDER = 2
Dim strTempFile
With WScript.CreateObject("Scripting.FileSystemObject")
Do
strTempFile = .BuildPath(.GetSpecialFolder(TEMP_FOLDER), .GetTempName)
Loop While .FileExists(strTempFile)
End With
GetTemporaryFileName = strTempFile
End Function
'=============================================================================
3. Комбинированный метод, JScript внутри пакетного файла (кодировка пакетного файла из-за JScript должна быть «win-1251»!):
@set @x=0 /*
@echo off
setlocal enableextensions enabledelayedexpansion
set DEVMGR_SHOW_NONPRESENT_DEVICES=1
set DEVMGR_SHOW_DETAILS=1
cscript.exe /nologo /e:javascript %0
set DEVMGR_SHOW_DETAILS=
set DEVMGR_SHOW_NONPRESENT_DEVICES=
endlocal
exit /b 0
*/
with (WScript.CreateObject("MMC20.Application")) {
Load("devmgmt.msc");
with (Document) {
with (ActiveView) {
Frame.Maximize();
with (new Enumerator(ScopeNodeContextMenu)) {
for (; !atEnd(); moveNext())
with (item())
if (Path == "Вид->Показать скрытые устройства")
if (Enabled == 1) {
Execute();
break;
}
}
}
if (IsSaved == 0) {
strTempFileName = GetTemporaryFileName();
SaveAs(strTempFileName);
WScript.CreateObject("Scripting.FileSystemObject").DeleteFile(strTempFileName, true);
}
}
UserControl = 1;
}
WScript.Quit(0)
function GetTemporaryFileName()
{
var strTempFile;
with (WScript.CreateObject("Scripting.FileSystemObject")) {
do {
strTempFile = BuildPath(GetSpecialFolder(2), GetTempName());
} while (FileExists(strTempFile));
}
return (strTempFile);
}
Код всех трёх скриптов находится также в приложенном архиве.
Ссылки по теме:
Viewing Hidden Devices
Device Manager Details Tab
Диспетчер устройств не отображает отсутствующие в данный момент устройства в Windows 2000 (Device Manager Does Not Display Devices Not Currently Present in Windows 2000)
Диспетчер устройств не отображает устройства, не подключенные к компьютеру под управлением Windows XP (Device Manager does not display devices that are not connected to the Windows XP-based computer)
Настройка диспетчера устройств для получения подробной информации (How to Configure Device Manager to Display Detailed Information)