UserPrincipal.GetGroups失败,未知错误

Hol*_*roe 19 .net directoryservices active-directory

我正在尝试使用以下代码获取用户的所有Active Directory组:

    private static IEnumerable<string> GetGroupNames(string userName)
    {
        using (var context = new PrincipalContext(ContextType.Domain))
        {
            using (var userPrincipal = UserPrincipal.FindByIdentity(context, userName))
            {
                var groupSearch = userPrincipal.GetGroups(context);
                var result = new List<string>();
                foreach (var principal in groupSearch)
                {
                    Log.LogDebug("User {0} is member of group {0}", userPrincipal.DisplayName, principal.DisplayName);
                    result.Add(principal.SamAccountName);
                }
                return result;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

此代码正确查找用户主体,但在使用PrincipalOperationException调用GetGroups时失败:未知错误(0x80005000).

根异常:

   at System.DirectoryServices.AccountManagement.ADStoreCtx.GetGroupsMemberOf(Principal foreignPrincipal, StoreCtx foreignContext)
   at System.DirectoryServices.AccountManagement.Principal.GetGroupsHelper(PrincipalContext contextToQuery)
   at System.DirectoryServices.AccountManagement.Principal.GetGroups(PrincipalContext contextToQuery)
   at [line of the GetGroup call]
Run Code Online (Sandbox Code Playgroud)

内部异常(COMException):

   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.ADUtils.RetriveWkDn(DirectoryEntry deBase, String defaultNamingContext, String serverN
Run Code Online (Sandbox Code Playgroud)

另一个报告有这个问题.

有线索吗?

Hol*_*roe 31

将Environment.UserDomainName作为PrincipalContext的name参数添加帮助:

using (var context = new PrincipalContext(ContextType.Domain, Environment.UserDomainName))
Run Code Online (Sandbox Code Playgroud)

我仍然不知道为什么PrincipalContext(ContextType.Domain)仅用于查找UserPrincipal而不是用户的组.COM错误消息"未知错误"不是很有帮助,只有ContextType的PrincipalContext构造函数重载在MSDN上几乎没有记录.正如Harvey Kwok指出的那样,它就像.NET框架的问题一样.