{"id":8651,"date":"2007-01-28T17:52:00","date_gmt":"2007-01-28T17:52:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/powershell\/2007\/01\/28\/working-with-wmi-events\/"},"modified":"2019-02-18T13:20:48","modified_gmt":"2019-02-18T20:20:48","slug":"working-with-wmi-events","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/powershell\/working-with-wmi-events\/","title":{"rendered":"Working With WMI Events"},"content":{"rendered":"<p>PowerShell V1 does not provide native support for WMI events. That doesn&#8217;t mean that you can&#8217;t use WMI events with PowerShell, it just means that you need to leverage the .NET classes to do so. This falls into the category of &#8220;to ship is to choose&#8221;. Here is a function that you can use to work with WMI events. This function takes a WMI class name (and optionally a path to a namespace [it defaults to root\\cimv2]) and gets the events until you enter ESCAPE or &#8216;q&#8217; at the keyboard. <\/p>\n<p><span>Function Get-WmiEvent ($class, $Path=&#8221;root\\cimv2&#8243;)<br \/>{<br \/>$ESCkey = 27<br \/>$Qkey = 81<\/p>\n<p>$query = New-Object System.Management.WQlEventQuery &#8220;Select * from $class&#8221;<br \/>$scope = New-Object System.Management.ManagementScope $Path<br \/>$watcher = New-Object System.Management.ManagementEventWatcher $scope,$query<br \/>$options = New-Object System.Management.EventWatcherOptions <br \/>$options.TimeOut = [timespan]&#8221;0.0:0:1&#8243;<br \/>$watcher.Options = $Options<br \/>$watcher.Start()<br \/>while ($true) {<br \/>trap [System.Management.ManagementException] {continue}<br \/>$watcher.WaitForNextEvent()<br \/>if ($host.ui.RawUi.KeyAvailable)<br \/>{ $key = $host.ui.RawUI.ReadKey(&#8220;NoEcho,IncludeKeyUp&#8221;)<br \/>if (($key.VirtualKeyCode -eq $ESCkey) -OR ($key.VirtualKeyCode -eq $Qkey)) <br \/>{ $watcher.Stop()<br \/>break<br \/>}<br \/>}<br \/>}<br \/>}<\/p>\n<p>Set-Alias gwe Get-WmiEvent<br \/><\/span><\/p>\n<p>NOTE: This function is available as an attachement below.<\/p>\n<p>From here you might ask yourself the question: OK but what are the WMI Events? You might think that Events follow the naming patter: WMI*EVENT. Sadly, you&#8217;d be wrong. Here is how you find all the WMI events in a particular namespace: <\/p>\n<p><span>PS&gt; Get-WmiObject -list -namespace root\\cimv2 |<br \/>&gt;&gt; where {$_.__Derivation -contains &#8220;__EVENT&#8221;}<br \/>&gt;&gt;<\/p>\n<p>__NamespaceOperationEvent __NamespaceModificationEvent<br \/>__NamespaceDeletionEvent __NamespaceCreationEvent<br \/>__ClassOperationEvent __ClassDeletionEvent<br \/>__ClassModificationEvent __ClassCreationEvent<br \/>__InstanceOperationEvent __InstanceCreationEvent<br \/>__MethodInvocationEvent __InstanceModificationEvent<br \/>__InstanceDeletionEvent __TimerEvent<br \/>__ExtrinsicEvent __SystemEvent<br \/>__EventDroppedEvent __EventQueueOverflowEvent<br \/>__QOSFailureEvent __ConsumerFailureEvent<br \/>MSFT_SCMEvent MSFT_SCMEventLogEvent<br \/>MSFT_NetSevereServiceFailed MSFT_NetTransactInvalid<br \/>MSFT_NetServiceNotInteractive MSFT_NetTakeOwnership<br \/>MSFT_NetServiceConfigBackoutFailed MSFT_NetServiceShutdownFailed<br \/>MSFT_NetServiceStartHung MSFT_NetServiceStopControlSuccess<br \/>MSFT_NetServiceSlowStartup MSFT_NetCallToFunctionFailed<br \/>MSFT_NetBadAccount MSFT_NetBadServiceState<br \/>MSFT_NetConnectionTimeout MSFT_NetCircularDependencyAuto<br \/>MSFT_NetServiceStartTypeChanged MSFT_NetServiceLogonTypeNotGranted<br \/>MSFT_NetServiceStartFailedGroup MSFT_NetDependOnLaterService<br \/>MSFT_NetFirstLogonFailedII MSFT_NetServiceDifferentPIDConnected<br \/>MSFT_NetServiceCrashNoAction MSFT_NetCircularDependencyDemand<br \/>MSFT_NetServiceExitFailed MSFT_NetServiceStartFailedII<br \/>MSFT_NetServiceExitFailedSpecific MSFT_NetBootSystemDriversFailed<br \/>MSFT_NetInvalidDriverDependency MSFT_NetServiceCrash<br \/>MSFT_NetServiceRecoveryFailed MSFT_NetServiceStatusSuccess<br \/>MSFT_NetTransactTimeout MSFT_NetFirstLogonFailed<br \/>MSFT_NetServiceControlSuccess MSFT_NetServiceStartFailed<br \/>MSFT_NetServiceStartFailedNone MSFT_NetReadfileTimeout<br \/>MSFT_NetRevertedToLastKnownGood MSFT_NetCallToFunctionFailedII<br \/>MSFT_NetDependOnLaterGroup MSFT_WmiSelfEvent<br \/>MSFT_WmiEssEvent MSFT_WmiThreadPoolEvent<br \/>MSFT_WmiThreadPoolThreadCreated MSFT_WmiThreadPoolThreadDeleted<br \/>MSFT_WmiRegisterNotificationSink MSFT_WmiFilterEvent<br \/>MSFT_WmiFilterDeactivated MSFT_WmiFilterActivated<br \/>MSFT_WmiCancelNotificationSink MSFT_WmiProviderEvent<br \/>MSFT_WmiConsumerProviderEvent MSFT_WmiConsumerProviderSinkLoaded<br \/>MSFT_WmiConsumerProviderSinkUnloaded MSFT_WmiConsumerProviderUnloaded<br \/>MSFT_WmiConsumerProviderLoaded Msft_WmiProvider_OperationEvent<br \/>Msft_WmiProvider_ComServerLoadOper&#8230; Msft_WmiProvider_OperationEvent_Post<br \/>Msft_WmiProvider_PutInstanceAsyncE&#8230; Msft_WmiProvider_CreateInstanceEnu&#8230;<br \/>Msft_WmiProvider_DeleteInstanceAsy&#8230; Msft_WmiProvider_CancelQuery_Post<br \/>Msft_WmiProvider_NewQuery_Post Msft_WmiProvider_ProvideEvents_Post<br \/>Msft_WmiProvider_ExecQueryAsyncEve&#8230; Msft_WmiProvider_AccessCheck_Post<br \/>Msft_WmiProvider_CreateClassEnumAs&#8230; Msft_WmiProvider_DeleteClassAsyncE&#8230;<br \/>Msft_WmiProvider_ExecMethodAsyncEv&#8230; Msft_WmiProvider_GetObjectAsyncEve&#8230;<br \/>Msft_WmiProvider_PutClassAsyncEven&#8230; Msft_WmiProvider_InitializationOpe&#8230;<br \/>Msft_WmiProvider_InitializationOpe&#8230; Msft_WmiProvider_LoadOperationFail&#8230;<br \/>Msft_WmiProvider_ComServerLoadOper&#8230; Msft_WmiProvider_UnLoadOperationEvent<br \/>Msft_WmiProvider_LoadOperationEvent Msft_WmiProvider_OperationEvent_Pre<br \/>Msft_WmiProvider_DeleteInstanceAsy&#8230; Msft_WmiProvider_AccessCheck_Pre<br \/>Msft_WmiProvider_ExecQueryAsyncEve&#8230; Msft_WmiProvider_DeleteClassAsyncE&#8230;<br \/>Msft_WmiProvider_NewQuery_Pre Msft_WmiProvider_PutInstanceAsyncE&#8230;<br \/>Msft_WmiProvider_CreateClassEnumAs&#8230; Msft_WmiProvider_ExecMethodAsyncEv&#8230;<br \/>Msft_WmiProvider_ProvideEvents_Pre Msft_WmiProvider_CancelQuery_Pre<br \/>Msft_WmiProvider_PutClassAsyncEven&#8230; Msft_WmiProvider_GetObjectAsyncEve&#8230;<br \/>Msft_WmiProvider_CreateInstanceEnu&#8230; MSFT_WMI_GenericNonCOMEvent<br \/>Win32_ComputerSystemEvent Win32_ComputerShutdownEvent<br \/>Win32_IP4RouteTableEvent MSFT_NCProvEvent<br \/>MSFT_NCProvCancelQuery MSFT_NCProvClientConnected<br \/>MSFT_NCProvNewQuery MSFT_NCProvAccessCheck<br \/>RegistryEvent RegistryKeyChangeEvent<br \/>RegistryTreeChangeEvent RegistryValueChangeEvent<br \/>Win32_SystemTrace Win32_ProcessTrace<br \/>Win32_ProcessStartTrace Win32_ProcessStopTrace<br \/>Win32_ModuleTrace Win32_ModuleLoadTrace<br \/>Win32_ThreadTrace Win32_ThreadStartTrace<br \/>Win32_ThreadStopTrace Win32_PowerManagementEvent<br \/>Win32_DeviceChangeEvent Win32_SystemConfigurationChangeEvent<br \/>Win32_VolumeChangeEvent<\/p>\n<p>PS&gt;<br \/><\/span><\/p>\n<p>Here is an example of it working (I run this for a while and then type ESC): <\/p>\n<p><span>PS&gt; gwe Win32_ProcessStopTrace |ft ProcessName,Processid -auto<\/p>\n<p>ProcessName Processid<br \/>&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;<br \/>HOSTNAME.EXE 4788<br \/>ipconfig.exe 4664<br \/>notepad.exe 3980<br \/>calc.exe 3816<br \/><\/span><\/p>\n<p>I hope you find this useful. <\/p>\n<p>Cheers! <\/p>\n<p>Jeffrey Snover [MSFT]<br \/>Windows PowerShell\/MMC Architect<br \/>Visit the Windows PowerShell Team blog at: <a href=\"http:\/\/blogs.msdn.com\/PowerShell\">http:\/\/blogs.msdn.com\/PowerShell<\/a><br \/>Visit the Windows PowerShell ScriptCenter at: http:\/\/www.microsoft.com\/technet\/scriptcenter\/hubs\/msh.mspx<\/p>\n<p><a href=\"https:\/\/msdnshared.blob.core.windows.net\/media\/MSDNBlogsFS\/prod.evol.blogs.msdn.com\/CommunityServer.Components.PostAttachments\/00\/01\/54\/85\/07\/get-wmievent.ps1\">get-wmievent.ps1<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>PowerShell V1 does not provide native support for WMI events. That doesn&#8217;t mean that you can&#8217;t use WMI events with PowerShell, it just means that you need to leverage the .NET classes to do so. This falls into the category of &#8220;to ship is to choose&#8221;. Here is a function that you can use to [&hellip;]<\/p>\n","protected":false},"author":600,"featured_media":13641,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-8651","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-powershell"],"acf":[],"blog_post_summary":"<p>PowerShell V1 does not provide native support for WMI events. That doesn&#8217;t mean that you can&#8217;t use WMI events with PowerShell, it just means that you need to leverage the .NET classes to do so. This falls into the category of &#8220;to ship is to choose&#8221;. Here is a function that you can use to [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/posts\/8651","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/users\/600"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/comments?post=8651"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/posts\/8651\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/media\/13641"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/media?parent=8651"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/categories?post=8651"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/tags?post=8651"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}