使用System.DirectoryServices.AccountManagement库的奇怪COM互操作异常0x80005000

时间:2010-09-06 11:13:56

标签: c# .net active-directory com-interop

我正在尝试写一些东西(除其他外)将用户添加到AD组 - 使用VS2010,.Net4和System.DirectoryServices.AccountManagement中的库设施。

我已经通过代码获得了一个用户和组,如下面的示例所示,这适用于启用或禁用帐户等其他操作。

group = System.DirectoryServices.AccountManagement.GroupPrincipal.FindByIdentity(_UserContext, Name);

user = System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(_UserContext, Name);

现在,尝试将用户添加到组中,如:

group.Members.Add(user);

我收到一个错误,堆栈跟踪开始像下面列出的一个COM互操作错误0x80005000(未知)。其他用户以及32位和64位版本也会发生这种情况。在网上搜索这个问题会产生一些论坛问题,但我找不到任何答案。从理论上讲,这应该有效 - this codeproject sample做了很多相同的事情。

有没有人看到过这个错误或者有什么可能导致它的错误?

堆栈追踪顶部:

Unhandled Exception: System.DirectoryServices.AccountManagement.PrincipalOperati
onException: Unknown error (0x80005000) ---> System.Runtime.InteropServices.COME
xception: Unknown error (0x80005000)
   at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
   at System.DirectoryServices.DirectoryEntry.Bind()
   at System.DirectoryServices.DirectoryEntry.get_AdsObject()
   at System.DirectoryServices.DirectorySearcher.FindAll(Boolean findMoreThanOne
)
   at System.DirectoryServices.DirectorySearcher.FindOne()
   at System.DirectoryServices.AccountManagement.ADStoreCtx.IsMemberOfInStore(Gr
oupPrincipal g, Principal p)
   --- End of inner exception stack trace ---
   at System.DirectoryServices.AccountManagement.ADStoreCtx.IsMemberOfInStore(Gr
oupPrincipal g, Principal p)
   at System.DirectoryServices.AccountManagement.PrincipalCollection.ContainsNat
iveTest(Principal principal)
   at System.DirectoryServices.AccountManagement.PrincipalCollection.Contains(Pr
incipal principal)
   at System.DirectoryServices.AccountManagement.PrincipalCollection.Add(Princip
al principal)
   at System.DirectoryServices.AccountManagement.PrincipalCollection.Add(UserPri
ncipal user)

2 个答案:

答案 0 :(得分:2)

我也遇到了与(GroupPrincipal实例).Members.Add(UserPrincipal实例)相同的问题。

由于GetUnderlyingObject方法,解决方法(在IronPython中)非常简单。

de = group.GetUnderlyingObject
# Group member DNs are kept in 'member' attribute in LDAP
de.Properties['member'].Add(user.DistinguishedName)
de.CommitChanges() # Save your work

答案 1 :(得分:2)

刚刚遇到这个并注意到代码项目示例在创建上下文时显式使用域名(而不是使用null)。我更改了我的代码以明确指定域名,现在它工作正常 - 我可以group.Members.Add(用户)没有问题。