private void UpdateValueCollectionChanges(string attrName, ADPropertyValueCollection valueCollection, DirectoryAttributeModificationCollection mods) { DirectoryAttributeModification directoryAttributeModification; if (valueCollection != null) { if (!valueCollection.TrackChanges) { directoryAttributeModification = this.CreateDirAttrModification(attrName, valueCollection, null); mods.Add(directoryAttributeModification); } else { if (!valueCollection.IsValuesCleared) { if (valueCollection.ReplacedValues.Count <= 0) { if (valueCollection.DeletedValues.Count > 0) { directoryAttributeModification = this.CreateDirAttrModification(attrName, valueCollection.DeletedValues, null); directoryAttributeModification.Operation = DirectoryAttributeOperation.Delete; mods.Add(directoryAttributeModification); } if (valueCollection.AddedValues.Count > 0) { directoryAttributeModification = new DirectoryAttributeModification(); directoryAttributeModification.Operation = DirectoryAttributeOperation.Add; this.CreateDirAttrModification(attrName, valueCollection.AddedValues, directoryAttributeModification); mods.Add(directoryAttributeModification); return; } } else { directoryAttributeModification = this.CreateDirAttrModification(attrName, valueCollection.ReplacedValues, null); mods.Add(directoryAttributeModification); return; } } else { directoryAttributeModification = new DirectoryAttributeModification(); directoryAttributeModification.Name = attrName; directoryAttributeModification.Operation = DirectoryAttributeOperation.Delete; mods.Add(directoryAttributeModification); return; } } return; } else { directoryAttributeModification = new DirectoryAttributeModification(); directoryAttributeModification.Name = attrName; directoryAttributeModification.Operation = DirectoryAttributeOperation.Delete; mods.Add(directoryAttributeModification); return; } }
/// <summary> /// Collect the set of pending modifications for sending to the LDAP DSA /// </summary> /// <returns></returns> internal DirectoryAttributeModificationCollection ChangesAsDAMC() { DirectoryAttributeModificationCollection damc = new DirectoryAttributeModificationCollection(); foreach (DirectoryAttributeModification dam in _changes.Values) damc.Add(dam); return damc; }
public void Update() { ADPropertyValueCollection value; this.Init(); DebugLogger.WriteLine("ADActiveObject", string.Concat("Update called for ", this._adObject.DistinguishedName)); DirectoryAttributeModificationCollection directoryAttributeModificationCollection = new DirectoryAttributeModificationCollection(); if (!this._adObject.TrackChanges) { bool flag = false; foreach (KeyValuePair<string, ADPropertyValueCollection> keyValuePair in this._adObject) { string key = keyValuePair.Key; if (flag || string.Compare(key, "distinguishedName", StringComparison.OrdinalIgnoreCase) != 0) { value = keyValuePair.Value; this.UpdateValueCollectionChanges(key, value, directoryAttributeModificationCollection); } else { flag = true; } } } else { foreach (string addedProperty in this._adObject.AddedProperties) { value = this._adObject[addedProperty]; this.UpdateValueCollectionChanges(addedProperty, value, directoryAttributeModificationCollection); } foreach (string removedProperty in this._adObject.RemovedProperties) { DirectoryAttributeModification directoryAttributeModification = new DirectoryAttributeModification(); directoryAttributeModification.Name = removedProperty; directoryAttributeModification.Operation = DirectoryAttributeOperation.Delete; directoryAttributeModificationCollection.Add(directoryAttributeModification); } foreach (string modifiedProperty in this._adObject.ModifiedProperties) { value = this._adObject[modifiedProperty]; this.UpdateValueCollectionChanges(modifiedProperty, value, directoryAttributeModificationCollection); } } if (directoryAttributeModificationCollection.Count != 0) { DirectoryAttributeModification[] directoryAttributeModificationArray = new DirectoryAttributeModification[directoryAttributeModificationCollection.Count]; directoryAttributeModificationCollection.CopyTo(directoryAttributeModificationArray, 0); ADModifyRequest aDModifyRequest = new ADModifyRequest(this._adObject.DistinguishedName, directoryAttributeModificationArray); PermissiveModifyControl permissiveModifyControl = new PermissiveModifyControl(); aDModifyRequest.Controls.Add(permissiveModifyControl); if (this._sdFlags != SecurityMasks.None) { aDModifyRequest.Controls.Add(new SecurityDescriptorFlagControl(this._sdFlags)); } this._syncOps.Modify(this._sessionHandle, aDModifyRequest); DebugLogger.WriteLine("ADActiveObject", string.Concat("Update succeeded for ", this._adObject.DistinguishedName)); return; } else { return; } }