You are on page 1of 56

WMI

W Qu
uery
y L
Langguaagee
viaa Pow
werSSheell
Ravika
anth Cha
aganti

Explore basics
b
of WM
MI Query Laanguage, diffferent types of WMI quueries, and leearn how
PowerSh
hell can be ussed to retriev
ve WMI man
nagement innformation uusing WQL.

Table of Contents
Introduction .................................................................................................................................................. 5 
Introducing WMI Query Language ............................................................................................................ 5 
WMI Query Types ..................................................................................................................................... 6 
Data Queries ......................................................................................................................................... 6 
Event Queries ........................................................................................................................................ 6 
Schema Queries .................................................................................................................................... 7 
WQL Keywords .......................................................................................................................................... 7 
WQL Operators ......................................................................................................................................... 8 
Tools for the job .......................................................................................................................................... 10 
WBEMTEST .............................................................................................................................................. 10 
WMI Administrative Tools ...................................................................................................................... 12 
[WMISEARCHER] type accelerator .......................................................................................................... 14 
PowerShell WMI cmdlets ........................................................................................................................ 15 
WMI Data Queries ...................................................................................................................................... 16 
SELECT, FROM, and WHERE .................................................................................................................... 16 
Using Operators .................................................................................................................................. 17 
Associators Of ......................................................................................................................................... 20 
ClassDefsOnly ...................................................................................................................................... 22 
AssocClass ........................................................................................................................................... 23 
ResultClass .......................................................................................................................................... 23 
ResultRole ........................................................................................................................................... 23 
Role ..................................................................................................................................................... 27 
RequiredQualifier and RequiredAssocQualifier .................................................................................. 27 
References Of .......................................................................................................................................... 28 
WMI Event Queries: Introduction ............................................................................................................... 30 
Event Query Types .................................................................................................................................. 32 
Intrinsic Events .................................................................................................................................... 32 
Extrinsic Events ................................................................................................................................... 32 
Timer Events ....................................................................................................................................... 32 
WQL Syntax for event queries ................................................................................................................ 33 
WITHIN ................................................................................................................................................ 33 
[1] 
 

GROUP................................................................................................................................................. 34 
HAVING ............................................................................................................................................... 35 
BY ........................................................................................................................................................ 35 
Intrinsic Event Queries ................................................................................................................................ 37 
__InstanceCreationEvent ........................................................................................................................ 38 
__InstanceDeletionEvent ........................................................................................................................ 38 
__InstanceModificationEvent ................................................................................................................. 38 
Extrinsic Event Queries ............................................................................................................................... 42 
Monitoring registry value change events ............................................................................................... 42 
Monitoring registry key change events .................................................................................................. 43 
Monitoring registry tree change events ................................................................................................. 44 
Timer Events ............................................................................................................................................... 45 
WMI Schema Queries ................................................................................................................................. 48 
Using __this ............................................................................................................................................. 49 
Using __Class........................................................................................................................................... 49 
WMI Event Consumers ............................................................................................................................... 50 
Temporary Event consumers .................................................................................................................. 50 
Permanent Event consumers .................................................................................................................. 50 
Creating an event filter ....................................................................................................................... 52 
Creating a logical consumer ................................................................................................................ 52 
Binding Event Filter and Consumer ..................................................................................................... 53 
Introducing PowerEvents ........................................................................................................................ 53 
Creating an event filter ....................................................................................................................... 54 
Creating an event consumer ............................................................................................................... 54 
Binding Event filter and consumer ...................................................................................................... 54 

[2] 
 

This book is dedicated to Andrew Tearle, the most
passionate PowerSheller and a good friend.
Rest in peace Andy.

[3] 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Acknowledgements 
I would like to thank Shay Levy (MVP), Philip LaVoie, and Robert Robelo for providing their 
feedback. Their feedback really helped shape the ebook and include extra content that was not 
planned initially. Also, thanks to everyone who read my blog posts on WMI query language and 
provided feedback. Your encouragement and support helped me write quite a bit about WQL 
and now this e‐book. 
[4] 
 

 for example. which is aan industry innitiative to d develop a staandard  technolo ogy for accesssing manage ement information in ann enterprise environmen nt.In ntrod ductio on Windowss Manageme ent instrume entation (WM MI) is Microsoft’s implementation o of Web Baseed  Enterprisse Managem ment (WBEM M).  we shall use Get‐WM MIObject and d Register‐W WMIEvent onnly. Yo ou can use an n alternative e approach b by specifyingg ‐Query parrameter insttead of ‐classs. We can wrrite WMI scrripts to auto omate severaal  tasks on local or rem mote computter(s).   #This example use es -Query parameter and speci fies the q query using WQL Get-WmiObject -Qu uery "SELECT * FROM Win32_Log icalDisk W WHERE Driv veType=3" Introducing WMI Q Query La anguage e The abovve example u uses WMI Query Languaage to get thhe same info ormation as tthe earlier  example but a bit fasster.  gets the instance(s) o of a WMI claass. if w we need to list out all driives of type 3  (disk drivves) in a systtem.    etrieve the m managemen nt data exposed by WMI.  Get-WmiObject -C Class Win3 32_LogicalDisk | Wh here-Objec ct { $_. CIM M is develop ped and main ntained by tthe  Distributed Managem ment Task Fo orce (DMTF)). So. and other maanaged comp ponents. We  Windowss PowerShell has a few ccmdlets to re can list th hese cmdletts by using:  #Use Get-Command and mention WMI* as s the Noun Get-Command -Noun n WMI* There are e five cmdlets that are u used to workk with WMI. app plications.  networkss. WMI usees the  Common n Information Model (CIM M) industry standard to  represent ssystems. w within the scope of this b book. This can take a while depending o on how man ny instances are  there. However.DriveType e -eq 3 } bove method d. we retrievve all instancces of Win322_LogicalDisk and then p pass it to Wh here‐ In the ab Object to o filter out w what we need d. devices. We can n verify this u using Measuure‐Commannd cmdlet. in itts basic usagge. Get‐WMIObject.  Let us see this in actiion:    [5]    .

 we used three variations of Get‐WMIObject to do the same job of  retrieving all instances of Win32_LogicalDisk where the DriveType is 3 (a disk drive). Data Queries  2.In the above example. using these  queries.  Note  ‐Filter.  REFERENCES OF. as we shall see in next chapters. WQL becomes a necessity.  WMI Query Types WMI supports three types of queries:  1. sometimes. the value of        ‐ Filter represents the value of a WHERE clause when using ‐Query parameter. Using this cmdlet. The WQL keywords such as SELECT. In fact.  So. what is WQL?  The WMI Query Language is a subset of the American National Standards Institute Structured  Query Language (ANSI SQL)—with minor semantic changes. For example.  [6]    .  The above example is very basic and may not really explain the usefulness of WQL — the speed  of execution is just one benefit. ASSOCIATORS OF. The earlier example. And. and ISA are used in data queries. From the  output. we can create  WMI event consumers and invoke an action when the event gets triggered. we can see that using ‐Query and ‐Filter are the fastest ways to retrieve the WMI  information. and WITHIN are used when creating  event queries. Data queries are used to retrieve class instances and data  associations. WQL has a set of  keywords & operators and supports three types of queries. is a data query. We shall see more  on this in the subsequent sections. The event queries are critical when we want use PowerShell cmdlets such as  Register‐WMIEvent for creating temporary event consumers. Get‐WMIObejct cmdlet internally builds the WMI query as required. is a variation of ‐Query. We shall see each of these benefits as we proceed  further. HAVING. Similar to SQL. where we queried for all instances of Win32_LogicalDisk  where the driveType is 4. such as working  with WMI events. Schema Queries  Data Queries This type is the simplest form of querying for WMI data and the most commonly used query  type when working with WMI. There are quite a few advanced querying techniques that can  be used to retrieve WMI information in an efficient manner. When  using ‐Filter. The WQL keywords such as GROUP.  Event Queries The event queries are used to create WMI event subscriptions. we can create an event subscription to notify whenever a USB drive gets attached to  the system. Event Queries  3.

 WQL  has 19 keywords to perform these queries against WMI repositories.  Also. The following table lists all the WQL keywords and lists the query type in which they can  be used. WQL queries use keywords to retrieve data from the management objects.  Keyword    AND  Query Type  Description  Data  Schema  Event    X    X  Combines two Boolean expressions.  IS  X    X  Comparison operator used with NOT and NULL. Windows  Management Instrumentation (WMI) supports  data queries from only one class at a time. and  ISA are used in schema queries and of course. Even though there are 19  WQL keywords.  WQL Keywords Similar to SQL. The WQL keywords such as SELECT. Schema queries return a result set of class definition objects rather than actual  instances of classes. REFERENCES OF. we cannot query  for all instances of a specified class residing in all of the namespaces on the target computer. Using WQL.  WMI does not support cross‐namespace queries or associations.  FROM  X  X  X  Specifies the class that contains the properties  listed in a SELECT statement. In layman’s terms. There are no keywords such as INSERT or UPDATE.  The syntax for this statement is the following:  IS [NOT] NULL (where NOT is optional)  ISA  X  X  X  Operator that applies a query to the subclasses of  a specified class  [7]    .  __CLASS  X  X    References the class of the object in a query. WQL queries are read‐only. in a slightly different way than how data queries  use these keywords.Schema Queries Schema queries are used to retrieve class definitions (rather than class instances) and schema  associations.  HAVING      X  Filters the events that are received during the  grouping interval that is specified in the WITHIN  clause. only a few of them can be used all three possible query types we discussed  earlier. Using WQL. these queries are used to get information about WMI and its  structure.  ASSOCIATORS OF  X  X    Retrieves all instances that are associated with a  source instance.  we cannot modify the WMI objects. Use this statement with schema  queries and data queries. ASSOCIATORS OF.  GROUP      X  Causes WMI to generate one notification to  represent a group of events. and returns  TRUE when both expressions are TRUE.

 NULL is not equivalent to zero (0)  or blank. This  reduces the overhead of the call.  Operator  =  <  >  <=  >=  != or <>  Description  Equal to  Less than  Greater than  Less than or equal  to  Greater than or  equal to  Not equal to  [8]    .  Retrieves all association instances that refer to a  specific source instance.  We shall look at each of these keywords when we start discussing different types of WMI  queries in‐depth. the OR  operators are evaluated after the AND operators. event.KEYSONLY  X      LIKE  X      NOT  X      NULL  X      OR  X      REFERENCES OF  X  X    SELECT  TRUE  WHERE  X  X  X  X    X  X  X  X  WITHIN  FALSE    X    X  X  X  Used in REFERENCES OF and ASSOCIATORS OF  queries to ensure that the resulting instances are  only populated with the keys of the instances.  Narrows the scope of a data. When more than one  logical operator is used in a statement. it does not retrieve endpoint  instances. it retrieves the association instances.  Boolean operator that evaluates to 0 (zero).  Comparison operator that use in a WQL SELECT  query  Indicates an object does not have an explicitly  assigned value.  Specifies polling or grouping interval.  Boolean operator that evaluates to ‐1 (minus one). WQL uses the same set. The following table lists all the  operators supported in WQL.  Combines two conditions. or schema  query.  Specifies the properties that are used in a query. The REFERENCES OF  statement is similar to the ASSOCIATORS OF  statement.  WQL Operators Similar to arithmetic operators. However.  Operator that determines whether or not a given  character string matches a specified pattern.

 there is a detailed discussion on how to use these operators in the upcoming  sections.  Once again. 1 LIKE operator is not available in Windows 2000 [9]    . ISA. and LIKE1 can also be considered as operators. IS and IS NOT operators are valid in the WHERE clause only if the constant is  NULL.A few WQL keywords such as IS. NOT. In  these keywords.

 w we looked att what is WQ QL.exe is pre esent on eve ery compute er that has W WMI installed d. and WQL  keywords & operators. This tool p provides a great  way to exxplore WMI classes and instances. Before w we dig deep in to this subbject. Hoowever.exe” and d Press Enterr.exe.  Click Starrt‐> Run. Th his includes   WBEMTest. TThis was initiially develop ped to test W WMI COM API  and hencce can do evverything you u can achievve using WM MI.Toolss for the jo ob In the firsst chapter. typ pe “WBEMTe est.ex W xe   WMI tools  W  [W WMISEARCH HER] type accelerator in PowerShell  PowerShell W WMI cmdletss  ections. we shaall look at different toolss  e to execute WMI querie es. restt of the chap pters in this b book  will focuss only on WM MI PowerShell cmdlets aand refer to other tools only when rrequired.   available There are e several too ols that can be used to e execute WM MI queries. differentt types of WM MI queries.  WBEM MTEST WBEMTe est. we sshall look at each of the above menttioned tools in detail and see  In the subsequent se how WM MI queries can be executed using the ese tools. This should d open a GU UI window similar  to what is shown below:  [10]    .     To open WBEMTest.

  Assumingg you have tthe necessarry permissions to accesss root\cimv22 namespacee. The lasst part is what we are interested in.Now. creating instances. just click  “Connectt”. we can connecct to a WMI n namespace using the “C Connect” buttton at the ttop. [11]    . w we can perfo orm several  actions such as enum merating classses. and also execu uting  WMI que eries.  executing m methods. Once we are connectted to the ro oot\cimv2 naamespace.

In the ab bove window w. The “Q Query” optio on can be use ed for WMI Data and schema queriees. we sh hall now loo ok at how we e can executte simple datta queries and save the  notificatiion queries p part for a latter part of th his book.  WMI Adminiistrativ ve Toolss WMI adm ministrative tools can be e used to view and edit W WMI classess.  he WBEMTest window. managge  WMI objects. registe er and receivve WMI even nts. This is it. WMI Object b W browser  3. eenter a WQLL statement as shown above  Click on tthe “Query” button in th and click “Apply”. W WBEMTest is an  expert to ool and is a ggreat tool to explore WM MI interfacess. properties. qualifiers aand  instancess in a WMI repository. WMI CIM Stu W udio  2.    As an exaample.  The querry result window shows all instancess of Win32_PProcess classs. And.  “Notification Query” can be used d for runningg WMI event queries. WMI Event re W egistration  [12]    . You can also use these toools to invokke WMI methods. we can use e the “Queryy” and “Not ification Queery” optionss to execute  WMI que eries. The freee WMI tools download p package inclu udes   1.

  Once the e WMI tools are installed d. WMI Too ols do not  su upport executing WMI e event querie es.com/dow wnloads/en/d details. click on  another w window as sshown here:   icon at th e top‐right ccorner. WMI Event vi W iewer  These tools can be downloaded from  http://ww ww.aspx??FamilyID=66430f853‐1120‐48db‐8ccc5‐ f2abdc3e ed314  Note  N WMI CIM Stu W udio can be u used to execcute data/schhema queriees.microso oft. This brings up  [13]    . TThis promptss for the WM MI namespacce selection and credentials.   In the ressulting brow wser window w. open WMI CIM studioo by selecting Start ‐> All Programs ‐‐>  WMI Too ols ‐> WMI C CIM Studio.4.

  [WMIISEARCHER] ty ype acce elerator Windowss PowerShell provides sh hortcuts to aallow direct access to .    pe accelerattor  D Description  WMI typ [WMI]  Retrievve single insttance of a W WMI class. These e are.N NET namespaaces.    [WMISEA ARCHER] is aa shortcut for System. In nvoke the Ge et() method to execute tthe WMI qu ery. The WMI toolss are used fo or many otheer purposes than just exxecuting WM MI  queries.mic h crosoft.http://msdn.  Type ‘Sellect * from W This show ws all the insstances of W Win32_Proceess class.Maanagement.  [WMISEA ARCHER]  Searchh for WMI ob bjects    Within th he scope of tthis book.aspx [14]    . TThese tools are also a grreat way to e explore and  learn aboutt WMI.Managemen ntObjectSeaarcher2 .  [WMICLA ASS]  Accesss static propeerties and m methods of a  WMI c lass.Win32_Proceess’ (withoutt quotes) in the query teextbox and cclick “Executte”. There e are three tyype acceleraators to acceess WMI  managem ment namespaces.  1.NET  namespaace. Provide a WQ 2. These  shortcutss are called ttype accelerrators. w we are more interested inn how [WMIISEARCHER] type accelerator  can be ussed to run W WMI queries.com/en--us/library/z0zzx1aya. The wayy we use thiss type accele erator is:    QL statement. Sim milarly. we caan execute sschema querries  using CIM M Studio.  2 Managem mentObjectSearrcher Class .

 we are using the [WMISEARCHER] shortcut to get a list of all services  in “running” state.com/ [15]    . These options are not available in the  built‐in WMI cmdlets method.sapien.   Register-WmiEvent -Query "Select * from __InstanceCreationEvent WITHIN 10 WHERE TargetInstance ISA 'Win32_Process'" -Action {Write-Host "New process created"} The above query will display a message.microsoft. timeout. every time a new process gets  created on the system. For example.    We have seen several examples using Get‐WMIObject already. Get‐ WMIObject can be used for data/schema queries while Register‐WMIEvent can be used for  triggering event queries. the scope of the query is set to root\cimv2 namespace. Within these five  cmdlets. MoW’s WMI Explorer PowerShell script.  $svcs = [WmiSearcher]"Select * from Win32_Service where State='Running'" $svcs.0 includes five WMI cmdlets. By default.   We can use [WMISEARCHER] for some quick access to WMI information but it gets quite  verbose soon.  PowerShell WMI cmdlets As mentioned in the first chapter.Simple. we can set some  extended properties3 such as blocksize. here is a quick example of an  event query using Register‐WMIEvent.http://www.  This list includes Sapien WMI Browser4. WMI  event queries require a complete discussion and we shall see that in the later chapters.  explore!  3 [WMISEARCHER] Query options: http://msdn.Get() In this above example. this is how we use it at the PowerShell console. Go. etc.com/enus/library/system. you can do so by setting the “scope”  property of this object.enumerationoptions.management.  $objSearch = [WmiSearcher]"Select * from MSPower_DeviceEnable" $objSearch. Don’t worry much even if you don’t understand anything here. And. Using this type accelerator. we change the scope to root\WMI namespace to retrieve all the  instances of MSPower_DeviceEnable class. etc. This brings us to the last section of this chapter – using PowerShell WMI cmdlets  to execute WMI queries.Scope = "root\WMI" $objSearch.Get() In the above code snippet. PowerShell v2.    There are several other tools to execute WMI Queries or access WMI information in general.aspx 4 Sapien’s WMI browser . So. Get‐WMIObject and Register‐WMIEvent can be used to execute WMI Queries. “New Process Created”. In case  you want to change the scope to a different namespace.

 NOT. and all other operators we saw in chapter one.    In this chapter.   Note  Remember that you can perform data queries only from one class at a time. WHERE. References Of. Win32_Process" What if we want to limit the instances to one particular service? Let us say AudioSrv.   $query = "SELECT * FROM Win32_Service" Get-WmiObject -Query $query This will list all instances of Win32_Service and properties of each instance. Here is how we do it:  $query = "SELECT * FROM Win32_Service WHERE Name='AudioSrv'" Get-WmiObject -Query $query This will list only one instance and the properties of that instance. WHERE is used to narrow the  scope of retrieved data. This keyword can be used in all of the three query types. IS. we shall look at how some  of the operators are used. In general. WMI data queries are used  to retrieve class instances and associations.  WHERE clause when used with SELECT statement can take one of the following forms:    SELECT * FROM class WHERE property operator constant  SELECT * FROM class WHERE constant operator property    [16]    . There are several keywords and operators that are  used in WMI data queries. FROM.WMI Data Queries WMI data queries are the simplest form of querying for WMI data. We can  use WHERE clause to filter that. As a part of the examples. we shall start looking at the most commonly used form of data queries and then  move on to data queries for association. This includes keywords such as SELECT. and WHERE The general syntax when using SELECT keyword for data queries is:    SELECT [* | Property Names] FROM CLASSNAME    So. and finally how to use multiple  operators in a query. NULL. if you want to get all instances of Win32_Service class and all properties.  SELECT. Associators  Of. FROM. the following query will produce an invalid query error:  Get-WmiObject -Query "Select * from win32_Service. LIKE. gotchas when using operators. For  example.

 probably since the DOS days that ‘*’ is the wild card character for specifying  something like “get anything that has the word”. gets us an instance of Win32_Service with name  ‘audiosrv’ and lists only the name and state properties of the service.  $query = "SELECT * FROM Win32_Service WHERE Name LIKE '%Audio%'" Get-WmiObject -Query $query This will list all the services that have the word ‘audio’ in the name of the service. ‘%’ is the wild card  character when using LIKE keyword. etc in the  output.  Using Operators In this section. Let us look at an  example for the second form of using WHERE. we shall look at different operators that can be used with WMI data queries and  how we can use them. we filtered out the instances by using WHERE clause and specifying  that we need only one instance of Win32_Service. By doing so. in WQL. we are  reducing the bandwidth required to execute the query and the amount of data we get in return. This is because the default formatting for the WMI class is lost when we specify  a selected set of properties. ^. we replaced ‘*’ with Name & State to limit the number of properties in  the output. $query = "SELECT Name.    LIKE  In the preceding example.  We have known. when executed. This query. For example:  Get-WmiObject -Class Win32_Service -Filter {Name='AudioSrv'} This is just a preference and in the scope of this book.  Note  You can use ‐Filter parameter instead of a WHERE clause or even ‐query.     Here are some examples of how we use these additional meta characters. Get‐WMIObject cmdlet builds the required WQL statement internally. What if we don’t know the exact service  name but we know that it has the word audio in it. When using ‐ filter. There are also other meta characters such as [ ].   $query = "SELECT * FROM Win32_Service WHERE Name LIKE '[af]%'" [17]    . and _  that we can use with LIKE operator. I will use ‐query only. State FROM Win32_Service WHERE 'AudioSrv' LIKE Name" Get-WmiObject -Query $query In the above example.In the above two forms.    Note  The above query results in listing the system properties such as __PATH. property denotes a valid property of a WMI instance.  Observe carefully how we used the keyword like and wrapped the word audio between %%.  However. operator is any  valid WQL operator and constant must be of the correct type for the property.

 This is used to specify a range of characters.    Let us look at another meta character. and NOT  We can test for multiple conditions inside the WHERE clause. The ‘_’ gets replaced by any character and  the matching service will be listed in the output.     In case you need all services that start with any letter from ‘a’ to ‘f’.  For example. Here is how we do it:    $query = "SELECT * FROM Win32_Service WHERE Name LIKE '[a=f]%'" Get-WmiObject -Query $query Note  You can either use ‘[a=f]%’ or ‘[a‐f]%’ in the above query.    The last meta character is ‘_’ and this indicates any one character similar to ‘?’ in DOS.Get-WmiObject -Query $query The above query gets us all services with a name that starts with ‘a’ or ‘f’. Here is  how we use it. we still use ‘[ ]’ meta  character but specify the range. Let us see how we can do that.  AND.  $query = "SELECT * FROM Win32_Service WHERE Name LIKE '%a_diosrv%'" Get-WmiObject -Query $query What we are trying in the above query is obvious. MSDN  documentation specifies only ‘=’. The way we use ‘[ ]’ is  very similar to its usage in regular expressions. Although. OR. ‘^’. the ‘‐‘ character has the same meaning. In the above query. by using ‘^’. What if we  want to list all services that are in ‘running’ state and StartMode set to ‘manual’ and the service  name starts with the characters ‘a’ or ‘f’. Here is  how the query will look like:  [18]    . if we want to list all services in the ‘running’ state but the StartMode set to  ‘manual’  $query = "Select * from Win32_Service Where State='Running' AND StartMode='Manual'" Get-WMIObject -Query $query Simple! By using AND. From  the description of the problem. We have seen the first part of this query already. we know that we need to use another AND operator. we specify that we want to list all the services with names  not starting with the characters in the range. we specify that we need both conditions to evaluate to TRUE.  $query = "SELECT * FROM Win32_Service WHERE Name LIKE '[^afgh]%'" Get-WmiObject -Query $query The above query gets us only the services with a name that does not start with ‘a’ or ‘f’ or ‘g’ or  ‘h’.

 How do  we make this work to get only what we want?    Here is how we do it:    $query = "Select * from Win32_Service Where (State='Running' OR State='Paused') AND Name LIKE '[af]%'" Get-WMIObject -Query $query See how we combined the first two conditions.    Let us now see how we can use NOT operator. when using OR.   Now. This is where parentheses are useful. Let us get a list of all services that are either in ‘running’ or ‘paused’ state AND  with name that starts with either ‘a’ or ‘f’. In the later sections. Let us see an example:  $query = "Select * from Win32_Service Where State='Stopped' OR State='Paused'" Get-WMIObject -Query $query In this preceding example. we will  see where using parentheses is necessary.$query = "Select * from Win32_Service Where (State='Running' AND StartMode='Manual') AND (Name LIKE '[af]%')" Get-WMIObject -Query $query See how we did that. By using OR. Now. let us look at OR operator. we specify that we want to get a list of instances  whenever one of more conditions evaluate to TRUE. it is just enough  to evaluate any one condition to TRUE. Enclosing the conditions in parentheses is not very important. let us make it a bit more complex by adding one  more condition. Why did that happen? Because. we are retrieving all instances of Win32_Service where the service  state is either ‘stopped’ or ‘paused’. If the problem description is not clear. Here is a very simple example and probably does  not require any explanation. It did not really bother to look at other conditions. what was there in output? All instances of running services irrespective of the service name  condition we wanted to check.  $query = "Select * from Win32_Service Where NOT (State='Running')" Get-WMIObject -Query $query The same thing can be expressed using the other operators such as ‘<>’ and ‘!=’ also. run the below query and see what you get in the output. this is a good practice to express a query like that. this query  returned the instance of the class.  Now.  $query = "Select * from Win32_Service Where State<>'Running'" Get-WMIObject -Query $query $query = "Select * from Win32_Service Where State!='Running'" [19]    . whenever service state was ‘running’.  $query = "Select * from Win32_Service Where State='Running' OR State='Paused' AND Name LIKE '[af]%'" Get-WMIObject -Query $query So. read it again. But. at least in  this query. So.

 But SELECT queries are not the only way to query for instances. IS NOT and NULL  You can also use IS. the query will be valid  only if the constant is NULL. We can also use the  ‘Associators Of’ keyword to do the same. IS NOT operators within WHERE clause. Before we dig too  much in to this.       Open CIM Studio from WMI Tools.     Note  Some properties of the WMI classes may not be displayed when using default output  formatting.  Using the IS NOT operator combination is similar to the first example using the IS operator. what are these associated WMI classes?    Take an example of a Windows service. the following query  $query = "SELECT * FROM Win32_LogicalDisk WHERE FileSystem IS NULL" Get-WMIObject -query $query …is valid and returns the disk drive information with no file system information. For example. However.  $query = "SELECT * FROM Win32_LogicalDisk WHERE FileSystem IS NOT NULL" Get-WMIObject -query $query Associators Of As we saw in the previous section.  we won’t see FileSystem property.   $query = "SELECT * FROM Win32_LogicalDisk WHERE DriveType IS 5" Get-WMIObject -query $query …will result in an invalid query error since the constant we specified is not NULL. They are just more than one way to get  the same result.    IS. Let us look at Win32_Service and explore how this class is associated with other  classes in WMI. WMI has several classes that represent windows service  information. you need to pipe the  output of Get‐WMIObject cmdlet to Format‐List *. To see all the properties. SELECT queries can be used to retrieve instances of a WMI  class.   The following example. On my system. there is a difference. We shall use CIM Studio for this purpose. when we just query using “Select * From Win32_LogicalDisk”.  [20]    . To see this.  this query returns the DVD drive information. SELECT queries always  return a collection of instances of a WMI class where as “Associators Of” returns a collection of  WMI objects that belong to different WMI classes or associated WMI classes.Get-WMIObject -Query $query All three preceding examples have the same meaning. For example.  Connect to root\cimv2 namespace. However. let us first understand.

  In n the results w window.    [21]    . a third association class –  Win32_LoadOrderGrroupServiceM Members – rrelates a loadd order grou up and a basse service. using the “Refe erences Of” keyword. TThis is requirred and the property – ‘‘Name’ in th his  case – sh hould be the “key”. This class. select the “Associatio ons” Tab.  The below screen capture showss the associaations.Name e=”NetLogonn” is the source instancee while instances  of Win32 2_ComputerSystem.  Now. Herre is the general syntax oof this keyword:    ASSOCIATO ORS OF {ObjeectPath}    Any valid obbject path caan be used fo or ObjectPatth. So.    ogon service e depends on LanmanW Workstation sservice. You ccan identify the propertty that is dessignated as kkey by lookin ng at  propertie es list in WM MI CIM Studio o. This relation is in ndicated by  The Netlo another aassociation cclass Win32_ _DependenttService.Name= =”MS_Windo owsRemoteV Validation” aare the targeet instances  or  endpointts. Andd. Win n32_Service. Win32_Se ervice. This property uniquelly identifies the WMI claass instance.  Win32_SSystemServicces.    Now.  this can ttake a while and the outtput can be o overwhelmi ng. is called an associatiion class.. this queery without  Name=’N NetLogon’ will not return n anything.    In the ab bove example. rightt‐click on “Ne etlogon” instaance and select “Go to Objject”. Rememb ber.Name= 'NetLogon' '}" Get-WmiObject -Qu uery $query The abovve snippet sh hows the basic usage of ‘Associatorss Of’. finally.   Double‐click on Win32_Servvice class. A ok at an example to und derstand thiss. we can retrievve all instancces that are associated w with  a particular source in nstance. Make aa note of thee syntax insiide  curly braces. and  Win32_LLoadOrderGrroup.  Let us loo   $query = "Associa ators of {W Win32_Serv vice.Name=”LannmanWorksttation”. This query — when n executed — — gets all thee instances o of all associaated classes. If we mouse‐overr the   ico on. we can ssee a  class nam me that relattes Win32_SService to Wiin32_CompuuterSystem. rettrieve all instaances by clickking on   ico on.  Note that the bracess are part of the syntax..

 YYou can usee more than one keyworrd by just  se eparating them by a spaace.    Let us see the examp ples around how to use tthese keywoords within W WHERE clause.    [22]    .    $query = "Associa ators Of {W Win32_Serv vice.    Look at the   icon n next to the e property ‘N Name’. They are:    ASSOCIATORS OF {ObjectPath} W WHERE  AssocClass = AssocClassName  ClassDefssOnly  Required dAssocQualiffier = QualifiierName  Required dQualifier = Q QualifierNam me  ResultClaass = ClassNaame  ResultRo ole = ProperttyName  Role = PrropertyName e    Note  N You cannot use logical op perators such as AND.Name= 'NetLogon' '} WHERE C ClassDefsOn nly" Get-WMIObject -Qu uery $query        As we see.  You can u use the keyw word ClassDefsOnly for tthis purposee. the e usage of W WHERE clause e is a bit diffferent from how you do that with  SELECT q queries. This identifies th he key propeerty.    ClassDe efsOnly  Let us first see a wayy to list only the associatted class nam mes as show wn in the screeenshot abo ove. O R. Therre are prede efined keywo ords that youu can use wiith WHERE cclause. the asssociation queries can also use WHEERE  clause.  Similar to o the data queries using SELECT keyword. and NOT within the W WHERE clausse  while using A w Associators O Of keyword. H However. the list off associated class names we see heree is same ass what we saaw in the CIM M  Studio ou utput.

Name= 'LanmanWor rkstation'} Where ResultRole=Depend dent" Get-WMIObject -Qu uery $query    The abovve query willl list all the sservices thatt depend on LanmanWo orkstation seervice.    $query = "Associa ators Of {W Win32_Serv vice. Now. if yyou want to get a list of  For a mo services tthat depend d on a specific service wiithout using “Associatorrs Of”.. tthis  is similarr to:     Get-Service -Name e "LanmanWorkstation n" -Depend entService es    Similarly. Thiis is shown in the below screen captture. If yo ou want to reetrieve the  instance of associate ed class thou ugh a single aassociation cclass:    $query = "Associa ators of {W Win32_Serv vice.Name= 'NetLogon' '} WHERE AssocClass=Win32_ _DependentService" Get-WmiObject -Qu uery $query   This querry gets us the end point instance asssociated thr ough Win322_DependentService  association class. For examp ple.Name= 'NetLogon' '} WHERE ResultClass=Win32 2_LoadOrderGroup" Get-WMIObject -Qu uery $query ResultR Role  The Resu ultRole keyw word indicate es that the re eturned enddpoints mustt play a particular role in n  their asso ociation with h the source e object. to get a listt of services that a specific service d epends on:   [23]    . And.AssocCllass  The Asso ocClass keyw word indicate es that the re eturned enddpoints mustt be associatted with thee  source th hrough the sspecified classs or one of its derived cclasses.     oment think tthat Get‐Serrvice cmdlett never existeed.        ResultC Class  This keyw word indicattes that you want to retrrieve the endd points asso ociated onlyy with the  specified d ResultClasss. we wo ould do thatt by  parsing W Win32_Depe endentServicce instances. uusing ‘Assocciators Of’. However. w we can do the  same by::    $query = "Associa ators of {W Win32_Serv vice.

 respectively.    Dependency Relationship  This relationship defines an association where one object is dependent on another object –  antecedent. we  can get either class instances – Win32_DiskDrive or Win32_DiskPartition.     We can classify WMI relationships in‐to three basic types:     Dependency relationship  Element‐Setting relationship  Component relationship  On a related note.    So. We shall  explore the meaning of these in the coming sections. The association class we just used – Win32_DependentService – is a classic  example. In simple English. MSDN documentation for several WMI classes lists properties such as  Dependent.    Another example is the Win32_DiskDriveToDiskPartition association class. and part component.Name=”LanmanWorkstation” – which is the antecedent. antecedent. setting. a partition is  dependent on a disk drive and by specifying one of these roles – dependent or antecedent. From  the above examples. what are these dependent and antecedent roles we used in the above queries? Let us  slow down a bit and understand the WMI relationships. Now. This class defines a dependency relationship between two Windows services.\PHYSICALDRIVE0'} WHERE ResultRole=Dependent" Get-WmiObject -Query $query    Here is what I see on my system:    [24]    .  And.Name=”NetLogon” is dependent on  Win32_Service. if we want to query for all disk partitions on a specific hard drive:    $query = "ASSOCIATORS OF {Win32_DiskDrive.Name='NetLogon'} Where ResultRole=Antecedent" Get-WMIObject -Query $query    This example will list LanmanWorkstation as NetLogon service depends on this service to start. go back to the  examples and read them again. this is similar to running:    Get-Service -Name "Netlogon" -RequiredServices    So. Element.$query = "Associators of {Win32_Service. the Win32_Service. Group Component. This class relates  Win32_DiskDrive and Win32_DiskPartition classes where Win32_DiskDrive plays the  antecedent and Win32_DiskPartition plays the dependent role.DeviceID='\\.

 In tthis relationsship. This may or may not exist on yyour  syystem.    Note  N In n the above query.. I used d network adapter indexx 12. by queryingg Win32_Ne adapter cconfiguration informatio on. For exam mple.    Elementt‐Setting Re elationship  This relattionship defines the asso ociation between an eleement – for eexample a n network adap pter  – and the e settings for that eleme ent.  Win32_N NetworkAdap pter is the Element and Win32_NettworkAdapteerConfigurattion is the seetting.    $query = "Associa ators Of {W Win32_Netw workAdapte r. take a look at Win n32_NetworkkAdapterSettting class. Use G Get‐WMIObjject –Class W Win32_Netw work adapter to find the index valuee for  yo our networkk adapters.DeviceID D=12} Where ResultRole=Settin ng" Get-WmiObject -Qu uery $query   [25]    . TThe followingg  screen caapture from CIM studio shows the tw wo properti es of this association claass.  How do w we use this?? Let us lookk at a few examples. These asssociation cllasses have p properties n named Elemeent  and Settiing. we geet the netwo ork  Similarly.        NetworkAdap pterSetting aassociation cclass definess a relationship between n  Win32_N Win32_N NetworkAdap pter and Win n32_NetworrkAdapterCoonfiguration classes. We  can retrievee the network adapter  information by usingg the followin ng query:    $query = "Associa ators Of {W Win32_Netw workAdapte rConfigura ation.Index=12} Wher re ResultRole=Elemen nt" Get-WmiObject -Qu uery $query        etworkAdaptter class andd for ‘settingg’ role.

. We will gett an invalid o object path error if one of  Also.    We can gget a list of ggroup memb berships for aany given usser account using the following query:    $query = "Associa ators Of {W Win32_Acco ount. This helpss us in getting only the group  details. A domain nam me or the local computerr name. make a note that thhe value of D Domain prop perty can be  the properties is not specified.  either a d   We were e also limiting the ResulttClass to Win n32_Accoun t.    Similarly. O Otherwise. if we want to get a list of all users iin a group:   $query = "Associa ators Of {Win32_Acc { count. w we may end up seeing co omputer systtem details also as a parrt of the queery  output. w we list all the e groups in w which DemooUser1 is a m member.Domain n='DomainN Name'} WHERE ResultRole= =PartComponent Resul ltClass=Wi n32_Accoun nt" Get-WmiObject -Qu uery $query | Select t Name   [26]    .     Let us see a few exam mples now.Domain= ='DomainNam me'} WHERE ResultRole= =GroupComponent Resu ultClass=W Win32_Accou unt" Get-WmiObject -Qu uery $query | Select t Name        In the ab bove query.Name= ='DemoGrou up2'.    Compon nent relatio onship  This WMI relationshiip contains ttwo or more classes as G GroupCompo onent and PartComponeent.  we used both Name and Domain n properties. This is requuired as both h these prop perties are th he  key properties in Win n32_Accoun nt WMI class. The  Win32_Gro oupUser WM MI class  associate es Win32_Grroup (GroupComponentt) and Win322_Account (PPartCompon nent) classess.   Let us un nderstand th his with the h help of an exxample. In tthe object paath.Name= 'DemoUser1 1'.  Win32_G GroupUser defines a relaationship bettween a group and an account that is a member of  the group.

     RequiredQua R alifier keywo ord indicatess that the retturned endp points must be associateed  with the sour w rce object th hrough an asssociation claass that inclu udes the speecified qualifier. properties. We ccan just tweeak the queryy that we ussed  to list all members off a given gro oup to:     $query = "Associa ators Of {Win32_Acc { count. Howevver. we ssee a list of aall users who o are  part of D DemoGroup2 2. method paarameters. let us see some e examples tto understan nd this.  indications. ttriggers.Name=’Dem moGroup2’ w where Win32 2_Account iss a  GroupCo omponent.    That is ab bout WMI re elationships.Domain n='DomainN Name'} WHERE Role=GroupC Component ResultClas ss=Win32_A Account" Get-WmiObject -Qu uery $query | Select t Name   The result of both these queries is same.    Now. Th hese  [27]    . Whe en using Rolle keyword ‐‐‐ we specifyy that the en ndpoints partticipate in an  association where th he source ob bject plays aa particular rrole. Let us move on to otheer interesting aspects off using  Associato ors Of keyword. we indicate e that the en ndpoint musst a play a p particular role in associaation with th he  source in nstance. insttances.     The diffe erence betwe een this keyword and Re esultRole keeyword is: wh hen using ReesultRole  keyword. w we  queried ffor all instan nces of Win3 32_Account. The ey just list alll members o of DemoGro oup2.    WMI quaalifiers are vaalues that prrovide addittional inform mation aboutt classes. methodss.    RequirredQualifi fier and RequiredA AssocQuallifier There are e other keyw words such aas RequiredQ Qualifier andd RequireAsssocQualifierr. In the secoond variation. or references.Name= ='DemoGrou up2'. asssociations. by exxecuting the  query.  observe tthe difference between two queriess.  The Required dAssocQualifier keyword d indicates tthat the retu urned endpo oints must bee  asssociated wiith the sourcce object thrrough an asssociation claass that inclu udes the  sp pecified qualifier.    As shown n in the screen capture aabove.. using Rolee keyword.    Role The Role keyword indicates that the returne ed endpointss participatee in an association with tthe  source object where the source object playss a particularr role.

qualifierss5 can be use ed to narrow w the result sset from thee WMI queryy.Name=' Netlogon'} } Where ClassDefsOnl ly" Get-WmiObject -Qu uery $query     ators Of {W Win32_Serv vice. Th he  REFEREN NCES OF state ement is sim milar to the A ASSOCIATOR RS OF statem ment in its syyntax. Win32_D DependentSeervice.     This bringgs us to the end of discu ussion on “A Associators O Of” keyword.microsoft.Name= 'Netlogon' '} Where C ClassDefsOn nly" $query = "Associa uery $query Get-WmiObject -Qu 5 WMI Staandard Qualifieers: http://msdn n. Win32 2_Service. There is no o in‐depth  discussio on of these tw wo keyword ds here. Let us re‐vvisit an earlie er example tto understannd this.85).     REFEREN NCES OF {Objject Path}    n  Howeverr. it reetrieves the interveningg association instancess. rather than retrieving endpoint instances.      In the ab bove screen capture from m CIM Studio.aspx [28]    . an nd Win32_LooadOrderGrooup.  and Win3 32_LoadOrd derGroupServviceMemberrs are the asssociation claasses.  Referrences O Of This keyw word retrieves all association instances that refeer to a particcular sourcee instance.com m/en-us/libraryy/aa393651(v= =vs. we retrieve the instanc es of end po oints –   Win32_C ComputerSysstem. When n using  “Referen nces Of” keyw word alone. Let us ssee both  keywords side by side in an exam mple:    $query = "Referen nces Of {Win32_Servi ice. Let us now w move on to o the  final keyw word used in n WMI data queries. Win32_SyystemServicees. we retrieve e the instancces of these aassociation cclasses whereas  using “Asssociators Of” keyword.

 We loooked at seveeral keyword ds and operators  MI  in this ch hapter.  This conccludes this chapter on W WMI data queries.  [29]    . In the e next chaptter.    Similar to o Associators Of keyworrd. The gen neral  syntax fo or using WHEERE clause iss:    REFEREN NCES OF {ObjjectPath} WHERE  ClassDefssOnly  Required dQualifier = Q QualifierNam me  ResultClaass = ClassNaame  Role = PrropertyName e    The usagge of these keywords is ssimilar to “A Associators O Of”. we shall look at how w to use WM MI query langguage for WM event queries. By using the ClassDe efsOnly keyw word.    You see tthe differencce. we lim mit the verbo osity of the  output and this helpss us understtand the diffference. There are predefin ned keyword ds that you ccan use with h WHERE claause. you can u use the WHEERE clause w with “Referen nces Of”  keyword also.

 We caan use this W WMI  class to ssubscribe to all process sstart events. You can either use ‐Class or ‐Q Query  6 paramete ers to create e a temporary  event consumer. there is aa WMI class that represe ents each tyype of WMI eevent. So. a WMI evvent class? YYes.  A WMI event occurs when that instance is crreated. what happenss if the valuee provided to o the ‐Class parameter iisn’t  hell complains about it. Whhen using ‐Cl Class parameeter. yo ou can use W Wait‐Event and Get‐Even nt cmdlets to o  re eceive the evvents. .WMI Ev vent Q Queriies: In ntrod ductio on Just as th here is a WM MI class that represents e each type off system resource that ccan be manaaged  using WM MI.SourceEventArgs. When n an event th hat  can be m monitored byy WMI occurrs.85).ProcessNam me) just started" } Note  N ‐A Action param meter can be e used to spe ecify the scrriptblock useed to take so ome action w when  th he event getts fired. this is good enough.    Register-WmiEvent t -Class Win32_Proce essStartTr ace -Sourc ceIdentifier "Proces ss Started" -Action { Write-Host "$($Eve ent. we und derstand thaat Win32_Prrocess isn’t aa WMI eventt class.. This class indicates th he new proceess started eevent. an instancce of the corrresponding WMI event class is creaated. how  do we fin nd what are the WMI evvent classes??    #Get all classes that are WMI W event classes #filter class nam mes for Win32 classe es Get-WMIObject -Qu uery "Select * from meta_clas s Where (_ __This ISA A '__Event' ') AND (__Class like e 'win32%')"   es that start with Win32 prefix. PowerSh       So. We w will see man ny more if we  This will list all WMI event classe remove tthe second ccondition in the WHERE clause but ffor starters.NewEvent.  There are e a couple of different w ways we can use this cm dlet.asppx#event_conssumers [30]    .  Win32_P ProcessStartTTrace is one of the WMI event class es listed when we execu ute the abovve  PowerShell command.microsoft.   6 Event Co onsumers: http://msdn.com/en-us//library/aa3930013(VS. Alternatively. For examplle. from the above e error. But. we need to  specify a WMI event class.    Windowss PowerShell v2 provides a cmdlet — — Register‐W WMIEvent – to consumee WMI eventts.

Note  N You have to o open the Pow werShell con nsole in elevvated mode.  Howe ever. Lo ook at  this exam mple:    #Register-WMIEven nt using -Query Register-WmiEvent t -Query "Select * from f Win32_ _ProcessSt tartTrace WHERE ProcessName='note epad. howeever. W We shall see the other m methods in th he later secttions. this will result in re eceiving the  messages aat the consolle every timee any  process sstarts and no ot just the one we are in nterested in.    This com mmand will re egister an evvent consum mer and disp lay a messagge with the newly createed  process n name.  This  queryy  can  be  useed  to  narrow d down the eve ents to just tthe ones we e need. But. Else. we will see an acccess  denied messaage every tim me we try ussing Registerr‐WMIEventt. why even  receive the event wh hen we don’tt need it? Th his is where ‐Query paraameter comees handy. looks aat the local W WMI events only. we saw ho ow to list WM MI event classses and how w to use Reg gister‐WMIEEvent  [31]    . what if we are intterested onlly in one spe ecific process? We could d have easilyy filtered outt the  unnecesssary processses before diisplaying the e process na me at the co onsole.        There are e many othe er ways to m monitor proce ess creation  using WMI events and WQL.    The  WQL  statementt  we  used  should  s be  faamiliar  to  yoou  by  now..    In the earlier section.exe'" -Action { Write-Host "New " notepa ad process s created" } Note  N Itt is possible tto register fo or a remote WMI event using Registter‐WMIEveent cmdlet an nd  th he ‐computeerName paraameter. This book. What we  just saw is one way o of doing it.        So.

  Windows registry defines extrinsic events for all registry change events. The later  chapters in this book dig deep in to the intrinsic events and show examples of subscribing to  these events.  7 8 __AbsoluteTimerInstruction class: http://msdn.  WMI creates intrinsic events for objects stored in the WMI repository. We shall see how to use this class to create timer events and examples of how to use  the timer events to create complex scheduling tasks in the later parts of this book. This is mostly because they are defined within the  standard WMI model and WMI takes care of these if there is no WMI provider for a given  resource in the standard WMI model. In  other words. this isn’t necessary  any more. how do we  subscribe to the events from these non‐event classes? This question brings us to the discussion  on types of event queries. However. WMI uses preconfigured event timers  within the repository to generate timer events. having a WMI provider is mandatory.85). the ones that are most interesting and  useful are __InstanceCreationEvent. There are many system classes  that WMI uses to report intrinsic events. For example.    Timer Events Timer events are a specialized kind of intrinsic event.  Event Query Types There are three types of event queries in WMI: intrinsic events. Here is a brief discussion on each of these event types:    Intrinsic Events Intrinsic events are used to monitor a resource represented by a class in the CIM repository. A provider generates  intrinsic events for dynamic classes. The later sections of this book will  provide an in‐depth discussion on the Windows registry events and show a few examples. and __InstanceDeletionEvent.aspx __IntervalTimerInstruction class: http://msdn. the class itself  provides the events. and timer  events.to subscribe to the events from that WMI class.     In the case of non‐event classes. extrinsic events.microsoft. __InstanceModificationEvent.  Hence.  having a WMI provider isn’t mandatory. WMI does all the hard lifting of monitoring the class instances  and providing whenever an instance is created.microsoft.aspx [32]    . or deleted. Now. but WMI can create an instance for a dynamic class if no  provider is available. In the pre Windows 2003 days.com/en-us/library/aa394620(v=vs. the intrinsic events occur in response to a change in the standard WMI data model.    Extrinsic Events Extrinsic events represent events that do not directly link to standard WMI model. with the Win32_LocalTime class. respectively.com/en-us/library/aa394654(v=VS. we can use the class name directly and create an event subscriber. For intrinsic events. monitoring resources on a system involves monitoring of these system classes. Hence. we had to use  __AbsoluteTimerInstruction7 and __IntervalTimerInstruction8 to create absolute and interval  timer instructions. However. modified. In the case of a WMI event class. since extrinsic events are outside of the  standard WMI model.85). WMI uses polling to detect the changes. However.

 The recommended values for the polling interval really depend on the  event class. we use SELECT statement for event queries too. and WHERE keywords. BY. 0.     WQL Syntax for event queries As we discussed earlier. specifying a polling interval smaller  than one second (for example. There are  other keywords such as WITHIN.  we can specify values smaller than one second.  [33]    . and GROUP to change how we receive these  WMI events. GROUP.    SELECT * FROM eventclass WITHIN interval WHERE property = value    The polling interval value is specified as number of seconds and is a floating point number.    WITHIN WITHIN keyword is used to specify the polling interval or grouping interval (when used with  GROUP clause) for the events. FROM. We can combine this  with other keywords such as WITHIN. Here is the general syntax for WQL event queries:    EVENT‐WQL = “SELECT” <PROPERTY‐LIST> “FROM” /  <EVENT‐CLASS‐NAME> <OPTIONAL‐WITHIN> <EVENT‐WHERE>    OPTIONAL‐WITHIN = ["WITHIN" <INTERVAL>]  INTERVAL = 1*DIGIT  EVENT‐WHERE = ["WHERE" <EVENT‐EXPR>]    EVENT‐EXPR = ( (<INSTANCE‐STATE> “ISA” <CLASS‐NAME> <EXPR2>) /  <EXPR> )  ["GROUP WITHIN" <INTERVAL>  ( ["BY" [<INSTANCE‐STATE> DOT] <PROPERTY‐NAME>]  ["HAVING" <EXPR>]] )    INSTANCE‐STATE = “TARGETINSTANCE” / “PREVIOUSINSTANCE”    In the above syntax specification. However. The WMI query syntax for event queries is a bit different and  deserves a discussion. Let us look at each one of these  keywords now. A polling interval is the interval that WMI uses as the maximum  amount of time that can pass before notification of an event must be delivered. we know the SELECT. and HAVING. HAVING. So. The general  syntax to specify the polling interval. Never use a small value here unless you really need the event notification to be  delivered immediately.1) may cause system slow down due to the resource intensive  nature of event queries.  Before we dig in to the event types. it is important to understand the WMI query syntax used  for the above query types.

 when monitoring a system. These two are represented by ‘Representative’ &  ‘NumberOfEvents’ properties respectively. or both. When used in a WMI event query. When using polling interval. one event will be received  by the subscriber but the number of events occurred during the grouping interval will be known. However. Here is  the syntax:    SELECT * FROM EventClass [WHERE property = value] GROUP WITHIN interval    This is especially useful when we don’t want to receive an event notification every time the  event fires. as mentioned above. WMI waits until  the time specified is elapsed and sends all the events that were generated during the polling  interval.    [34]    . during which  WMI should collect similar events. Instead. we may not want to receive a notification  every time a specific event log gets generated.EventCode=1980 GROUP WITHIN 300" #Register the event Register-WmiEvent -Query $query -Action {Write-Host "Eventlog Arrived"}    This is different from how polling interval works.     Take a look at this example:    #Build a WMI query for receiving an event $query = "Select * from __instanceCreationEvent WHERE TargetInstance ISA 'Win32_NTLogEvent' AND TargetInstance. The  GROUP clause is placed after the WHERE clause if the query contains a WHERE clause. in case of grouping interval.  Let us look at an example:    #Build a WMI query for receiving an event $query = "Select * from __instanceCreationEvent WITHIN 10 WHERE TargetInstance ISA 'Win32_Process'" #Register the event Register-WmiEvent -Query $query -Action {Write-Host "New Process created"}    GROUP Using GROUP clause causes WMI to generate a single notification to represent a group of  events. this returns an instance of __AggregateEvent that  contains an embedded object of one of the instances received during the grouping interval and  the number of such events received. The GROUP clause must contain a WITHIN clause to specify  the grouping interval and can contain either the BY or the HAVING keyword. we can use GROUP clause to specify a  grouping interval and receive only one notification for all the desired event logs generated  within the grouping interval. after receiving an initial event. For example.     The grouping interval specifies the time period.

EventCode=1980 GROUP WITHIN 300 HAVING NumberOfEvents > 10" #Register the event Register-WmiEvent -Query $query -Action {Write-Host "Eventlog Arrived"}    I mentioned earlier that by using GROUP returns a property called NumberOfEvents that  contains the number of events received during the grouping interval.    #Build a WMI query for receiving an event $query = "Select * from __instanceCreationEvent WHERE TargetInstance ISA 'Win32_NTLogEvent' GROUP WITHIN 300 BY TargetInstance. what if we want to receive the event notification only when ten such  event logs are generated within the grouping interval? This is where HAVING plays an  important role. Let us look at how we can modify the above sample code to use the HAVING  keyword.HAVING In the above example. Here is the syntax:    SELECT * FROM EventClass [WHERE property = value]  GROUP WITHIN interval HAVING NumberOfEvents operator constant    So.SourceName property. we will receive an event notification for all the events received within  the grouping interval. Now.    #Build a WMI query for receiving an event $query = "Select * from __instanceCreationEvent WHERE TargetInstance ISA 'Win32_NTLogEvent' AND TargetInstance.SourceName HAVING NumberOfEvents > 10" #Register the event Register-WmiEvent -Query $query -Action {Write-Host "Eventlog Arrived"} You can use BY keyword along with GROUP clause to group events by one or more properties of  the event class. an event notification is delivered only when WMI  receives more than 10 events in the grouping interval. using the HAVING query as shown above. The general syntax for using BY is as follows:    SELECT * FROM EventClass [WHERE property = value]  GROUP WITHIN interval [BY property_list]    For example. we use that  property along with HAVING keyword to filter event notifications. But.    BY You can use the BY keyword along with the GROUP clause to group events by one or more  properties of the event class. the following example groups all events received in 300 seconds by the  TargetInstance. The general syntax for using BY is as follows:    [35]    .

SourceName property and  an event notification is delivered only if the number of events received during the grouping  interval exceeds 10. we looked at all the important keywords that can be used while building WMI event  queries.     So far.       [36]    . the events are grouped by the TargetInstance.In the above example. What  are these? This is the topic of discussion in the next few chapters. if you have observed. But. I kept using the words eventclass and TargetInstance.

 monito oring resourrces on a sysstem involvees monitoring of  and __InstanceDelettionEvent.In ntrinssic Ev vent Q Queries Intrinsic events are u used to monitor a resourrce represennted by a claass in the CIM M repositoryy.  WMI creates intrinsicc events for objects storred in the W WMI reposito ory.  and __InstaanceOperatiionEvent.    There are e many syste em classes9 that WMI usses to reportt intrinsic evvents. The fo ollowing screeen  capture o of WMI CIM Studio show ws this hierarchy. In  other wo ords. TThe eventClass can be aany of the system classess such as __InstanceCreationEvent.855)..      9 WMI Sysstem classes: http://msdn.  __InstanceModificattionEvent. These classses are derivved from thee __InstanceeOperationEEvent class w is derived d from the _ __Event systeem class und der root\Deffault namesp pace.      eral WQL syn ntax for WM MI intrinsic evvent queriess is:  The gene   SELECT P Property_Listt FROM even ntClass WITH HIN PollingInnterval   WHERE Targe W etInstance | PreviousInstance ISA W WMIClassNam me  AND TargetIn A nstance.com/en--us/library/aa3 94583(v=vs.WMIClassPropertyName = V Value    This is so omething sim milar to whatt we saw in tthe earlier ddiscussion ab bout WQL syyntax for eveent  queries. WMI uses p polling to de etect the chaanges. ___InstanceM ModificationEEvent. A provider generates  intrinsic e events for dynamic classses. __ _InstanceDeletionEvent. However. the intrrinsic eventss occur in ressponse to a change in th he standard WMI data m model. He which  these sysstem classess.  ence. but WM MI can createe an instancee for a dynam mic class if n no  provider is available.mic h crosoft.aspx [37]    . the onees  that are most interessting and usseful are __In nstanceCreaationEvent.

 when do we use each of these system classes mentioned above?    __InstanceCreationEvent This class is used when we want to receive a notification upon creation of an instance. For  example. we will know whenever the CPU load goes beyond 80%.Note  The PreviousInstance and TargetInstance represent the state of the object prior and  after the event respectively. Do something useful here"}   Using the above query.    So. However. For  example. we can use this class when we want to receive an event notification when the  processor utilization on a system goes beyond a specified usage threshold. what if  we want to receive the event only when the change in load percentage is around a specified  [38]    . For  example.    #Query for new process events $query = "Select * from __InstanceDeletionEvent WITHIN 5 WHERE TargetInstance ISA 'Win32_Process'" #Register WMI event Register-WmiEvent -Query $query -Action {Write-Host "A Process terminated. This can be done by. Now. make a note that the PreviousInstance property  is available only when using __InstanceModificationEvent class.    #Query for new process events $query = "Select * from __InstanceCreationEvent WITHIN 10 WHERE TargetInstance ISA 'Win32_Process'" #Register WMI event Register-WmiEvent -Query $query -Action {Write-Host "New Process Created. Do something useful here"}   __InstanceDeletionEvent This class is used when we want to receive a notification upon deletion of an instance. we can use this class when we want to receive an event notification every time a  process is terminated. we can use this event class when you want to receive an event notification every time  a new process gets created. Do something useful here"}   __InstanceModificationEvent This class is used when we want to monitor changes to an existing instance or a resource. For example.LoadPercentage > 80" #Register WMI event Register-WmiEvent -Query $query -Action {Write-Host "Processor utilization is more than 80%. For example.     #Query for new process events $query = "Select * from __InstanceModificationEvent WITHIN 5 WHERE TargetInstance ISA 'Win32_Processor' AND TargetInstance.

 And. So. we will have access to both the instances.  Instead. PowerShell creates an automatic variable called $event and stores the last event  received in that variable.LoadPercentage >= 80 AND PreviousInstance.range? This is where the PreviousInstance will play a role. how do we access that  information in the script block and tell a user the name of the process that was created?    Simple. we can do something useful within the script block. in the __InstanceCreationEvent example.LoadPercentage >= 70)" #Register WMI event Register-WmiEvent -Query $query -Action {Write-Host "Processor utilization is more than 80%. Do something useful here"}    All of the examples above just displayed a message when the event notification was received. going back to the example:  #Query for new process events $query = "Select * from __InstanceModificationEvent WITHIN 5 WHERE TargetInstance ISA 'Win32_Processor' AND (TargetInstance.     For example. we are just displaying that a new  process was created but not the process name that just got created. Let us see an example:    #Query for new process events $query = "Select * from __InstanceCreationEvent WITHIN 10 WHERE TargetInstance ISA 'Win32_Process'" #Register WMI event Register-WmiEvent -Query $query -Action { $global:myEvent=$event } | Out-Null    [39]    . the  TargetInstance and PreviousInstance are the embedded objects of __InstanceModificationEvent. As discussed earlier.    Now.  So. this automatic variable can be accessed in the ‐Action scriptblock  you specify during a WMI event registration.

    As we haave seen in the system class hierarch hy.__ __CLASS) { '__Instan nceCreationEvent' { Write-Host W "New Proc cess creat ed: $($pro ocessName)" } 10 Eventing g – Scout the Action A block’s Automatic varriables: https://robeertrobelo.    If you see e in the abovve example.Name has th he name of the new pro ocess  which is notepad. we made an event regi stration for process creaation eventss and  in the ‐Acction script b block.New wEvent. $event auto omatic variaable won’t bee available o outside of th he –action  ScriptBlo ock. And. This is essential because we can nnot access tthe $event vvariable outsside the ‐Acttion  script blo ock. I  figured out that  $myEven nt.. After exploringg that a bit.SourceEventArgs. So. I tried  looking aat all the members of thiis event. Go  10 explore 0 more abou ut this. thaat is the reasson we assigned it to gloobal variablee called $myEEvent.SSourceEventA Args.Name Switch ($even nt. I opened nnotepad application.exe e.word dpress.N NewEvent. Thiss will fire thee  __InstanceCreationEEvent and $m myEvent should have thee details around the eveent.Targ getInstance.TargetInstance willl have the in nstance of th he newly created  process. the abovve three classses are derivved from  __InstanceOperation nEvent class. This is pre ecisely what we see in thhe last line th here. Remember.SourceEve entArgs.    $Event. Once the registratio on was done.New wEvent.NewEvvent.Targ getInstance. H Here  is how we do it:    $query = "Select * from __InstanceOp perationEv ent WITHIN N 10 WHERE E TargetInstance IS SA 'Win32_Process'" Register-WmiEvent t -Query $query -act tion { $processName = $Event.SourceEven ntArgs. assign ned the $eve ent variable to a variablee in the glob bal scope  ($myEvent). We can use e this class a s well for ou ur event subscriptions.com/201 10/10/15/eventiing-scout-the-aaction-blocks-aautomatic-variables/ [40]    .

 In the next chapter. we  shall see what extrinsic events are and how events from Windows registry provider can be used  to monitor changes to registry. It does not have an instance of its own. we are actually checking for the actual instance class type  again using a switch statement. This example is to just show you how  to use the __InstanceOperationEvent class.'__InstanceDeletionEvent' { Write-Host "A Process terminated: $($processName)" } '__InstanceModificationEvent' { Write-Host "Process was modified: $($processName)" } }  }   If we look at the –action scriptblock. This. in fact.    This is it about intrinsic events and how to access or subscribe to them. This is required because __InstanceOpeartionEvent can be any  of the three types. it triggers a __InstanceModificationEvent. results in a flood of events because  every time a process working set is changed.  [41]    .

 The subsequent section ns in  this chap pter will use the extrinsicc event classses from reggistry provideer to show w we can creatte  event no otifications fo or extrinsic e events. Heree is how we w write  a WMI query for regiistry value change eventts:    $query = "Select * from RegistryValu ueChangeEv ent WHERE Hive='HKEY_LOCAL_ _MACHINE' AND A KeyPat th='Softwa re\\Temp' AND ValueName='Name e'" Register-WmiEvent t -Query $query -Act tion { Wri te-Host "V Value changed" } Yes.  Windowss registry defines extrinssic events fo or all registryy change eveents.        As you se ee. when the monitored value e changes. there is rregistry provvider that provides extrinnsic events. So. For exam mple. Take a loo ok at this CIM M Studio scrreen capturee. Howe [42]    . that is it. there iss one drawback here. since extrinsic events a re outside o of the standaard WMI mo odel. However. w we will see th he message ““value changged”  ever.    When cre eating a WM MI query for extrinsic eve ents. Thiss is because they are deffined within n the standarrd  WMI model and WM MI takes care e of these if tthere is no W WMI provideer for a given n resource in n the  standard d WMI mode el.  having a WMI provid der isn’t man ndatory.    Monitoring rregistry y value change e eventss We use R RegistryValu ueChangeEvvent to monitor changes  to registry vvalues. we neeed to use a cclass derived d from  __ExtrinssicEvent classs. Thhe event nottification onlly tells us thaat  on the sccreen.Ex xtrinssic Ev vent Q Queries Extrinsic events represent events that do no ot directly linnk to standarrd WMI mod del. For intrrinsic eventss.  having a WMI provid der is mandaatory.

the value e has been m modified butt it won’t retturn the new w value! Also o.GetValue e("Name")) { Write-host W (Get-item m HKLM:\SO FTWARE\Tem mp).GetValue("Name") ) } els se { Write-host W "The regi istry valu e was dele eted" } }    Monitoring rregistry y key ch hange e events RegistryK KeyChangeEEvent can be e used to mo onitor modiffications to aa registry sub b key. For examp ple. tthe resultingg event notiffication doess not tell us anything ab bout  that value deletion. you need to use som me technique e similar to w what is show wn above to retrieve thee  “real” mo odification that happene ed. again. we w ill have to veerify the preesence of reggistry  value we e are monitoring and the en display th he new valuee. See tthe next scre een capture .      Although h we deleted d the value. th he notificatio on won’t telll us  that the vvalue was de eleted. B But. Similaar to  RegistryV ValueChang geEvent. SSo. Here is how w we use it:    $query = "Select * from RegistryKeyC ChangeEven t WHERE _MACHINE' AND A KeyPat th='Softwa re\\Temp'" " Hive='HKEY_LOCAL_ Register-WmiEvent t -Query $query -Act tion {Writ e-host "So omething changed"}    Once agaain.    [43]    . deleting a value is also o  considere ed modificattion and we receive a no otification.    $query = "Select * from RegistryValu ueChangeEv ent WHERE Hive='HKEY_LOCAL_ _MACHINE' AND A KeyPat th='Softwa re\\Temp' AND ValueName='Name e'" Register-WmiEvent t -Query $query -Act tion { If (( (Get-item HKLM:\SOFT TWARE\Temp ). thiss event notiffication also won’t give yyou any info ormation beyyond  sub key m modification n. in the ‐Action script block.

intel. So.com/sites/manageability/AMT_Implementation_and_Reference_Guide/d efault. Go and explore these using the examples we used  throughout.     For example.htm     This is it about extrinsic events in WMI. we got to use a method of our own to  detect what change generated the event notification. Similar to other  two event classes in the registry provider.Monitoring registry tree change events RegistryTreeChangeEvent can be used to monitor sub‐tree level modifications. We shall look at WMI timer events in the next chapter.htm?turl=WordDocuments%2Fwmievents.    $query = "Select * from RegistryTreeChangeEvent WHERE Hive='HKEY_LOCAL_MACHINE' AND RootPath=''" Register-WmiEvent -Query $query -Action { Write-host "Something changed" }    There are many vendor provided extrinsic event classes. this event class provides a notification that a change  occurred but won’t tell us about what had changed.      [44]    . take a look at how Intel ME WMI provider uses extrinsic events for firmware state  notifications:  http://software.

 For  exxample. we had to cap pture these b by creating aan instance of classes deerived from the  __TimerIInstruction class. th here are two o types of tim mer events. DayOfWeek property.Tiimer Even nts WMI timer events arre generated d by WMI inffrastructure  at a point in n time. The ere are a few w special pro operties thatt tell us whicch quarter o of the year. an instan nce of this cl ass represen nts the curreent date and d  As shown time. It always in ndicates Sunnday as zero irrespectivee of the systeem  culture and language e settings. Also. However.microso oft.  Prior to W Windows 2003. th hat isn’t neccessary anym more  with the introduction n of Win32_LocalTime and Win32_U UTCTime WM MI classes. w we can use tthe standard d WMI eventting model too consume ttimer eventss.85).aaspx [45]    . etc.  Especiallyy. In the good old d days  of Windo ows 2000.   1.    alTime11. In nterval Time er Events are e events thatt occur perioodically at sp pecified intervals. Absolute Tim A er Events occcur on a spe ecific day at a specific time. eve ery 30 minutes.        n in the abovve screensho ot. D Do refer to tthe MSDN lin nk for this cl ass and read d about thesse properties. Thiis class repreesents an insstance of  Let us takke a look at Win32_Loca Win32_C CurrentTime.com/en-us/liibrary/aa3941771(v=VS.  2.    11 Win32_L LocalTime on MSDN: http:///msdn. w week in the  current m month.. W With these tw wo  classes. we would use __AbssoluteTimerIInstruction cclass and  __Interva alTimerInstruction class to define these events.

 No  promises!    And. this class supports standard WMI eventing model. Now. this won’t be very useful unless we want to flood the consumer with a bunch of useless  messages every second. this is useful. we can also create event registrations for events occurring on specific day of every  quarter (Quarter) or specific week (WeekInMonth) of every month. we can use an intrinsic event query to  consume these events.    #Setup WQL query for DayOfWeek $query = "SELECT * FROM __InstanceModificationEvent WHERE TargetInstance ISA 'Win32_LocalTime' AND TargetInstance.Second=0" #Register WMI Event Register-WmiEvent -Query $Query -SourceIdentifier "Event-Every-Tuesday-1216PM" -Action {Write-Host "Start backup"}    The above example will never trigger a timer event because of the bug I mentioned.=3 AND TargetInstance.  Similarly. here is the catch: there is a bug that causes DayOfWeek to stop triggering any timer  events. We can use the            ‐Action script block to do something better like running a backup script when this event fires. For example.Hour=12 AND TargetInstance.30PM" -Action {Write-Host "Event Received"} In this example.    However. Note that the hour’s value is in 24 hour format.Minute=30 AND TargetInstance.  This is because the event fires every second and that is the smallest time segment supported. here is a workaround:  We just need to dupe WMI with a second DayOfWeek condition in the WHERE clause and this is  how we do it:  [46]    . This is a  known bug at this time which may be fixed in next release of the operating system. Let us look at another example:    #Setup WQL query $query = "SELECT * FROM __InstanceModificationEvent WHERE TargetInstance ISA 'Win32_LocalTime' AND TargetInstance.Since.30  hours.  Now.    #Setup WQL query $query = "SELECT * FROM __InstanceModificationEvent WHERE TargetInstance ISA 'Win32_LocalTime'" #Register WMI Event Register-WmiEvent -Query $Query -SourceIdentifier "Event-Every-Second" -Action {Write-Host "Event Received"} The above code will result in displaying “Event Received” message in the console every second.Minute=16 AND TargetInstance.Second=0" #Register WMI Event Register-WmiEvent -Query $Query -SourceIdentifier "Event-Every-Day-14.Hour=14 AND TargetInstance. we use WQL query to register for a WMI event that fires every day at 14.

Quarter=4) AND (TargetInstance. how to use WMI query language for creating WMI event queries and subscribe to WMI  events. one use is to be able to create complex scheduling tasks  that are not possible using the regular task scheduler. We just dupe WMI by putting a dummy DayOfWeek #Condition #WMI seems to be firing the timer event properly when there are multiple #DayOfWeek Conditions $query = "Select * from __InstanceModificationEvent WHERE (TargetInstance ISA 'Win32_LocalTime') AND (TargetInstance. For example.DayOfWeek=9) AND (TargetInstance.DayOfWeek=5 OR TargetInstance.  [47]    . we are subscribing to the timer event that occurs on every Thursday of every fourth  week of a month in the third quarter of every year. And. what are these timer events used for? I have not come across a real need for timer events  in system administration.Minute=41) AND (TargetInstance.Hour=19) AND (TargetInstance. This type of scheduling isn’t possible with  the regular scheduler.  #Here is the workaround.    So.  so far.    This brings us to end of discussion on the different types of WMI event queries. We have seen. check the above code itself. We just use this dummy  value to make the query work.Second=0)" Register-WmiEvent -Query $query -Action {Write-Host "Event Arrived"}   In the above timer event query. we used DayOfWeek multiple times in the WHERE clause. However.WeekInMonth=1) AND (TargetInstance. we used ‘9’ as one of the values for DayOfWeek property.  if you observe closely. This has no  impact on the outcome of the query since there is no 9th day of week.  Using that.

 Usin ng a schema query.    ws how a WMI query waas  To underrstand what I just said. how are the schema queries diffferent from tthe data queeries  using the ese two keyw words?    e above keyw words return n class definitions only w when there aare instances of those  Well. Here is an example of a  schema q query:    $query = "SELECT * FROM meta_class where w __th is ISA 'Wi in32_Process'" Get-WmiObject -Qu uery $query | Format t-List    And.    $query = "REFEREN NCES OF {Win32_Proce ess=$pid} W WHERE Clas ssDefsOnly y" Get-WmiObject -Qu uery $query | Format t-List    See the {{Win32_Proccess=$pid} p part of the qu uery. SSo.  up with an error while exxecuting the e query. Now w. we looked aat retrievingg class definitions with A and REFEERENCES OF keywords. In the above e example. thiss is what you u would see w when you exxecute the ccode:      ASSOCIATORS OF  In one off the earlier discussions. [48]    . we can retrieve tthe class deffinitions eveen when there is  no instan nce present. In simp ple words. take a look at this exampple that show built whe en using REFFERENCES OFF. if yyou need to o find out whhat type of in nformation ((this is whatt  schema rreally meanss) a specific cclass holds. w we used $PID D automaticc variable. That is the ddifference. We did d not specifyy any kind off an identifieer or propertty anywheree and  we were still able to get the class definition. yyou use scheema queriess.WMI Sche ema Q Queries Schema q queries are u used to retriieve class de efinitions (raather than class instancees) and schema  associations. We haave to specifyy some iden ntifier so that we  can get aan instance. $P PID is the pro ocess  ID of the PowerShell host. the classes present. If we d don’t specifyy a PID or soome other id dentifier to gget the instance. go back an nd take a loo ok at how w we  we end u wrote the schema qu uery.

 When building schema queries.   [49]    . And. You can also use REFERENCES OF and  ASSOCIATORS OF keywords to get schema associations.    Using __this __this is a special property that identifies the target class for the query and using an ISA  operator is must. is to use a WHERE clause. The only way  to narrow down the results.  Unlike other queries. returns the class definitions of Win32_LogicalDisk and all its subclasses. It has to be SELECT *  always. You can use the SchemaOnly qualifier  in the WHERE clause to retrieve the schema associations of a class.  Using __Class Using __Class. This requests the definitions for the subclasses of the target class. when using schema queries. you cannot do something like SELECT xyz FROM abc. the use of meta_class specifies that we are building a schema query.  Let us dig a bit in to the schema query syntax. we can request for the class definitions of a single class and this is how we do it:  $query = "SELECT * FROM meta_class where __class='Win32_LogicalDisk'" Get-WmiObject -Query $query | Format-List This is a brief overview of schema queries. Let us now  look at a few ways to narrow the query results. only “*” is supported. We seldom need to use schema queries and IT Pros  will probably never have to use this type of queries.    We are familiar with the SELECT keyword. Here is how  you use this method:  $query = "SELECT * FROM meta_class where __this ISA 'Win32_LogicalDisk'" Get-WmiObject -Query $query | Format-List This when executed.

 We have seen several examples already using Register‐WMIEvent cmdlet.  this requires no further explanation.  1. This is just a  bonus chapter that helps you understand WMI event consumer concepts. We will no more receive any WMI event  notifications. However. WMI abstracts this information from consumers. A  permanent event consumer uses a set of persistent objects and filters to capture a WMI event.85). When an event occurs that matches a filter. Register‐WMIEvent creates  only temporary event consumers. WMI just passes the relevant notifications from providers to  consumers. Temporary event consumers  2. For example. As  mentioned at the beginning of this discussion on event queries.com/en-us/library/aa393013(v=vs. Because a permanent consumer is implemented in  the WMI repository and is an executable file that is registered in WMI. the Register‐WMIEvent cmdlet creates a temporary event  consumer.    Event consumers are applications that request notification of an event and then perform an  action in response to that specific event. Hence.  Like a temporary event consumer. Register‐WMIEvent. WMI loads the permanent event  consumer and notifies it about the event. we set up a series of WMI objects and filters that capture a  WMI event. This chapter has no direct relation to learning WMI query language. Permanent event consumers  Temporary Event consumers A temporary event consumer can receive event notifications only while it is active. the permanent event  consumer operates and receives events after it is created and even after a reboot of the  operating system as long as WMI is running. Event consumers use an event filter to register with WMI to receive the event  notifications and these consumers have no idea if the event providers support intrinsic events  or extrinsic events.     There are two types of event consumers in WMI. where we registered for the event  notifications.  12 Permanent Event Consumers: http://msdn. the event registration will be lost.    Permanent Event consumers A permanent consumer12 is a COM object that can receive a WMI event at all times. we shall look at types of event consumers and how to create these event  consumers. The  temporary event registrations are stored in memory and hence. The PowerShell cmdlet we used in our examples so far  creates an event consumer too. What are these event consumers? What are the different  types of event consumers?    In this chapter.microsoft.WMI Event Consumers We have used the PowerShell cmdlet.aspx#event_consumers [50]    . will be lost when the hosting  application closes. to create these event subscribers. once we close the PowerShell console.

 This  consumer is available on Windows XP and  later versions.aspx [51]    . This consumer  is available on Windows XP and later versions.microsoft.  CommandLineEventConsumer  Launches an arbitrary process in the local  system context when an event is delivered to  it. An  instance of the above physical consumer is called a logical consumer.aspx Logical Event consumers: http://msdn.     WMI comes preinstalled with a five standard consumer13 classes. WMI automatically loads the COM object that represents the permanent event  13 14 Standard consumer classes: http://msdn. Here is what MSDN  documentation14 says about logical event consumers:    The properties of a logical event consumer specify the actions to perform when notified  of an event.  A permanent event consumer can receive event notifications whether it is active or inactive. creating an  instance of one of the above consumer classes and binding the filter & consumer together. If  an event takes place and a permanent consumer is not currently active. This consumer is available on Windows  2000. the permanent consumers have to be unregistered  explicitly.  LogFileEventConsumer  Writes customized strings to a text log file  when events are delivered to it.     A permanent event consumer receives events until its registration is explicitly canceled and  unlike temporary event consumers.com/en-us/library/aa393014(v=vs. This consumer  is available on Windows 2000.  NTEventLogEventConsumer  Logs a specific message to the Windows NT  event log when an event is delivered to it. When  signaled.  SMTPEventConsumer  Sends an e‐mail message using SMTP each  time an event is delivered to it.85).85).com/en-us/library/aa393649(v=vs. The permanent event consumers are useful  in scenarios where we don’t need to have consumer active all the time in memory. then WMI tried to load  the event consumer before forwarding the event. but do not define the event queries with which they are associated. This consumer is available on Windows XP  and later versions    Creating a WMI permanent event consumer includes creating an event filter.microsoft. XP and later versions. They are:    Event Consumer type  Description  ActiveScriptEventConsumer  Executes a predefined script in an arbitrary  scripting language when an event is delivered  to it. XP and later  versions.

 Typically. we stored  the path to the newly created event filter in $newFilter.Path    The above example shows how to create an event filter.\root\subscription:__EventFilter").  An event filter also describes the conditions under which WMI delivers the events.    #Creating a new event filter $instanceFilter = ([WMICLASS]"\\. At the end of the example.CreateInstance() $instanceFilter.Name = "EventFilter1" $result = $instanceFilter.    Note  All the below steps require administrative privileges and hence should be run at an  elevated command prompt.Path    [52]    .Put() $newConsumer = $result.Text = "New process has been created: %TargetInstance.    Creating an event filter An event filter is a WMI class that describes which events WMI delivers to a physical consumer. Creating an  event filter involves creation of an instance of __EventFilter WMI class. The logical consumer represents  the physical consumer to WMI. we must create an instance of the physical consumer.ProcessName%" $result = $instanceConsumer.Name = "EventConsumer1" $instanceConsumer. The  below code shows we create a logical consumer:    #Creating a new event consumer $instanceConsumer = ([wmiclass]"\\. we shall  use LogFileEventConsumer type.QueryLanguage = "WQL" $instanceFilter.consumer into active memory.Query = "Select * from Win32_ProcessStartTrace" $instanceFilter.\root\subscription:LogFileEventConsumer").log" $instanceConsumer.     Creating a logical consumer Like any other WMI class.     Let us now look at how we can create an instance of LogFileEventConsumer.    Let us now see the steps in creating a permanent event consumer. The main purpose of a logical consumer is to provide the  physical consumer with the parameters for the activities the physical consumer performs. After being activated. For this example.Put() $newFilter = $result. For example.FileName = "C:\Scripts\processLog.CreateInstance() $instanceConsumer. but remains until specifically unloaded by the operating system. An instance of  a physical consumer class is also known as a logical consumer. the permanent event consumer acts as a normal  event consumer. this occurs during startup or in response to a  triggering event.

0 module designed to facilitate the ease of creating.com [53]    .text really depends on what we  want to write to the log file. there are four more permanent event consumers.    15 16 Trevor’s Blog: http://trevorsullivan. the value we provide to $instanceConsumer. and deleting WMI (Windows Management Instrumentation) permanent event  registrations. We specified the name of the log file as processLog.    We now understand how to create a LogFileEventConsumer for permanent event notifications. as you see in the  above examples.     To make this process easy. consumers. Let us  now go ahead and bind them together.  updating.CreateInstance() $instanceBinding.    So. Now. you can perform  advanced monitoring functions on a workstation or server that would otherwise require  implementation of an enterprise monitoring product. Trevor Sullivan15 created a PowerShell module called PowerEvents16. Also. whenever a new process gets created we  should see an entry in the log file under C:\scripts location.Text. PowerEvents makes it easy to create WMI event filters (define the events you  want to capture) and event consumers (responders to events). and then bind them together to  initiate the flow of events.Notice that these physical consumers exist in the root\subscription namespace. Now.Log under  C:\Scripts.  This module can be used to any of the five permanent standard event consumers. This is how we do it:    #Bind filter and consumer $instanceBinding = ([wmiclass]"\\.\root\subscription:__FilterToConsumerBinding"). So.Put()  This is it. The %TargetInstance.  This can be quite complex too depending what logical consumer you want to create.    Binding Event Filter and Consumer Binding the event filter and consumer are straightforward. and binding them together is quite verbose.Consumer = $newConsumer $result = $instanceBinding.codeplex. very detailed monitoring can be performed using almost any of the  WMI objects that exist on a computer.net PowerEvents: http://powerevents.    Introducing PowerEvents PowerEvents is a Windows PowerShell v2.Filter = $newFilter $instanceBinding. notice the  $instanceConsumer.ProcessName% is the name of the process that  gets created. we have the path to the new LogFileEventConsumer in the $newConsumer variable. the creation of filters. Also. we have all the steps complete. By leveraging permanent event registrations.  As shown earlier. Because WMI is incredibly vast in the  information it provides.

Minute=0) AND (TargetInstance.  $query = "Select * from __InstanceModificationEvent WHERE (TargetInstance ISA 'Win32_LocalTime') AND (TargetInstance. New‐WmiEventConsumer  4.DayOfWeek=4 OR TargetInstance.Hour=12) AND (TargetInstance. New‐WmiFilterToConsumerBinding  Let us now see how we can use PowerEvents module to create permanent event consumers.    $cmdConsumer = New-WmiEventConsumer -Verbose -Name "bkConsumer1" ConsumerType CommandLine -CommandLineTemplate "cmd.  We shall create a scheduled task using WMI timer events and WMI command‐line event  consumer.You can download the module and import the same using Import‐Module cmdlet. You have the event filter created. To do this. Also. we will  use New‐WMIFilterConsumerBinding cmdlet.bat`"" The ‐CommandLineTemplate takes the path to the backup script. Get‐WmiEventFilter  3.    Now that we have both filter and consumer.     1.exe /c `"C:\Scripts\backup. New‐WmiEventFilter  5. This module  has the following cmdlets to support creation of permanent event consumers.Quarter=3) AND (TargetInstance. note that the  ConsumerType is set to CommandLine in this case.  [54]    . Get‐WmiEventConsumer  2. let us bind them together.    Creating an event filter PowerEvents module provides a cmdlet to create an event filter — New‐WMIEventFilter.    Binding Event filter and consumer We need to bind the event filter and the consumer together so that the backup script gets  invoked when the timer event gets triggered on the specified date & time. Let us see how to  create a command‐line event consumer.DayOfWeek=9) AND (TargetInstance.WeekInMonth=4) AND (TargetInstance.Second=0)" $taskFilter = New-WmiEventFilter -Name "WQL for 3rd quarter timer event" Query $query This is it. The idea is to invoke a backup script when the event  fires.     Creating an event consumer The cmdlet for creating an event consumer is New‐WMIEventConsumer.

 The backup script gets triggered once the timer event gets fired.New-WmiFilterToConsumerBinding -Filter $taskFilter -Consumer $cmdConsumer Verbose    This is it. This is just one  example of creating complex scheduling tasks using WMI timer events. using PowerEvents  makes it easy to create permanent event consumers. And. Go and explore!  [55]    .