[python-win32] "Property '%s.%s' can not be set" on read/write attribute

Tim Golden mail at timgolden.me.uk
Wed Jan 30 10:28:15 CET 2008


Tim Johnson wrote:
> import wmi
> site = 'MV1'
> wmi_server = 'mtv-sql-2'
> resource = 23012
> wmi_namespace = 'root\\sms\\site_%s' % site
> conn = wmi.WMI(computer=wmi_server, namespace=wmi_namespace)
> coll = conn.Get('SMS_Collection.CollectionID="MV100362"')
> rule = conn.Get('SMS_CollectionRuleDirect').SpawnInstance_()
> rule.ResourceID = resource
> rule.RuleName = 'ResourceID: ' +str(resource)
> rule.ResourceClassName = 'SMS_R_System'
> coll.AddMembershipRule(rule)

As an aside from the error messages you're getting, the wmi
module has some slightly more Pythonic support for what
you're doing there. Something like this (untested) should
work:

<code - untested>
import wmi

site = 'MV1'
wmi_server = 'mtv-sql-2'
resource = 23012

conn = wmi.WMI (computer=smi_server, namespace="sms/site_%s" % site)
coll = conn.get ('SMS_Collection.CollectionID="MV100362"')
#
# or, using the more common wmi idiom
#
# coll = conn.SMS_Collection (CollectionID="MV100362")[0]

rule = conn.SMS_CollectionRuleDirect.new (
   ResourceID=resource,
   RuleName="ResourceID: " + str (resource),
   ResourceClassName = "SMS_R_System"
)
coll.AddMembershipRule (rule)

</code>

FWIW, this stuff is covered in the tutorial:
http://timgolden.me.uk/python/wmi-tutorial.html#creating-wmi-objects

Obviously, your code should also work as the module simply passes
the .Get method call through to the underlying WMI object. It also,
as a matter of fact, offers a local version .get which wraps the
result. The wrapped version is handy if you want to do things with
the properties and methods, but offers little if you're just passing
the whole thing along as an opaque object.

TJG


More information about the python-win32 mailing list