Powershell WMI триггер - действие, когда конкретное устройство подключено - PullRequest
0 голосов
/ 01 февраля 2019

Я хочу запустить сценарий, когда определенное 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 Ответ

0 голосов
/ 01 февраля 2019

В Интернете много документации о событиях WMI, но для чего-то подобного ничего не понятно, поэтому вот как я это заработал, я уверен, что это будет полезно для многих других.

ЧтоВы хотите зарегистрировать событие, когда экземпляр вашего устройства СОЗДАН и когда он УДАЛЕН.(в нашем случае это синоним подключенных и отключенных)

Таким образом, вы должны сначала найти идентификатор экземпляра, который создается при подключении устройства.У меня есть:

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

* Этот идентификатор устройства доставлял мне неприятности (я думаю, из-за всех в нем особых символов), поэтому я сопоставил части строки вместо целой, все работаетточно также.

Вот как создать два события:

#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% соответствует хорошему идентификатору устройства без необходимости использования всей строки)

События WMI - это мощные вещи!Наслаждайтесь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...