【问题标题】:Powershell WMI trigger - action when specific device is plugged inPowershell WMI 触发器 - 插入特定设备时的操作
【发布时间】:2020-01-10 23:51:39
【问题描述】:

我想在插入特定 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

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

有没有办法编写它,使其像 “当包含该 Caption 的实例存在时......这样做”

我正在尝试:

$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 标题隔离该设备。

非常感谢。

【问题讨论】:

  • 关于这个主题的信息足够多。在 Google 上搜索“Powershell WMI 事件”会得到 345K 的结果。请进行更多研究,并尝试在查看文档后根据遇到的问题编辑您的问题
  • 我添加了更多信息,你是对的。

标签: powershell wmi


【解决方案1】:

网上有很多关于 WMI 事件的文档,但对于这样的事情并不清楚,所以这就是我如何让它工作的,我相信它会对其他许多人有用。

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

因此,您必须首先找到插入设备时创建的实例的 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 通配符“%”的部分字符串(使用:如 USBSTOR%LEXAR%AAEDZZ5RVJ47QS4K% 匹配良好的 DeviceID 而不必使用整个字符串)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 2021-12-07
    • 2021-03-12
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多