protected override void SetPropertyValue(IOguObject srcOguObject, string srcPropertyName, DirectoryEntry entry, string targetPropertyName, string context, SetterContext setterContext) { string srcPropertyValue = GetNormalizeddSourceValue(srcOguObject, srcPropertyName, context); string targetPropertyValue = GetNormalizeddTargetValue(entry, targetPropertyName, context); if (srcOguObject.FullPath == SynchronizeContext.Current.SourceRootPath) { srcPropertyValue = new PathPartEnumerator(SynchronizeContext.Current.TargetRootOU).Last(); //极其特别,不一定可靠,权限中心应限制更改这一组织的名称和位置。 } else { string relativePath = SynchronizeHelper.GetRelativePath(srcOguObject); if (relativePath.IndexOf('\\') < 0) { srcPropertyValue = SynchronizeContext.Current.GetMappedName(srcPropertyValue); } } if (srcPropertyValue != targetPropertyValue && entry.IsBounded() == true) { TraceItHere(srcOguObject, srcPropertyName, entry, targetPropertyName, context, srcPropertyValue, targetPropertyValue); entry.CommitChanges(); try { entry.Rename(srcOguObject.ObjectType.SchemaTypeToPrefix() + "=" + ADHelper.EscapeString(srcPropertyValue)); } catch (DirectoryServicesCOMException ex) { if (ex.ErrorCode == -2147019886) { //对象已存在 entry.Rename(srcOguObject.ObjectType.SchemaTypeToPrefix() + "=TMP" + Environment.TickCount.ToString("X")); SynchronizeContext.Current.DelayActions.Add(new DelayRenameAction(srcOguObject, entry.NativeGuid)); } else { throw; } } } }
/// <summary> /// 将组织的路径转换为DN,注意路径必须以\作为分隔符,路径中的特殊字符会自动转义,遇到两个\\作为斜线处理。 /// </summary> /// <param stringValue="val"></param> /// <returns></returns> public static string OUPathToDN(string path) { string[] parts = new PathPartEnumerator(path).ToArray(); return(OUPathToDN(parts, parts.Length)); }