Active Directory COM异常 - 发生操作错误(0x80072020)

gho*_*ago 27 .net c# com exception active-directory

当我尝试使用方法GroupPrincipal.FindByIdentity查询Active Directory时,我收到间歇性COM异常" 发生操作错误(0x80072020) "(如下所示)

这是我的代码:

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, Environment.UserDomainName);
GroupPrincipal groupPrincipal = GroupPrincipal.FindByIdentity(ctx, IdentityType.Name, "Group to find");
Run Code Online (Sandbox Code Playgroud)

我收到例外:

Inner Exception: System.Runtime.InteropServices.COMException (0x80072020): An operations error occurred.
  at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
  at System.DirectoryServices.DirectoryEntry.Bind()
  at System.DirectoryServices.DirectoryEntry.get_AdsObject()
  at System.DirectoryServices.PropertyValueCollection.PopulateList()
  at System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName)
  at System.DirectoryServices.PropertyCollection.get_Item(String propertyName)
  at System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer()
  at System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit()
  at System.DirectoryServices.AccountManagement.PrincipalContext.Initialize()
  at System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx()
  at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext context, Type principalType, Nullable`1 identityType, String identityValue, DateTime refDate)
  at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext context, Type principalType, IdentityType identityType, String identityValue)
  at System.DirectoryServices.AccountManagement.GroupPrincipal.FindByIdentity(PrincipalContext context, IdentityType identityType, String identityValue)
Run Code Online (Sandbox Code Playgroud)

代码从Windows 2003 SP2服务器上的Windows 服务运行.

我已经发现了另一个堆栈溢出问题,Active Directory中,列举用户群体,COM异常,这表明启用Kerberos作为PrincipalContext构造一个选项,将解决这个问题,但我收到一个不同的十六进制代码比这个问题.

我的问题是:

  1. 这个特殊的COM Exception肯定是一个身份验证问题吗?我需要确保在发布软件之前,这将100%解决问题.
  2. 是否有某个资源列出了所有可能的COM异常十六进制代码,这样我将来可以更好地帮助自己?

atc*_*way 41

问题通常是Active Directory调用的上下文是在没有权限的用户下(identity impersonate="true"在ASP.NET中也可能发生,因为用户令牌是"辅助令牌"而不能用于从另一台服务器进行身份验证时使用:https://social.technet.microsoft.com/Forums/en-US/f188029c-51cf​​-4b50-966a-eee7160d0353/an-operations-error-occured).

下面的代码将确保您正在运行的代码块,是的环境下运行说,AppPool(即NETWORKSERVICE),您的服务或网站下运行.

using (HostingEnvironment.Impersonate())
{
   var domainContext = new PrincipalContext(ContextType.Domain, "myDomain.com");
   var groupPrincipal = GroupPrincipal.FindByIdentity(domainContext, IdentityType.Name, "PowerUsers");
   if (groupPrincipal != null)
   {
      //code to get the infomation
   }

}
Run Code Online (Sandbox Code Playgroud)

但是,一个非常重要的细节是调用Active Directory的所有代码都必须在该块中.我使用了一些我的团队成员编写的代码,它返回了LINQ类型Users(自定义类)的查询结果,但没有评估表达式(不良做法).因此返回表达式树而不是结果.

最终发生的是调用代码最终评估结果并且An operations error occurred消息仍然出现.我虽然上面的代码修复不起作用.事实上它确实如此,但是有代码评估了块外的结果.

简而言之,确保访问Active Directory的所有代码都在该using块内,并且应修复异常,将服务/应用程序部署到服务器.


gho*_*ago 19

我现在找到了另一个答案无法在Dynamics CRM中添加用户使用CrmService API,其中指出0x80072020确实是一个权限问题.我已经将我的服务更改为在域级帐户而不是本地系统帐户下运行,这似乎已经解决了我的问题.

  • 两年后,这是我的解决方案.谢谢. (2认同)

Jak*_*164 9

这是2年后,我碰到了这个,发现以下问题解决了我的问题:

using System.Web.Hosting;
...
...
// Code here runs as the logged on user

using (HostingEnvironment.Impersonate()) {
// This code runs as the application pool user
     DirectorySearcher searcher ...
}
Run Code Online (Sandbox Code Playgroud)

参考