我正在使用 System.DirectoryServices.AccountManagement 查询用户,然后查找该用户的组。

var _principalContext = new PrincipalContext(ContextType.Domain, domainAddress, adContainer, adQueryAccount, adQueryAccountPassword);
var user = UserPrincipal.FindByIdentity(_principalContext, IdentityType.SamAccountName, account);
var userGroups = user.GetGroups();

foreach (var group in userGroups.Cast<GroupPrincipal>())
{
    //////////////////////////////////////////////////////
    // getting the underlying DirectoryEntry shown
    // to demonstrate that I can retrieve the underlying
    // properties without the exception being thrown
    DirectoryEntry directoryEntry = group.GetUnderlyingObject() as DirectoryEntry;

    var displayName = directoryEntry.Properties["displayName"];

    if (displayName != null && displayName.Value != null)
        Console.WriteLine(displayName.Value);
    //////////////////////////////////////////////////////

    Console.WriteLine(group.DisplayName);// exception thrown here...
}

我可以获取底层 DirectoryEntry 对象并转储其属性和值,但是一旦访问 GroupPrincipal.DisplayName 属性(或任何与此相关的属性),它就会抛出以下异常:



为什么我可以转储底层 DirectoryEntry 的原始属性,但不能直接在 GroupPrincipal 上调用任何属性?什么会导致这个异常?请注意,这不会发生在“域用户”组上,而是发生在随后的组上,它确实......

最佳答案

我找到了解决方案。如果我将上下文传递给 GetGroups 方法,它就可以工作。

var user = UserPrincipal.FindByIdentity(_principalContext, IdentityType.SamAccountName, account);
var userGroups = user.GetGroups(_principalContext);

显然,这将检索到的组限制在与上下文关联的域中。虽然这并不直观,因为上下文首先用于检索用户!!!

这让我相信之前必须返回来自其他域的组,并且权限是为了防止访问该信息。

关于c#-4.0 - GroupPrincipal throw "System.Runtime.InteropServices.COMException (0x8007200A): The specified directory service attribute or value does not exist.",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16069342/

10-13 00:00