Modifies Managed Object in UCS.
		
		- inMo, if provided, it acts as the target object for the present operation. It should be None unless a user wants to provide an 
		  inMo. It can be a single MO or a list containing multiple managed objects.
		- classId of the managed object/s to be modified.
		- params contains semicolon (;) separated list of key/value pairs(key=value), that are used as filters for selecting specific managed 
		  objects. The key should be a valid property of the managed object to be modified.

def SetManagedObject(self, inMo, classId=None, params=None, dumpXml=None):
		"""
		Modifies Managed Object in UCS.
		
		- inMo, if provided, it acts as the target object for the present operation. It should be None unless a user wants to provide an 
		  inMo. It can be a single MO or a list containing multiple managed objects.
		- classId of the managed object/s to be modified.
		- params contains semicolon (;) separated list of key/value pairs(key=value), that are used as filters for selecting specific managed 
		  objects. The key should be a valid property of the managed object to be modified.
		"""
		from UcsBase import UcsUtils, ManagedObject, WriteUcsWarning, WriteObject, UcsException, UcsValidationException
		from Ucs import ClassFactory, Pair, ConfigMap

		if params != None:
			keys = params.keys()
		else:
			keys = []

		unknownMo = False
		dn = None
		obj = None
		configMap = None
		dnParamSet = False

		if (classId != None and classId != ""):
			metaClassId = UcsUtils.FindClassIdInMoMetaIgnoreCase(classId)
			if (metaClassId != None):
				classId = metaClassId
				moMeta = UcsUtils.GetUcsPropertyMeta(classId, "Meta")
			else:
				unknownMo = True

			for k in keys:
				if (k.lower() == "dn"):
					# ClassId And Dn Specified - No Parent Necessary
					dnParamSet = True
					dn = params[k]
					obj = ManagedObject(classId)
					for prop in keys:
						propMoMeta = UcsUtils.IsPropertyInMetaIgnoreCase(classId, prop)
						if (propMoMeta != None):
							if (prop.lower() == "rn" or prop.lower() == "dn"):
								pass
							elif (propMoMeta.access == UcsPropertyMeta.ReadOnly):
								# TODO: Add Warning/Error messages in Logger.
								WriteUcsWarning(
									"[Warning]: SetManagedObject [Description] Attempt to set non-writable property %s in Class %s" % (
										prop, classId))

							obj.setattr(propMoMeta.name, str(params[prop]))
						else:
							# Sets the unknown property/value as XtraProperty in obj
							obj.setattr(UcsUtils.WordL(prop), str(params[prop]))

					obj.setattr("Dn", dn)
					obj.setattr("Status", Status().MODIFIED)
					pair = Pair()
					pair.setattr("Key", obj.getattr("Dn"))
					pair.AddChild(obj)
					configMap = ConfigMap()
					configMap.AddChild(pair)

		if (dnParamSet == False):
			# ClassId is None, inMo Necessary
			if ((inMo == None) or (not isinstance(inMo, list)) or (len(inMo) == 0)):
				if (classId == None or classId == ""):
					raise UcsValidationException(
						'[Error]: SetManagedObject [Description]: inMo and ClassId are both not specified')
				# raise Exception('[Error]: SetManagedObject [Description]: inMo and ClassId are both not specified')
				else:
					raise UcsValidationException(
						'[Error]: SetManagedObject [Description]: inMo and Dn are both not specified')
					# raise Exception('[Error]: SetManagedObject [Description]: inMo and Dn are both not specified')

			configMap = ConfigMap()
			for mo in inMo:
				obj = ManagedObject(mo.propMoMeta.name)
				dn = mo.getattr("Dn")

				if (classId == None or classId == ""):
					classId = mo.propMoMeta.name
				elif (classId.lower() != (
						mo.propMoMeta.name).lower()):  # check that classId(just in case classId have value) and parentMo's classId is equal.
					# TODO: Add Warning/Error messages in Logger.
					WriteUcsWarning(
						"[Warning]: SetManagedObject [Description] ClassId does not match with inMo's classId.")
					classId = mo.propMoMeta.name

				for prop in keys:
					propMoMeta = UcsUtils.IsPropertyInMetaIgnoreCase(classId, prop)
					if (propMoMeta != None):
						if (prop.lower() == "rn" or prop.lower() == "dn"):
							pass
						elif (propMoMeta.access == UcsPropertyMeta.ReadOnly):
							# TODO: Add Warning/Error messages in Logger.
							WriteUcsWarning(
								"[Warning]: SetManagedObject [Description] Attempt to set non-writeable property %s in Class %s" % (
									prop, classId))

						obj.setattr(propMoMeta.name, str(params[prop]))
					else:
						# Sets the unknown property/value as XtraProperty in obj
						obj.setattr(UcsUtils.WordL(prop), str(params[prop]))

				obj.setattr("Dn", dn)
				obj.setattr("Status", Status().MODIFIED)
				pair = Pair()
				pair.setattr("Key", obj.getattr("Dn"))
				pair.AddChild(obj)
				configMap.AddChild(pair)

		if (configMap != None):
			ccm = self.ConfigConfMos(configMap, YesOrNo.FALSE, dumpXml)
			if ccm.errorCode == 0:
				moList = []
				for child in ccm.OutConfigs.GetChild():
					if (isinstance(child, Pair) == True):
						for mo in child.GetChild():
							moList.append(mo)
					elif (isinstance(child, ManagedObject) == True):
						moList.append(child)
				# WriteObject(moList)
				return moList
			else:
				raise UcsException(ccm.errorCode, ccm.errorDescr)