如何在PowerShell中获取PnP设备的“功能”

问题描述 投票:0回答:1

是否有 WMI 或 PowerShell 方式来获取即插即用设备(如网络摄像头)的功能

我正在寻找一种编程方式来枚举或检查功能值,特别是

CM_DEVCAP_SECUREDDEVICE
(如下图所示)是否存在/适用于相机设备。

能够获取属性密钥

DEVPKEY_Device_Capabilities
但是,根据Microsoft文档

DEVPKEY_Device_Capability 的值是 CM_DEVCAP_Xxx 功能标志的按位或运算

这并没有给我足够的粒度来了解该特定功能是否可用(或者它是但我不明白吗?😅)。

Get-PnpDevice -PresentOnly -Class Camera | Get-PnpDeviceProperty -KeyName DEVPKEY_Device_Capabilities

InstanceId KeyName                                   Type       Data
---------- -------                                   ----       ----
USB\VID... DEVPKEY_Device_Capabilities               UInt32     164

需要注意的是,我事先不知道我必须检查的设备/相机池中的设备是否肯定已启用(我也没有办法购买),所以我无法知道

 的值DEVPKEY_Device_Capabilities
提前财产进行比较。

powershell windows-10 wmi windows-driver windows-hello
1个回答
0
投票

存储为

DEVPKEY_Device_Capabilities
的值是映射到
Cfgmgr32.h
中定义的功能的位字段 - 解析该值的最简单方法是使用
enum
属性定义
[Flags()]
类型,然后将值转换为:


[Flags()]
enum DeviceCapabilities {
  LOCKSUPPORTED      = 0x0001
  EJECTSUPPORTED     = 0x0002
  REMOVABLE          = 0x0004
  DOCKDEVICE         = 0x0008
  UNIQUEID           = 0x0010
  SILENTINSTALL      = 0x0020
  RAWDEVICEOK        = 0x0040
  SURPRISEREMOVALOK  = 0x0080
  HARDWAREDISABLED   = 0x0100
  NONDYNAMIC         = 0x0200
  SECUREDEVICE       = 0x0400
}

现在我们可以做:

PS ~> Get-PnpDevice -Class Camera -PresentOnly |Select FriendlyName,InstanceId,@{Name='Capabilities';Expression={($_ |Get-PnpDeviceProperty -KeyName DEVPKEY_Device_Capabilities).Data -as [DeviceCapabilities]}}

InstanceId FriendlyName                               Capabilities
---------- ------------                               ------------
USB\VID... PC camera    REMOVABLE, SILENTINSTALL, SUPRISEREMOVALOK
© www.soinside.com 2019 - 2024. All rights reserved.