Samples/Test-PowerEvents.ps1
# Test WMI Query: select * from __InstanceOperationsEvent where TargetInstance ISA 'Win32_Process' Clear-Host # Enable verbose messages to be written to console output $VerbosePreference = 'Continue' $DebugPreference = 'Continue' #region Get script path #$MyInvocation.MyCommand.Path ${ScriptPath} = Split-Path $MyInvocation.MyCommand.Path # Write-Verbose -Message "Script path is: ${ScriptPath}" #endregion #region Import WMI Event Management module if (-not (Get-Module 'WMI Event Management')) { Remove-Module -Name 'WMI Event Management' } else { Import-Module -Name 'WMI Event Management' } #endregion Import WMI Event Management module #region Create VBscript responder for ActiveScriptEventConsumer # All this VBscript does is log some text to "c:\temp\vboutput.log" $VBResponderText = @" Option Explicit dim fso, logfile, logpath, sh set sh = CreateObject("Wscript.Shell") '*** Log an event to the application event log call sh.LogEvent(0, "Script executed at: " & Time()) logpath = "c:\temp\vboutput.log" set fso = CreateObject("Scripting.FileSystemObject") 'if fso.FileExists(logpath) then call fso.DeleteFile(logpath, true) set logfile = fso.OpenTextFile(logpath, 8, true) call logfile.WriteLine(Date() & Time()) '*** Release object handles set fso = nothing set logfile = nothing "@ # Create VBscript responder file (aka. event handler script) [void] (New-Item -ItemType Directory -Path c:\temp -Force) [void] (New-Item -ItemType Directory -Path c:\temp\resources -Force) [void] (New-Item -ItemType File -Path c:\temp\resources\Responder.vbs -Force) Remove-Item -Path 'c:\temp\Resources\Responder.vbs' Set-Content -Path 'c:\temp\Resources\Responder.vbs' -Value $VBResponderText -Force #endregion #region Clean up WMI stuff <# Get-WmiObject ActiveScriptEventConsumer -Namespace root\default | Remove-WmiObject Get-WmiObject CommandLineEventConsumer -Namespace root\default | Remove-WmiObject Get-WmiObject ActiveScriptEventConsumer -Namespace root\subscription | Remove-WmiObject Get-WmiObject CommandLineEventConsumer -Namespace root\subscription | Remove-WmiObject Get-WmiObject __EventFilter -Namespace root\default | Remove-WmiObject Get-WmiObject __EventFilter -Namespace root\cimv2 | Remove-WmiObject Get-WmiObject __FilterToConsumerBinding -Namespace root\default | Remove-WmiObject Get-WmiObject __FilterToConsumerBinding -Namespace root\cimv2 | Remove-WmiObject #> #endregion #region Perform event monitoring for WMI event consumers <# Get-EventSubscriber | Unregister-Event Register-WmiEvent -Namespace root\cimv2 -Class __EventDroppedEvent -Action { Write-Host "Event dropped in root\cimv2" } Register-WmiEvent -Namespace root\cimv2 -Class __EventQueueOverflowEvent -Action { Write-Host "Event dropped in root\cimv2" } Register-WmiEvent -Namespace root\default -Class __EventDroppedEvent -Action { Write-Host "Event dropped in root\cimv2" } Register-WmiEvent -Namespace root\default -Class __EventQueueOverflowEvent -Action { Write-Host "Event dropped in root\cimv2" } Register-WmiEvent -Namespace root\subscription -Class __ConsumerFailureEvent -Action { Write-Host "Consumer failed" } #> #endregion #region Test creation of event consumer # TEST: Create script consumer with both ${ScriptFile} and ${ScriptText} defined (should not work) # RESULT (11.02.10): Added some parameter validation code that ensures validation will fail if both parameters ${ScriptFile} and ${ScriptText} are defined. $ScriptConsumer = New-WmiEventConsumer -Consumer Script -ScriptFile 'c:\temp\Resources\Responder.vbs' -ScriptText 'set fso = CreateObject("Scripting.FileSystemObject")' -Name TestConsumer # TEST: Create script consumer from script text # RESULT (11.02.10): Works as expected, but did not validate that it responds correctly when bound to an event filter $ScriptConsumer = New-WmiEventConsumer -Consumer Script -ScriptText $VBResponderText -Name TestConsumer # TEST: Create script consumer with neither ${ScriptFile} or ${ScriptText} defined # RESULT (11.02.10): Fails with "parameter set cannot be resolved" $ScriptConsumer = New-WmiEventConsumer -Consumer Script -ScriptingEngine VBscript -Name TestConsumer # TEST: Create script consumer from script file $ScriptConsumer = New-WmiEventConsumer -Consumer Script -ScriptFile 'c:\temp\Resources\Responder.vbs' -Name TestConsumer # Create SMTP consumer $SmtpConsumer = New-WmiEventConsumer -ConsumerType SMTP -Name TestConsumer -SMTPServer 'localhost' -FromLine 'notifications@test.loc' -Subject 'WMI Notification' -Message '%TargetInstance.Name%' -ToLine 'trevor@test.loc' # Create log file event consumer $LogFileConsumer = New-WmiEventConsumer -ConsumerType LogFile -Name TestConsumer -Text 'Process started: %TargetInstance.Name% at %TIME_CREATED%' -FileName c:\temp\LogFileOutput.log # Create command line consumer $CliConsumer = New-WmiEventConsumer -ConsumerType 'CommandLine' -Name TestConsumer -ExecutablePath 'cmd.exe /c ipconfig >> c:\temp\clioutput.log' # Create NT Event Log consumer $EventLogConsumer = New-WmiEventConsumer -ConsumerType EventLog -Name TestConsumer -InsertionStringTemplates 'New instance created: %TargetInstance.__PATH%' -EventId 10 -EventType Information -Category 10 -UNCServerName localhost #endregion Test creation of event consumer #region Test creation of event filter # Test filter creation with computer name $Filter = New-WmiEventFilter -ComputerName 'gaming' -Name TestFilter -EventNamespace root\cimv2 -Query "select * from __InstanceCreationEvent WITHIN 5 where TargetInstance ISA 'Win32_Process'" # Test filter creation without computer name $Filter = New-WmiEventFilter -Name TestFilter -EventNamespace root\cimv2 -Query "select * from __InstanceCreationEvent WITHIN 5 where TargetInstance ISA 'Win32_Process'" #endregion Test creation of event filter #region Test creation of Filter-To-Consumer bindings # New-WmiFilterToConsumerBinding -Consumer $CliConsumer -Filter $Filter # New-WmiFilterToConsumerBinding -Consumer $ScriptConsumer -Filter $Filter # New-WmiFilterToConsumerBinding -Consumer $SmtpConsumer -Filter $Filter New-WmiFilterToConsumerBinding -Consumer $LogFileConsumer -Filter $Filter #endregion Test creation of Filter-To-Consumer bindings exit # Comment this line to enable clean up # **************** RUN THIS SECTION OF THE SCRIPT TO CLEAN UP WMI EVENT INSTANCES **************** # **************** RUN THIS SECTION OF THE SCRIPT TO CLEAN UP WMI EVENT INSTANCES **************** # **************** RUN THIS SECTION OF THE SCRIPT TO CLEAN UP WMI EVENT INSTANCES **************** # Clean up consumer instances Remove-WmiObject -Path "root\subscription:ActiveScriptEventConsumer.Name='TestConsumer'" Remove-WmiObject -Path "root\subscription:SMTPEventConsumer.Name='TestConsumer'" Remove-WmiObject -Path "root\subscription:LogFileEventConsumer.Name='TestConsumer'" Remove-WmiObject -Path "root\subscription:NTEventLogEventConsumer.Name='TestConsumer'" Remove-WmiObject -Path "root\subscription:CommandLineEventConsumer.Name='TestConsumer'" # Clean up __EventFilter instances Get-WmiObject -Namespace root\subscription -Query "select * from __EventFilter where Name like '%Test%'" | Remove-WmiObject # Clean up test bindings Get-WmiObject -Namespace root\subscription -Class __FilterToConsumerBinding | ? { $_.Consumer -like '*TestConsumer*' } | Remove-WmiObject |