private void RecursiveProcess(IOguObject oguObject)
        {
            if (oguObject != null && SynchronizeContext.Current.IsIncluded(oguObject))
            {
                SynchronizeContext.Current.ExtendLockTime();

                SynchronizeContext.Current.CurrentOguObject = oguObject;

                Debug.WriteLine("递归:OGU对象:" + oguObject.FullPath);

                //AD中是否找到对应的权限中心的对象
                ADObjectWrapper adObject = ADObjectFinder.Find(oguObject);

                if (oguObject.ObjectType == SchemaType.Groups)
                {
                    SynchronizeContext.Current.PrepareGroupToTakeCare(oguObject);                     //需注意的群组
                }

                if (adObject == null)                 //没找到,新增
                {
                    if (SynchronizeContext.Current.IsRealObject(oguObject))
                    {
                        Trace.WriteLine("AD中不存在决定新增" + oguObject.FullPath);
                        SynchronizeContext.Current.PrepareAndAddModifiedItem(oguObject, adObject, ObjectModifyType.Add);
                    }
                    else
                    {
                        Trace.WriteLine("不要新增AD中实际不存在的对象" + oguObject.FullPath);
                    }
                }
                else
                {
                    if (SynchronizeContext.Current.IsRealObject(oguObject))
                    {
                        //比较已经找到的两个对象的差异
                        Trace.Write("AD中存在,比较差异……");
                        //比较差异,也要考虑时间戳是否变化
                        ObjectModifyType compareResult = ObjectComparerHelper.Compare(oguObject, adObject);

                        Trace.WriteLine(compareResult);

                        if (compareResult != ObjectModifyType.None)                         // 修改
                        {
                            SynchronizeContext.Current.PrepareAndAddModifiedItem(oguObject, adObject, compareResult);
                        }
                    }
                    else
                    {
                        Trace.WriteLine("实际不存在,该删掉的对象:" + oguObject.FullPath);
                    }
                }

                if (oguObject.ObjectType == SchemaType.Organizations)
                {
                    //组织要检查是否有删除项,然后递归
                    ProcessOrganization((IOrganization)oguObject, adObject);
                }
            }
        }
예제 #2
0
        public override void Convert(ObjectModifyType modifyType, IOguObject srcObject, DirectoryEntry targetObject, string context)
        {
            SetterContext setterContext = new SetterContext();

            ConvertProperties(srcObject, targetObject, setterContext);

            targetObject.CommitChanges();

            DoAfterObjectUpdatedOP(srcObject, targetObject, setterContext);
        }
예제 #3
0
		public override void Convert(ObjectModifyType modifyType, IOguObject srcObject, DirectoryEntry targetObject, string context)
		{
			SetterContext setterContext = new SetterContext();

			ConvertProperties(srcObject, targetObject, setterContext);

			targetObject.CommitChanges();

			DoAfterObjectUpdatedOP(srcObject, targetObject, setterContext);
		}
예제 #4
0
        private static void DeleteADObject(ObjectModifyType modifyType, IOguObject oguObject, ADObjectWrapper adObject)
        {
            ADHelper adHelper = SynchronizeContext.Current.ADHelper;

            using (DirectoryEntry entry = SynchronizeHelper.GetSearchResultByID(adHelper, adObject.NativeGuid).GetDirectoryEntry())
            {
                entry.ForceBound();
                ObjectSetterHelper.Convert(modifyType, oguObject, entry);
            }
        }
예제 #5
0
        private static void ModifyADObjectProperties(ObjectModifyType modifyType, ModifiedItem item)
        {
            IOguObject      oguObject = item.OguObjectData;
            ADObjectWrapper adObject  = item.ADObjectData;

            using (DirectoryEntry entry = SynchronizeHelper.GetSearchResultByID(SynchronizeContext.Current.ADHelper, adObject.NativeGuid, (ADSchemaType)oguObject.ObjectType).GetDirectoryEntry())
            {
                entry.ForceBound();
                ObjectSetterHelper.Convert(modifyType, oguObject, entry);
            }
        }
		public override void Convert(ObjectModifyType modifyType, IOguObject srcObject, DirectoryEntry targetObject, string context)
		{
			SetterContext setterContext = new SetterContext();

			ConvertProperties(srcObject, targetObject, setterContext);

			targetObject.CommitChanges();

			if (!ObjectComparerHelper.AreParentPathEqaul(srcObject, targetObject))
				MoveItemToNewPath(srcObject, targetObject);

			DoAfterObjectUpdatedOP(srcObject, targetObject, setterContext);
		}
		protected override void ProcessDeleteEntry(ObjectModifyType modifyType, IOguObject srcObject, DirectoryEntry targetObject, string context)
		{
			List<ADObjectWrapper> allChildren = targetObject.FindAllChildrenUser();

			foreach (ADObjectWrapper child in allChildren)
			{
				using (DirectoryEntry subEntry = SynchronizeHelper.GetSearchResultByID(SynchronizeContext.Current.ADHelper, child.NativeGuid).GetDirectoryEntry())
				{
					subEntry.ForceBound();
					DisableAccount(subEntry);
				}
			}
		}
		public override void Convert(ObjectModifyType modifyType, IOguObject srcObject, DirectoryEntry targetObject, string context)
		{
			SetterContext setterContext = new SetterContext();

			ConvertProperties(srcObject, targetObject, setterContext);

			targetObject.CommitChanges();

			if (SynchronizeContext.Current.DefaultPassword.IsNotEmpty())
				targetObject.Invoke("SetPassword", SynchronizeContext.Current.DefaultPassword);

			DoAfterObjectUpdatedOP(srcObject, targetObject, setterContext);
		}
        protected override void ProcessDeleteEntry(ObjectModifyType modifyType, IOguObject srcObject, DirectoryEntry targetObject, string context)
        {
            List <ADObjectWrapper> allChildren = targetObject.FindAllChildrenUser();

            foreach (ADObjectWrapper child in allChildren)
            {
                using (DirectoryEntry subEntry = SynchronizeHelper.GetSearchResultByID(SynchronizeContext.Current.ADHelper, child.NativeGuid).GetDirectoryEntry())
                {
                    subEntry.ForceBound();
                    DisableAccount(subEntry);
                }
            }
        }
예제 #10
0
        public override ObjectModifyType Compare(IOguObject srcObject, ADObjectWrapper targetObject)
        {
            ObjectModifyType result = CompareProperties(srcObject, targetObject);

            //if (IsChildrenModified(srcObject, targetObject))
            //    result |= ObjectModifyType.ChildrenModified;

            if (targetObject.Properties.Contains("displayNamePrintable") == false || SynchronizeHelper.PermissionCenterInvolved.Equals(targetObject.Properties["displayNamePrintable"]) == false)
            {
                result |= ObjectModifyType.MissingMarker;
            }

            return(result);
        }
        public override void Convert(ObjectModifyType modifyType, IOguObject srcObject, DirectoryEntry targetObject, string context)
        {
            SetterContext setterContext = new SetterContext();

            ConvertProperties(srcObject, targetObject, setterContext);

            targetObject.CommitChanges();

            if (!ObjectComparerHelper.AreParentPathEqaul(srcObject, targetObject))
            {
                MoveItemToNewPath(srcObject, targetObject);
            }

            DoAfterObjectUpdatedOP(srcObject, targetObject, setterContext);
        }
        public override void Convert(ObjectModifyType modifyType, IOguObject srcObject, DirectoryEntry targetObject, string context)
        {
            SetterContext setterContext = new SetterContext();

            ConvertProperties(srcObject, targetObject, setterContext);

            targetObject.CommitChanges();

            if (SynchronizeContext.Current.DefaultPassword.IsNotEmpty())
            {
                targetObject.Invoke("SetPassword", SynchronizeContext.Current.DefaultPassword);
            }

            DoAfterObjectUpdatedOP(srcObject, targetObject, setterContext);
        }
        protected ObjectModifyType CompareProperties(IOguObject srcObject, ADObjectWrapper targetObject)
        {
            SchemaMappingInfo mappingInfo = PermissionCenterToADSynchronizeSettings.GetConfig().SchemaMappings.GetSchemaMappingInfo(srcObject.ObjectType.ToString());

            ObjectModifyType result = ObjectModifyType.None;

            foreach (ComparerPropertyMappingConfigurationElement propertyComparerElement in mappingInfo.ComparedProperties)
            {
                if (propertyComparerElement.Comparer.Compare(srcObject, propertyComparerElement.Name, targetObject, propertyComparerElement.TargetPropertyName, propertyComparerElement.Context) == false)
                {
                    result = ObjectModifyType.PropertyModified;
                    Trace.Write("(修改的属性Key: " + propertyComparerElement.Name + ")");
                    break;
                }
            }

            return(result);
        }
예제 #14
0
        public override void Convert(ObjectModifyType modifyType, IOguObject srcObject, DirectoryEntry targetObject, string context)
        {
            ADHelper adHelper = SynchronizeContext.Current.ADHelper;

            if (SynchronizeContext.Current.RecycleBinOU.IsNotEmpty())
            {
                ProcessDeleteEntry(modifyType, srcObject, targetObject, context);

                //ChangeEntryNameToFullPath(targetObject);

                using (DirectoryEntry parentEntry = adHelper.NewEntry(SynchronizeContext.Current.RecycleBinOU))
                {
                    DoTheMove(targetObject, parentEntry, srcObject);
                }
            }
            else
            {
                targetObject.DeleteTree();
            }
        }
예제 #15
0
        public static void Convert(ObjectModifyType modifyType, IOguObject srcObject, DirectoryEntry targetObject)
        {
            SchemaType schemaType           = GetOguSchemaType(targetObject);
            OguAndADObjectSetterBase setter = GetSetter(modifyType, schemaType);

            if (setter != null)
            {
                SchemaMappingInfo mappingInfo = PermissionCenterToADSynchronizeSettings.GetConfig().SchemaMappings.GetSchemaMappingInfo(schemaType.ToString());

                string context = string.Empty;

                if (mappingInfo.ModifyOperations.ContainsKey(modifyType.ToString()))
                {
                    SetterObjectMappingConfigurationElement objSetterMappingElement = mappingInfo.ModifyOperations[modifyType.ToString()];
                    context = objSetterMappingElement.Context;
                }

                setter.Convert(modifyType, srcObject, targetObject, context);
            }
        }
		public override void Convert(ObjectModifyType modifyType, IOguObject srcObject, DirectoryEntry targetObject, string context)
		{
			ADHelper adHelper = SynchronizeContext.Current.ADHelper;

			if (SynchronizeContext.Current.RecycleBinOU.IsNotEmpty())
			{
				ProcessDeleteEntry(modifyType, srcObject, targetObject, context);

				//ChangeEntryNameToFullPath(targetObject);

				using (DirectoryEntry parentEntry = adHelper.NewEntry(SynchronizeContext.Current.RecycleBinOU))
				{
					DoTheMove(targetObject, parentEntry, srcObject);
				}
			}
			else
			{
				targetObject.DeleteTree();
			}
		}
예제 #17
0
		public static void Convert(ObjectModifyType modifyType, IOguObject srcObject, DirectoryEntry targetObject)
		{
			SchemaType schemaType = GetOguSchemaType(targetObject);
			OguAndADObjectSetterBase setter = GetSetter(modifyType, schemaType);

			if (setter != null)
			{
				SchemaMappingInfo mappingInfo = PermissionCenterToADSynchronizeSettings.GetConfig().SchemaMappings.GetSchemaMappingInfo(schemaType.ToString());

				string context = string.Empty;

				if (mappingInfo.ModifyOperations.ContainsKey(modifyType.ToString()))
				{
					SetterObjectMappingConfigurationElement objSetterMappingElement = mappingInfo.ModifyOperations[modifyType.ToString()];
					context = objSetterMappingElement.Context;
				}

				setter.Convert(modifyType, srcObject, targetObject, context);
			}
		}
예제 #18
0
        private static OguAndADObjectSetterBase GetSetter(ObjectModifyType modifyType, SchemaType schemaType)
        {
            string schemaTypeName = schemaType.ToString();

            string cacheKey = "OguAndADObjectSetterBase" + "-" + modifyType.ToString() + "+" + schemaTypeName;

            return((OguAndADObjectSetterBase)ObjectContextCache.Instance.GetOrAddNewValue(cacheKey, (cache, key) =>
            {
                SchemaMappingInfo mappingInfo = PermissionCenterToADSynchronizeSettings.GetConfig().SchemaMappings.GetSchemaMappingInfo(schemaTypeName);

                OguAndADObjectSetterBase setter = null;

                if (mappingInfo.ModifyOperations.ContainsKey(modifyType.ToString()))
                {
                    SetterObjectMappingConfigurationElement objSetterMappingElement = mappingInfo.ModifyOperations[modifyType.ToString()];
                    setter = (OguAndADObjectSetterBase)PropertySettersSettings.GetConfig().ObjectSetters[objSetterMappingElement.OperationName].CreateInstance();
                }

                cache.Add(cacheKey, setter);

                return setter;
            }));
        }
예제 #19
0
		private static OguAndADObjectSetterBase GetSetter(ObjectModifyType modifyType, SchemaType schemaType)
		{
			string schemaTypeName = schemaType.ToString();

			string cacheKey = "OguAndADObjectSetterBase" + "-" + modifyType.ToString() + "+" + schemaTypeName;

			return (OguAndADObjectSetterBase)ObjectContextCache.Instance.GetOrAddNewValue(cacheKey, (cache, key) =>
			{
				SchemaMappingInfo mappingInfo = PermissionCenterToADSynchronizeSettings.GetConfig().SchemaMappings.GetSchemaMappingInfo(schemaTypeName);

				OguAndADObjectSetterBase setter = null;

				if (mappingInfo.ModifyOperations.ContainsKey(modifyType.ToString()))
				{
					SetterObjectMappingConfigurationElement objSetterMappingElement = mappingInfo.ModifyOperations[modifyType.ToString()];
					setter = (OguAndADObjectSetterBase)PropertySettersSettings.GetConfig().ObjectSetters[objSetterMappingElement.OperationName].CreateInstance();
				}

				cache.Add(cacheKey, setter);

				return setter;
			});
		}
예제 #20
0
		public void PrepareAndAddModifiedItem(IOguObject oguObject, ADObjectWrapper adObject, ObjectModifyType objectModifyType)
		{
			ModifiedItem item = new ModifiedItem() { OguObjectData = oguObject, ADObjectData = adObject, ModifyType = objectModifyType };

			if (oguObject.ObjectType == SchemaType.Groups)
			{
				this.ModifiedGroupItems.Add(item);
			}
			else
			{
				this.ModifiedOuAndUserItems.Add(item);
			}
		}
예제 #21
0
 /// <summary>
 /// 对象转换
 /// </summary>
 /// <param name="modifyType"></param>
 /// <param name="srcObject"></param>
 /// <param name="targetObject"></param>
 /// <param name="context"></param>
 public abstract void Convert(ObjectModifyType modifyType, TSource srcObject, TTarget targetObject, string context);
예제 #22
0
		private static void ModifyADGroupChildren(ObjectModifyType modifyType, ModifiedItem item)
		{
			ADHelper adHelper = SynchronizeContext.Current.ADHelper;
			IOguObject oguObject = item.OguObjectData;
			ADObjectWrapper adObject = item.ADObjectData;

			using (DirectoryEntry entry = SynchronizeHelper.GetSearchResultByID(adHelper, adObject.NativeGuid, ADSchemaType.Groups).GetDirectoryEntry())
			{
				entry.ForceBound();
				ObjectSetterHelper.Convert(modifyType, oguObject, entry);
			}
		}
예제 #23
0
		private static void DeleteADObject(ObjectModifyType modifyType, IOguObject oguObject, ADObjectWrapper adObject)
		{
			ADHelper adHelper = SynchronizeContext.Current.ADHelper;

			using (DirectoryEntry entry = SynchronizeHelper.GetSearchResultByID(adHelper, adObject.NativeGuid).GetDirectoryEntry())
			{
				entry.ForceBound();
				ObjectSetterHelper.Convert(modifyType, oguObject, entry);
			}
		}
		protected override void ProcessDeleteEntry(ObjectModifyType modifyType, IOguObject srcObject, DirectoryEntry targetObject, string context)
		{
			DisableAccount(targetObject);
		}
예제 #25
0
 protected override void ProcessDeleteEntry(ObjectModifyType modifyType, IOguObject srcObject, DirectoryEntry targetObject, string context)
 {
     DisableAccount(targetObject);
 }
예제 #26
0
        public void PrepareAndAddModifiedItem(IOguObject oguObject, ADObjectWrapper adObject, ObjectModifyType objectModifyType)
        {
            ModifiedItem item = new ModifiedItem()
            {
                OguObjectData = oguObject, ADObjectData = adObject, ModifyType = objectModifyType
            };

            if (oguObject.ObjectType == SchemaType.Groups)
            {
                this.ModifiedGroupItems.Add(item);
            }
            else
            {
                this.ModifiedOuAndUserItems.Add(item);
            }
        }
예제 #27
0
 protected virtual void ProcessDeleteEntry(ObjectModifyType modifyType, IOguObject srcObject, DirectoryEntry targetObject, string context)
 {
 }
		protected virtual void ProcessDeleteEntry(ObjectModifyType modifyType, IOguObject srcObject, DirectoryEntry targetObject, string context)
		{
		}