1

Тема: 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)

Post's attachments

Show Detail & Hidden Devices.zip 2.15 kb, 90 downloads since 2011-08-07 

You don't have the permssions to download the attachments of this post.

2

Re: VBS: запуск «Диспетчера устройств» с отображением скрытых устройств

Упрощённый вариант на основе предыдущего:

2. Более сложный способ при помощи скрипта VBScript, автоматически устанавливающий флажок «Показать скрытые устройства»

Option Explicit

Dim objMenuItem
Dim strTempFileName


With WScript.CreateObject("WScript.Shell").Environment("Process")
    .Item("DEVMGR_SHOW_NONPRESENT_DEVICES") = "1"
    .Item("DEVMGR_SHOW_DETAILS") = "1"
End With

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

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
'=============================================================================