我无法将用户条目从一个容器条目移动到另一个容器条目
using (var newParent = GetEntry(destination, Configuration.ServerAddress, Configuration.UserName, Configuration.Password))
{
_entry.MoveTo(newParent);
}
...
public static DirectoryEntry GetEntry(Guid guid, string serverAddress, string userName, string password)
{
try
{
var id = guid.ToString().Replace("}", "").Replace("{", "");
return new DirectoryEntry(String.Format("{0}<GUID={1}>", serverAddress, id), userName, password);
}
catch (Exception e)
{
if (e.HResult != Searcher.ENTRY_NOT_FOUND)
throw new DirectoryServiceException(e);
}
return null;
}
必须将_entry
('user@****.com'
)移至目的地“container@****.com'
。由于我使用System.DirectoryServices
命名空间,因此两者都是DirectoryEntry
类型。
但是在调用MoveTo()
方法时会出现DirectoryServicesCOMException
,其中包含以下信息:
Message: There is a naming violation.
ExtendedErrorMessage: 00000057: LdapErr: DSID-0C090A8E, comment: Error in attribute conversion operation, data 0, v1db1
HResult -2147016649
任何人都知道可能导致此异常的原因吗?
答案 0 :(得分:2)
原来,Path属性不能包含条目的GUID。由于我使用GUID从AD中检索条目,因此它看起来像:
LDAP://<domain>/<GUID=9908d4c1-0438-4d23-8828-f5876166c84f>
为了使其正常工作,您必须确保路径如下:
LDAP://<domain>/CN=container@blabla.com,CN=UnitTestContainer,DC=<domain>
我不知道为什么会这样。一些内部处理可能需要这条路径...如果有人知道如何让它与GUID一起工作,请告诉我。
答案 1 :(得分:2)
我知道这是一个较旧的帖子,但我想我在这里添加了我最近的经验,因为我遇到了这个限制。
Wodzu关于&#34的假设;可能需要一些内部处理的路径&#34;是对的。
以下文章提到了一个提示:
Using objectGUID to Bind to an Object
根据以上链接:&#34;通过使用对象GUID绑定获得的对象不支持以下IADsContainer方法:&#34;。
这包括&#34; MoveHere&#34;。
这里的代码示例是C ++,因此可能并不明显&#34;为什么&#34;这是在我们考虑System.DirectoryServices
如何工作之前。
这个提示与优秀的目录服务编程指南(下面引用)相结合,为我们提供了一个更好的图片 - 本书提到了IADsContainer.MoveHere
被使用&#34;引擎盖&#34; MoveTo()
。
您可以通过查看.NET的源代码来亲自看到这一点。 这里是一个示例路径,看看你克隆回购的位置(任何4.x版本在这里都非常相似):
corefx-master\src\System.DirectoryServices\src\System\DirectoryServices\DirectoryEntry.cs
图书:强> 卡普兰,乔;邓恩,瑞恩。 .NET Develper目录服务编程指南(Kindle Location 1719)。皮尔逊教育。 Kindle版。