[python-win32] Question concerning wmi c.CIM_DataFile

Tim Roberts timr at probo.com
Mon Jan 4 19:57:45 CET 2010


Kelvin Lomboy Mendez wrote:
>
> I’m currently writing a script to access approximately 400 computers
> for removing a particular app from the system. I’m having problems
> getting results using the wmi c.CIM_DataFile (name=file). When I use
> file as a variable which equals to the path to the app I want to
> remove I don’t get nothing back, however, if I hard code the path, I
> get results. See snippet below for an example of what I’m talking
> about. I appreciate in advance for any help I can get. Thank you.
>
>  
>
> import wmi
>
> import re
>
>  
>
> def queryFile(file, host):
>
>     print '[Debug nukeXmas()]:' + file
>
>     c = wmi.WMI(host)
>
>     for f in c.CIM_DataFile (name=file):
>
>         print 'Install Date:', f.InstallDate
>
>        
>
> def queryFile2(file, host):
>
>     print '[Debug nukeXmas()]:' + file
>
>     c = wmi.WMI(host)
>
>     for f in c.CIM_DataFile
> (name="C:\\DOCUME~1\\profileName\\LOCALS~1\\Temp\\Temporary Directory
> 1 for deluxetreee (2).zip\\Christmas.exe"):
>
>         print 'Install Date:', f.InstallDate
>
>        
>
>  #File to query      
>
> string = "C:\DOCUME~1\profileName\LOCALS~1\Temp\\Temporary Directory 1
> for deluxetreee (2).zip\Christmas.exe"
>
>  
>
> #Substitute "\" to "\\"
>
> path = re.sub('\\\\', '\\\\\\\\', string)
>

Don't do this.  You WANT the string to contain single backslashes.  This
is one of the most confusing things about working with strings in Python
on Windows.  Here's a test.  How many characters are in this string?

    xyz = "a\\b\tc"

The answer is 5.  There's a letter "a", a backslash, a letter "b", a
tab, and a letter "c".

When you pass a file name into an API, the name should only contain
single backslashes (or forward slashes -- both work equally well in the
Win32 API).  In order to GET single backslashes in a Python string
literal, you need to type TWO (or use the raw r"string" concept), but
the string itself only contains one.

> #Close query path with double quotes
>
> file = '"'+path+'"'
>

Don't do this either.  The file name does not contain quotes.  If you
are typing the file name on a command-line, you have to provide quotes
so they get handled by the command line parser properly, but when you're
calling an API, you should NEVER use quotes.

> #I'm having problems here, query brings back nothing
>
> queryFile(file, '172.27.1.5')
>

Right, because the file name you are passing here is literally this:
    "C:\\DOCUME~1\\profileName\\LOCALS~1\\Temp\\Temporary Directory 1
for deluxetreee (2).zip\\Christmas.exe"

>  
>
> #Here, I hard code the path to the exe and it works
>
> queryFile2(file, '172.27.1.5')
>

Right, because the file name you are passing here is literally this:
    C:\DOCUME~1\profileName\LOCALS~1\Temp\Temporary Directory 1 for
deluxetreee (2).zip\Christmas.exe

And THAT is what the file name really is.

By the way, your whole concept is loony.  This will not work at all on
Vista or Win 7, because the "Documents and Settings" tree is now called
"Users".  You are assuming that every system is going to have this file
as "...tree (2).zip", but depending on how many times it has been
downloaded, it might be called something different (like "...tree.zip"
or "...tree(3).zip").  Further, the directory names you are using are
configurable.  They don't have to be called "Documents and Setting" or
"Local Settings", and they don't have to be located on "C:".  You should
be using the shell folder APIs to find the names of the "well-known
folders".

Plus, the whole "Local Settings\Temp" folder is volatile.  You should
just be able to wipe out that whole directory without causing any damage.

-- 
Tim Roberts, timr at probo.com
Providenza & Boekelheide, Inc.



More information about the python-win32 mailing list