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