code: def RunWMIQuery(query, baseobj=r"winmgmts:\root\cimv2"):
    
    pythoncom.CoInitialize()  # Needs to be called if using com from a thread.
    wmi_obj = win32com.client.GetObject(baseobj)
    # This allows our WMI to do some extra things, in particular
    # it gives it access to find the executable path for all processes.
    wmi_obj.Security_.Privileges.AddAsString("SeDebugPrivilege")
  
    # Run query
    try:
      query_results = wmi_obj.ExecQuery(query)
    except pythoncom.com_error as e:
      raise RuntimeError("Failed to run WMI query \'%s\' err was %s" % (query, e))
  
    # Extract results from the returned COMObject and return dicts.
    try:
      for result in query_results:
        response = rdf_protodict.Dict()
        properties = (
            list(result.Properties_) +
            list(getattr(result, "SystemProperties_", [])))
  
        for prop in properties:
          if prop.Name not in IGNORE_PROPS:
            # Protodict can handle most of the types we care about, but we may
            # get some objects that we don't know how to serialize, so we tell the
            # dict to set the value to an error message and keep going
            response.SetItem(prop.Name, prop.Value, raise_on_error=False)
        yield response
  
    except pythoncom.com_error as e:
      raise RuntimeError("WMI query data error on query \'%s\' err was %s" %
                         (e, query))
docs: Run a WMI query and return a result.
  
    Args:
      query: the WMI query to run.
      baseobj: the base object for the WMI query.
  
    Yields:
      rdf_protodict.Dicts containing key value pairs from the resulting COM
      objects.