python create WMI instances

Tim Golden tim.golden at viacom-outdoor.co.uk
Fri Jun 10 08:26:05 EDT 2005


[Marc Wyburn]
| 
| Hi all, I am struggling with a vb - python code conversion.  I'm using
| WMI to create printers on remote machines using (in VB);
| 
| set oPrinter = oService.Get("Win32_Printer").SpawnInstance_
| 
| oPrinter.DriverName = strDriver
| oPrinter.PortName   = strPort
| oPrinter.DeviceID   = strPrinter
| oPrinter.Put_(kFlagCreateOnly)
| 
| In python I have logged onto the WMI service on the remote machine and
| I can run things like c.new.AddPrinterConnection so I know that I am
| connected and working OK.  I don't get any errors when I create a new
| object with SpawnInstance_ but when I try to set the value of
| oPrinter.Drivername I get an error saying that the Drivername object
| doesn't exist.  Does anyone know how to set the values of the object
| using either the method above or with the WMI module?  I think the WMI
| module only allows access to modify methods such ADDPrinterConnection
| or Create (from Win32_Service).

Not sure if I can help here or not, but just in case...

As far as I understand you, the fact that you're creating
on a remote machine is just an incidental, ie you'd have
the same problem doing this locally.

Part of the problem is that when VB does something
like:

oPrinter.DriverName = strDriver

what's really happening behind the scenes is something
like:

oPrinter.Properties_ ("DriverName").Value = strDriver

Now you can do that in Python. (In fact, that's what
the wmi module does when it overrides __setattr__, followed
by a Put_). So if you want to translate code fairly literally, 
then carry on as you were, but substitute the latter code for 
the former.

Having said that, the wmi module *can* create new instances
of classes. The problem is that I had/have little knowledge
of how WMI works in this area, so what I've done may not
be right. The method you're looking for is .new (aliased
as .new_instance_of) and if you use help on that method, 
you'll get this:

new(self, wmi_class) unbound wmi.WMI method
    Create a new <whatever>, typically something like
    Win32_Process, eg:

    c = wmi.WMI ("remote_machine")
    for p in c.Win32_Process (name="notepad.exe"): print p
    c.new ("Win32_Process").Create (CommandLine="notepad.exe")
    for p in c.Win32_Process (name="notepad.exe"): print p
    p.Terminate ()
    for p in c.Win32_Process (name="notepad.exe"): print p

Now this example works, but I notice from the code
that what I did to make it work was to remove the
SpawnInstance_ which I had, and replace it by an
instance retrieval. ie I just do a Get on the class.

I'll try to find some examples around of what you're
doing which, up till now, I've not really needed to
do. Meanwhile, I hope the above info is of some use.

Feel free to respond with questions or comments. This
can only get clearer!

TJG

________________________________________________________________________
This e-mail has been scanned for all viruses by Star. The
service is powered by MessageLabs. For more information on a proactive
anti-virus service working around the clock, around the globe, visit:
http://www.star.net.uk
________________________________________________________________________



More information about the Python-list mailing list