[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 ________________________________________________________________________ -- http://mail.python.org/mailman/listinfo/python-list