none
Регистрация постоянного подписчика WMI-событий RRS feed

  • Вопрос

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

    Пытаюсь сделать подписку на WMI-событие, возникающее при уменьшении места на диске ниже 500 Мег. таким вот образом:

    $query = "SELECT * FROM __InstanceModificationEvent WITHIN 10
                    WHERE TargetInstance ISA 'Win32_LogicalDisk'
                    AND TargetInstance.FreeSpace<524288000
                    AND TargetInstance.DeviceID='C:'"
    Register-WMIEvent -Query $query -Action {powershell c:\Temp\mailtome.ps1}
    

    Событие регистрируется, оповещения приходят. Одна вот проблема - работает это только в текущем сеансе. Стоит его закрыть и все - нет больше оповещений.

    Есть ли возможность сделать СРЕДСТВАМИ PoSH (WSH-скриптами и WMI-tool`ами я это делал) постоянного подписчика WMI-событий ?

    Можно конечно запускать по шедулеру скрипт, который будет смотреть сколько места осталось и кидать оповещения в случае шухера, но для саморазвития хочется сделать это именно через подписку.

    Я пытался таким вот образом зарегистрировать потребителя:

    http://social.technet.microsoft.com/Forums/ru-RU/scrlangru/thread/6b941949-a838-44da-a3a1-4188d45bf55b

    , но это к сожалению не работает (или что-то не так делаю).

     

     


    Andy Mishechkin
    17 декабря 2011 г. 10:06

Ответы

  • Может кому пригодится скрипт к задаче.

     

    function New-WMIEventSubscription
    { 
        [CmdLetBinding()] 
        Param( 
            $FilterName = 'FreeDiskSpaceSubscription', 
            $Query = 'SELECT * FROM __InstanceModificationEvent WITHIN 10
                    WHERE TargetInstance ISA "Win32_LogicalDisk"
                    AND TargetInstance.FreeSpace<524288000
                    AND TargetInstance.DeviceID="C:"', 
            $Command = "powershell -nologo -noprofile -file C:\script\clean.ps1", 
            $EventNameSpace = 'Root\Cimv2'
         ) 
     
        Write-Verbose "QUERY:$Query" 
        Write-Verbose "FilterName:$FilterName" 
        $FilterPath = Set-WmiInstance -Class __EventFilter -Namespace "root\subscription" `
            -Arguments @{ 
                Name = $FilterName; 
                EventNameSpace = $EventNameSpace; 
                QueryLanguage = "WQL"; 
                Query = $Query 
            } 
         
        Write-Verbose "Command:$Command" 
     
        $ConsumerPath = Set-WmiInstance -Namespace "root\subscription" `
    	-Class 'CommandLineEventConsumer' `
             -Arguments @{ 
                Name = $FilterName; 
                CommandLineTemplate = $Command
            } 
    	
    	Set-WmiInstance -Namespace "root\subscription" `
    	-Class __FilterToConsumerBinding `
            -Arguments @{ 
                Filter = $FilterPath; 
                Consumer = $ConsumerPath 
            } 
    } 
    
    

     


    • Изменено KazunEditor 19 декабря 2011 г. 14:54
    • Помечено в качестве ответа Andy Mishechkin 19 декабря 2011 г. 18:34
    19 декабря 2011 г. 14:54
    Отвечающий

Все ответы

  •  PowerShell - для этого есть модуль,для работы с WMI Event.

    Пример работы с модулем - http://blogs.technet.com/b/heyscriptingguy/archive/2010/12/08/use-a-powershell-module-to-work-with-wmi-permanent-events.aspx

    http://powerevents.codeplex.com/ -Сам модуль,документация и прочее.

    Так что,раз работали с WSH,то можно вызывать скриптом VB ,скрипт PowerShell.Я не вижу,какой особый плюс от WMI Event в данной задаче и почему бы просто не использовать PerfMon,который запустит скрипт на PowerShell.



    • Изменено KazunEditor 19 декабря 2011 г. 14:30 откорректировал неточность
    17 декабря 2011 г. 10:50
    Отвечающий
  • Может кому пригодится скрипт к задаче.

     

    function New-WMIEventSubscription
    { 
        [CmdLetBinding()] 
        Param( 
            $FilterName = 'FreeDiskSpaceSubscription', 
            $Query = 'SELECT * FROM __InstanceModificationEvent WITHIN 10
                    WHERE TargetInstance ISA "Win32_LogicalDisk"
                    AND TargetInstance.FreeSpace<524288000
                    AND TargetInstance.DeviceID="C:"', 
            $Command = "powershell -nologo -noprofile -file C:\script\clean.ps1", 
            $EventNameSpace = 'Root\Cimv2'
         ) 
     
        Write-Verbose "QUERY:$Query" 
        Write-Verbose "FilterName:$FilterName" 
        $FilterPath = Set-WmiInstance -Class __EventFilter -Namespace "root\subscription" `
            -Arguments @{ 
                Name = $FilterName; 
                EventNameSpace = $EventNameSpace; 
                QueryLanguage = "WQL"; 
                Query = $Query 
            } 
         
        Write-Verbose "Command:$Command" 
     
        $ConsumerPath = Set-WmiInstance -Namespace "root\subscription" `
    	-Class 'CommandLineEventConsumer' `
             -Arguments @{ 
                Name = $FilterName; 
                CommandLineTemplate = $Command
            } 
    	
    	Set-WmiInstance -Namespace "root\subscription" `
    	-Class __FilterToConsumerBinding `
            -Arguments @{ 
                Filter = $FilterPath; 
                Consumer = $ConsumerPath 
            } 
    } 
    
    

     


    • Изменено KazunEditor 19 декабря 2011 г. 14:54
    • Помечено в качестве ответа Andy Mishechkin 19 декабря 2011 г. 18:34
    19 декабря 2011 г. 14:54
    Отвечающий
  • Ну тогда уж добъем и эту вот задачу годовой давности: http://social.technet.microsoft.com/Forums/ru-RU/scrlangru/thread/6b941949-a838-44da-a3a1-4188d45bf55b

    $FilterName = 'MonitoringServices'
    $ConsumerName = 'ServiceLog'
    $Query = 'SELECT * FROM __InstanceModificationEvent WITHIN 1 WHERE TargetInstance ISA "Win32_Service"' 
    $File = 'C:\Temp\LogService.txt'
    $Text = 'Service %TargetInstance.DisplayName% will %TargetInstance.State%'
    $EventNameSpace = 'Root\Cimv2'
     
    $FilterPath = Set-WmiInstance -Class __EventFilter -Namespace "root\subscription" `
        -Arguments @{ Name = $FilterName; EventNameSpace = $EventNameSpace; QueryLanguage = "WQL"; Query = $Query } 
    $ConsumerPath = Set-WmiInstance -Class 'LogFileEventConsumer' -Namespace "root\subscription" `
        -Arguments @{ Name = $ConsumeName; FileName = $File; Text = $Text } 
    	
    Set-WmiInstance -Namespace "root\subscription" -Class __FilterToConsumerBinding `
        -Arguments @{ Filter = $FilterPath; Consumer = $ConsumerPath }
    

    Эх..., жалко что нет столько времени на скрипты как у Kazun'а


    Andy Mishechkin
    19 декабря 2011 г. 18:36