我正在使用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
上的任何属性?什么会导致这个例外?请注意,这不会发生在“域用户”组中,而是发生在后续组中,它确实......
答案 0 :(得分:5)
我找到了解决方案。如果我将上下文传递给GetGroups
方法,它就可以工作。
var user = UserPrincipal.FindByIdentity(_principalContext, IdentityType.SamAccountName, account);
var userGroups = user.GetGroups(_principalContext);
显然,这会将检索到的组限制在与上下文关联的域中。虽然这不直观,因为首先使用上下文来检索用户!!!
这使我相信必须先从其他域中返回组,并且权限是这样的,以防止访问该信息。
答案 1 :(得分:0)
为什么使用.GetUnderlyingObject()
电话?看起来完全是多余的......只需直接使用.SamAccountName
的{{1}}属性......
试试这个:
GroupPrincipal
似乎更容易 - 没有?