4

背景:

我已经使用UserPrincipal.GetAuthorizationGroups了一段时间来检查 2 个不同应用程序中的权限。他们已经工作好几年了。最近,一些用户收到了标题 ( System.DirectoryServices.AccountManagement.PrincipalOperationException) 中提到的错误,而另一些用户则没有。我怀疑它可能与添加在 Windows Server 2012 上运行的新域控制器有关,因为问题在添加后的第二天就开始了。下面列出了完整的错误:

例外:

System.DirectoryServices.AccountManagement.PrincipalOperationException:枚举组时发生错误 (1301)。无法解析组的 SID。

在 System.DirectoryServices.AccountManagement.SidList.TranslateSids(字符串目标,IntPtr[] pSids) 在 System.DirectoryServices.AccountManagement.SidList..ctor(SID_AND_ATTR[] sidAndAttr)

在 System.DirectoryServices.AccountManagement.AuthZSet..ctor(字节 [] userSid,NetCred 凭据,ContextOptions contextOptions,字符串 flatUserAuthority,StoreCtx userStoreCtx,对象 userCtxBase)

在 System.DirectoryServices.AccountManagement.ADStoreCtx.GetGroupsMemberOfAZ...p)

在 System.DirectoryServices.AccountManagement.UserPrincipal.GetAuthorizationGroups

问题:

我该如何解决?

4

3 回答 3

5

我找到了一种替代方法DirectorySearcher

var allDomains = Forest.GetCurrentForest().Domains.Cast<Domain>();

var allSearcher = allDomains.Select(domain =>
    {
      DirectorySearcher searcher = new DirectorySearcher(
        new DirectoryEntry("LDAP://" + domain.Name));

      searcher.Filter = String.Format(
        "(&(&(objectCategory=person)(objectClass=user)(userPrincipalName=*{0}*)))", 
        "Current User Login Name");

      return searcher;
    }
);

var directoryEntriesFound = 
allSearcher.SelectMany(searcher => 
                        searcher.FindAll()
                          .Cast<SearchResult>()
                          .Select(result => result.GetDirectoryEntry()));

var memberOf = directoryEntriesFound.Select(entry =>
    {
      using (entry)
      {
        return new
        {
          Name = entry.Name,
          GroupName = ((object[])entry.Properties["MemberOf"].Value)
                            .Select(obj => obj.ToString())
        };
      }
    }
);

foreach (var user in memberOf)
{
    foreach (var groupName in user.GroupName)
    {
      if (groupName.Contains("Group to Find"))
      {
        // Do something if the user is in that group
      }
    }
}
于 2013-05-09T17:23:09.290 回答
0

我有同样的例外。如果有人不想使用“LDAP”,请使用此代码。因为我有嵌套组,所以我使用了 GetMembers(true),它的时间比 GetMembers() 长一点。

或从这里下载修复程序,如@Tilo 所说:http: //support.microsoft.com/kb/2830145

public bool IsMember(UserPrincipal user, string groupName)
{

            try
            {
                var context = new PrincipalContext(ContextType.Domain, Environment.UserDomainName);
                var group = GroupPrincipal.FindByIdentity(context, groupName);
                if (group == null)
                {
                    //Not exist
                }
                else
                {
                    if (group.GetMembers(true).Any(member => user.SamAccountName.ToLower() == member.SamAccountName.ToLower()))
                    {
                        return true;
                    }
                }
            }
            catch (Exception exception)
            {
                   //exception
            }

            return false;
    }
于 2014-12-18T13:58:06.357 回答