none
Опять про WMI-события RRS feed

  • Вопрос

  • Всем привет!

    Продолжаю возиться с WMI-событиями. Написал скрипт регистраци фильтра-потребителя-связи события при изменении свойства PredictFailure класса MSStorageDriver_FailurePredictStatus (оповещения о проблемах S.M.A.R.T, подробности вот здесь: http://learn-powershell.net/2011/08/20/checking-for-failing-hard-drives-using-s-m-a-r-t-and-powershell/)

    Регистрацию фильтра сделал следующим образом:

    <# Параметры фильтра событий #>
    	$FilterName = [string]$PhysicalDrive.InstanceName + 'PredictFailureEventFilter'
    	$EventNameSpace = 'Root\Cimv2'
    	$Query = 'SELECT * FROM __InstanceModificationEvent WITHIN 60 
    	WHERE TargetInstance ISA "MSStorageDriver_FailurePredictStatus" 
    	AND TargetInstance.PredictFailure=True
    	AND TargetInstance.InstanceName="' + [string]($PhysicalDrive.InstanceName) + '"'
    
    $Filter = Set-WmiInstance -Class __EventFilter -Namespace "root\subscription" `
        		-Arguments @{ Name = $FilterName; EventNameSpace = $EventNameSpace; QueryLanguage = "WQL"; Query = $Query }
    

    Проблема в том, что InstanceName имеет, например, следующий монстрообразный вид:

    IDE\DiskHitachi_HTS547564A9E384_________________JEDOA50A\5&19b3cddc&0&0.0.0_0
    И при регистраци фильтра вылетает:

    Set-WmiInstance : Unparsable query. 
    
    C:\Users\Public\Documents\PowerShell\DiskMonitoring1.ps1:10 знак:27
    
    + $Filter = Set-WmiInstance <<<< -Class __EventFilter -Namespace "root\subscription" `
    
     + CategoryInfo : InvalidOperation: (:) [Set-WmiInstance], ManagementException
    
     + FullyQualifiedErrorId : SetWMIManagementException,Microsoft.PowerShell.Commands.SetWmiInstance
    
    

    Видимо спотыкается о спецсимволы в InstanceName.

    Подскажите пожста - как корректно сформировать WQL-запрос в этом случае ?

     


    Andy Mishechkin
    26 декабря 2011 г. 15:31

Ответы

Все ответы

  • IDE\\DiskHitachi_HTS547564A9E384_________________JEDOA50A\\5&19b3cddc&0&0.0.0_0 - Заменить на двойной слеш,одинарные.

    И $EventNameSpace = 'Root\Cimv2' - думаю должно быть "Root\Wmi"

    • Изменено KazunEditor 26 декабря 2011 г. 15:46
    • Помечено в качестве ответа Andy Mishechkin 27 декабря 2011 г. 5:18
    26 декабря 2011 г. 15:44
    Отвечающий
  • IDE\\DiskHitachi_HTS547564A9E384_________________JEDOA50A\\5&19b3cddc&0&0.0.0_0 - Заменить на двойной слеш,одинарные.


    Спасибо.
    Кстати, как наиболее элегантно это сделать ?
    А то мне вот только это на ум пришло:

    	$strStorID = @(([string]$PhysicalDrive.InstanceName).split("\"))
            $Query = 'SELECT * FROM __InstanceModificationEvent WITHIN 60 
    	WHERE TargetInstance ISA "MSStorageDriver_FailurePredictStatus" 
    	AND TargetInstance.PredictFailure=True
    	AND TargetInstance.InstanceName="' + $strStorID[0] + "\\" + $strStorID[1] + "\\" + $strStorID[2]+'"'
    


    Andy Mishechkin
    27 декабря 2011 г. 6:04
  • $PhysicalDrive.InstanceName.replace("\","\\")
    • Помечено в качестве ответа Andy Mishechkin 27 декабря 2011 г. 9:06
    27 декабря 2011 г. 7:03
    Отвечающий
  • [regex]::Escape($PhysicalDrive.InstanceName)
    29 декабря 2011 г. 10:36
  • [regex]::Escape($PhysicalDrive.InstanceName)

    Это не правильный ответ,потому что так же экранируются ".",что собственно внесет еще ошибок.
    29 декабря 2011 г. 11:03
    Отвечающий