/// <summary> /// Content rules determine the mandatory and optional attributes of the class instances that are stored /// in the directory. /// </summary> /// <param name="obj">The object of model.</param> public static void CheckContent(ModelObject obj) { SetContainer <string> mustContain = new SetContainer <string>(); SetContainer <string> mayContain = new SetContainer <string>(); string[] ExcludeAttributes = { "instancetype", "ntsecuritydescriptor", "objectcategory", "objectsid" }; // Compute sets of may/must attribute string className = (string)obj[StandardNames.objectClass].UnderlyingValues.Last(); Sequence <string> superClassList = GetSuperClassList(obj.dc, className); foreach (string classId in superClassList) { ModelObject classObj; if (!obj.dc.TryGetClass(classId, out classObj)) { // will be reported in a different checker continue; } mustContain.AddRange(GetAttributeSet(classObj, StandardNames.mustContain)); mustContain.AddRange(GetAttributeSet(classObj, StandardNames.systemMustContain)); mayContain.AddRange(GetAttributeSet(classObj, StandardNames.mayContain)); mayContain.AddRange(GetAttributeSet(classObj, StandardNames.systemMayContain)); } //Removing default excluded attributes from this list. foreach (string attr in ExcludeAttributes) { if (mustContain.Contains(attr)) { mustContain.Remove(attr); } } // Check for all attributes string dn = (string)obj[StandardNames.shortName]; //For each attribute foreach (string attr in obj.attributes.Keys) { if (!ExcludeAttributes.Contains(attr)) { //This attribute is in must contain list. if (mustContain.Contains(attr)) { mustContain.Remove(attr); } //This attribute is not in must and may contian list. else if (!mayContain.Contains(attr)) { Checks.Fail("'{0}' must not contain attribute '{1}'", dn, attr); } } } //If must contain list is not empty, this object does not contain some must contain attributes. if (mustContain.Count > 0) { Checks.Fail( "'{0}' does not contain required attributes '{1}'", dn, String.Join(",", mustContain.ToArray())); } }