Solved

Using a variable filter in WQUERY for WMI

Posted on 2008-10-16
8
448 Views
Last Modified: 2013-11-27
How can you create in C++ a WQL that allows you to use a variable instead of a fixed expression as the filter in WMI
0
Comment
Question by:cotosl
  • 4
  • 4
8 Comments
 
LVL 49

Expert Comment

by:DanRollins
ID: 22744768
I don't undertand the question:  With WMI, one uses a scripting language to, for instance, execute a SQL SELECT statement.  The statement that you pass may include string literals as well as text held in variables.  
Perhaps if you provide some more details about what you are trying to acccomplish, the question will be clarified.
0
 

Author Comment

by:cotosl
ID: 22747010
DanRollins:

Attached is an example of an ExecQuery(). What I want to know is how you can do an ExecQuery for WMI with a filter variable for the "Where" instead of the fixed 'anExecutableName.exe'. The idea is to be able to receive a list of processes and then use the ExecQuery() to return the process information for only the processes in the list.
hres = pSvc->ExecQuery(
        bstr_t("WQL"), 
        bstr_t("SELECT * FROM Win32_Process Where Name = 'anExecutableName.exe'"),
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, 
        NULL,
        &pEnumerator);

Open in new window

0
 
LVL 49

Expert Comment

by:DanRollins
ID: 22750465
You could skip the WHERE clause and just use the enumerator to examine each process.  There is an example here:
   Example: Getting WMI Data from the Local Computer
   http://msdn.microsoft.com/en-us/library/aa390423.aspx
(though it uses the Win32_OperatingSystem table, the process is similar)
You can focus the result set by using inequality operators in the SQL query syntax, such as:
    ...WHERE Name < 'S"
http://msdn.microsoft.com/en-us/library/aa394054(VS.85).aspx
http://msdn.microsoft.com/en-us/library/aa394605(VS.85).aspx
Perhaps the operator you really want is the LIKE operator which allows you to match character patterns.  For instance:

    ...WHERE Name LIKE "%ABC%"
Which will return process that contain th letters ABC anywhere in the name.  See
   LIKE Operator
   http://msdn.microsoft.com/en-us/library/aa392263(VS.85).aspx
0
Migrating Your Company's PCs

To keep pace with competitors, businesses must keep employees productive, and that means providing them with the latest technology. This document provides the tips and tricks you need to help you migrate an outdated PC fleet to new desktops, laptops, and tablets.

 

Author Comment

by:cotosl
ID: 22751244
The solutions proposed are valid but from them the one closer to what I was looking for is the one using the iterator. What I dont like about it is going over all results when they can be filtered from the very begining. Maybe the question should be how to construct the query using a variable outside of _bstr_t()and then plug it in the _bstr-t().
0
 
LVL 49

Accepted Solution

by:
DanRollins earned 150 total points
ID: 22751437
It is possible to build the SELECT statement by concatening strings. For instance:
CString sStmt;
sStmt="SELECT * FROM Win32_Process Where Name LIKE '%";
sStmt += sVarToMatch; // eg, ABC or .EXE
sStmt += "%' ";
hres = pSvc->ExecQuery( bstr_t("WQL"),
bstr_t( sStmt ),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL, &pEnumerator
);
If that does not help you, then please provide some examples of what variables you would like to plug into the SELECT statement, and I'll show you how to do it.
0
 

Author Comment

by:cotosl
ID: 22753082
One thing I noticed was that if you try to initialize the variable when you define it the compile fails. But if you define it and then you set its value it will work (see code).  Do you have any idea why this happen.



// This will generate an error
CString sVarToMatch = "ABC" 
 
// This will work fine
CString sVarToMatch;
aVarToMatch = "ABC";

Open in new window

0
 
LVL 49

Expert Comment

by:DanRollins
ID: 22753735
It's a quirk of the C++ programming language that each statement must be terminated with a semicolon (;).
0
 

Author Comment

by:cotosl
ID: 22753810
Sorry for the mistake. The error with the semicolon was only on the message. The actual code does have the semicolon and you get the error.
0

Featured Post

The Eight Noble Truths of Backup and Recovery

How can IT departments tackle the challenges of a Big Data world? This white paper provides a roadmap to success and helps companies ensure that all their data is safe and secure, no matter if it resides on-premise with physical or virtual machines or in the cloud.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Issue: Unstable cursor in Windows XP and Windows runs extremely slow in that any click will bring up the Hour glass (sometimes for several seconds before giving you what you want) . Troubleshooting Process and the FINAL FIX: This issue see…
Today, still in the boom of Apple, PC's and products, nearly 50% of the computer users use Windows as graphical operating systems. If you are among those users who love windows, but are grappling to keep the system's hard drive optimized, then you s…
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.
The viewer will be introduced to the technique of using vectors in C++. The video will cover how to define a vector, store values in the vector and retrieve data from the values stored in the vector.

813 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

15 Experts available now in Live!

Get 1:1 Help Now