Solved

Using a variable filter in WQUERY for WMI

Posted on 2008-10-16
8
453 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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
MS Dynamics Made Instantly Simpler

Make Your Microsoft Dynamics Investment Count  & Drastically Decrease Training Time by Providing Intuitive Step-By-Step WalkThru Tutorials.

 

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

Simplifying Server Workload Migrations

This use case outlines the migration challenges that organizations face and how the Acronis AnyData Engine supports physical-to-physical (P2P), physical-to-virtual (P2V), virtual to physical (V2P), and cross-virtual (V2V) migration scenarios to address these challenges.

Question has a verified solution.

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

We have adopted the strategy to use Computers in Student Labs as the bulletin boards. The same target can be achieved by using a Login Notice feature in Group policy but it’s not as attractive as graphical wallpapers with message which grabs the att…
Go is an acronym of golang, is a programming language developed Google in 2007. Go is a new language that is mostly in the C family, with significant input from Pascal/Modula/Oberon family. Hence Go arisen as low-level language with fast compilation…
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.
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.

691 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