GroupPrincipal throw“System.Runtime.InteropServices.COMException(0x8007200A):指定的目录服务属性或值不存在。”

时间:2013-04-17 20:11:03

标签: c#-4.0 active-directory account-management groupprincipal

我正在使用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属性(或任何属性),就会抛出以下异常:

  

“System.Runtime.InteropServices.COMException(0x8007200A):.   指定的目录服务属性或值不存在。\ r \ n \ r \ n   在System.DirectoryServices.DirectoryEntry.Bind(布尔值   throwIfFail)\ r \ n at   System.DirectoryServices.DirectoryEntry.Bind()\ r \ n at   System.DirectoryServices.DirectoryEntry.get_SchemaEntry()\ r \ n at   System.DirectoryServices.AccountManagement.ADStoreCtx.IsContainer(的DirectoryEntry   de)\ r \ n at   System.DirectoryServices.AccountManagement.ADStoreCtx..ctor(的DirectoryEntry   ctxBase,Boolean ownCtxBase,String username,String password,   ContextOptions选项)\ r \ n at   System.DirectoryServices.AccountManagement.PrincipalContext.CreateContextFromDirectoryEntry(的DirectoryEntry   ()。\ r \ n at   System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer(个)\ r \ n   在   System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit(个)\ r \ n   在   System.DirectoryServices.AccountManagement.PrincipalContext.Initialize(个)\ r \ n   在System.DirectoryServices.Account   Management.PrincipalContext.get_QueryCtx()\ r \ n at   System.DirectoryServices.AccountManagement.Principal.HandleGet [T](T&安培;   currentValue,String name,LoadState&amp;国家)\ r \ n at   System.DirectoryServices.AccountManagement.Principal.get_DisplayName(个)\ r \ n   在ConsoleApplication9.Program.Main(String [] args)“

为什么我能够转储基础DirectoryEntry的原始属性,但无法直接调用GroupPrincipal上的任何属性?什么会导致这个例外?请注意,这不会发生在“域用户”组中,而是发生在后续组中,它确实......

2 个答案:

答案 0 :(得分:5)

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

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

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

这使我相信必须先从其他域中返回组,并且权限是这样的,以防止访问该信息。

答案 1 :(得分:0)

为什么使用.GetUnderlyingObject()电话?看起来完全是多余的......只需直接使用.SamAccountName的{​​{1}}属性......

试试这个:

GroupPrincipal

似乎更容易 - 没有?