代码之家  ›  专栏  ›  技术社区  ›  Rakha

Powershell WMI触发器-插入特定设备时的操作

  •  0
  • Rakha  · 技术社区  · 6 年前

    我想触发一个脚本,当一个特定的USB设备插入,我已经研究 Register-WmiEvent 但我真的很困惑如何正确处理它。

    到目前为止,我已经成功地隔离了设备:

    Get-WmiObject win32_PNPEntity | where {$_.Caption -eq "Lexar USB Flash Drive USB Device"}
    

    这是返回的WMI对象:

    _GENUS                     : 2
    __CLASS                     : Win32_PnPEntity
    __SUPERCLASS                : CIM_LogicalDevice
    __DYNASTY                   : CIM_ManagedSystemElement
    __RELPATH                   : Win32_PnPEntity.DeviceID="USBSTOR\\DISK&VEN_LEXAR&PROD_USB_FLASH_DRIVE&REV_1100\\AAEDZZ5RVJ47QS4K&0"
    __PROPERTY_COUNT            : 26
    __DERIVATION                : {CIM_LogicalDevice, CIM_LogicalElement, CIM_ManagedSystemElement}
    __SERVER                    : P7409
    __NAMESPACE                 : root\cimv2
    __PATH                      : \\P7409\root\cimv2:Win32_PnPEntity.DeviceID="USBSTOR\\DISK&VEN_LEXAR&PROD_USB_FLASH_DRIVE&REV_1100\\AAEDZZ5RVJ47QS4K&0"
    Availability                : 
    Caption                     : Lexar USB Flash Drive USB Device
    ClassGuid                   : {4d36e967-e325-11ce-bfc1-08002be10318}
    CompatibleID                : {USBSTOR\Disk, USBSTOR\RAW, GenDisk}
    ConfigManagerErrorCode      : 0
    ConfigManagerUserConfig     : False
    CreationClassName           : Win32_PnPEntity
    Description                 : Lecteur de disque
    DeviceID                    : USBSTOR\DISK&VEN_LEXAR&PROD_USB_FLASH_DRIVE&REV_1100\AAEDZZ5RVJ47QS4K&0
    ErrorCleared                : 
    ErrorDescription            : 
    HardwareID                  : {USBSTOR\DiskLexar___USB_Flash_Drive_1100, USBSTOR\DiskLexar___USB_Flash_Drive_, USBSTOR\DiskLexar___, USBSTOR\Lexar___USB_Flash_Drive_1...}
    InstallDate                 : 
    LastErrorCode               : 
    Manufacturer                : (Lecteurs de disque standard)
    Name                        : Lexar USB Flash Drive USB Device
    PNPClass                    : DiskDrive
    PNPDeviceID                 : USBSTOR\DISK&VEN_LEXAR&PROD_USB_FLASH_DRIVE&REV_1100\AAEDZZ5RVJ47QS4K&0
    PowerManagementCapabilities : 
    PowerManagementSupported    : 
    Present                     : True
    Service                     : disk
    Status                      : OK
    StatusInfo                  : 
    SystemCreationClassName     : Win32_ComputerSystem
    SystemName                  : P7409
    PSComputerName              : P7409
    

    我应该如何处理事件部分?

    “当包含该标题的实例存在时…执行此操作” ?

    我在努力:

    $query = "Select * FROM __InstanceModificationEvent WITHIN 1 WHERE TargetInstance ISA 'win32_PNPEntity'  and TargetInstance.Caption = 'Lexar USB Flash Drive USB Device'"
    
    Register-WMIEvent -Query $query -Action { Write-Host "LEXAR FLASH DRIVE CONNECTED"} -SourceIdentifier TEST
    

    但当我拔掉插头时什么也没发生。

    我试验了:

    $query = "SELECT * FROM win32_DeviceChangeEvent"
    Register-WMIEvent -Query $query  -Action {Write-Host "ALERT"}
    

    但当任何设备连接/断开时,它会触发。我只想用Lexar的标题来隔离这个设备。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Rakha    5 年前

    网上有很多关于WMI事件的文档,但是对于这样的事情没有什么真正明确的说明,所以这里是我如何让它工作的,我相信它会对很多其他人有用。

    您要做的是在创建和删除设备实例时注册一个事件。(在我们的例子中,这是插入和拔出的同义词)

    因此,您必须首先找到在插入设备时创建的实例的ID。我的是:

    Win32_PnPEntity.DeviceID="USBSTOR\\DISK&VEN_LEXAR&PROD_USB_FLASH_DRIVE&REV_1100\\AAEDZZ5RVJ47QS4K&0"
    

    *这个设备ID给我带来了麻烦(我想是因为里面有很多特殊的字符),所以我对字符串的一部分进行了匹配,而不是整个字符串,效果也不错。

    下面是如何创建两个事件:

    #Event when plugged in (InstanceCreationEvent)
    $query = "Select * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'win32_PNPEntity' and TargetInstance.DeviceID like 'USBSTOR%LEXAR%AAEDZZ5RVJ47QS4K%'"
    Register-WMIEvent -Query $query -Action { msg * lexar connected} -SourceIdentifier LexarConnect
    
    #Event when disconnected (InstanceDeletionEvent)
    $query = "Select * FROM __InstanceDeletionEvent WITHIN 1 WHERE TargetInstance ISA 'win32_PNPEntity' and TargetInstance.DeviceID like 'USBSTOR%LEXAR%AAEDZZ5RVJ47QS4K%'"
    Register-WMIEvent -Query $query -Action { msg * lexar disconnected} -SourceIdentifier LexarDisconnect
    

    如上所述,DeviceID正在创建错误,因此我使用了带有WQL通配符“%”的部分字符串(使用:Like USBSTOR%LEXAR%AAEDZZ5RVJ47QS4K%匹配良好的DeviceID,而不必使用整个字符串)

    WMI事件是强大的东西!好好享受!