C# 4.0 “集体投掷”;System.Runtime.InteropServices.COMException(0x8007200A):指定的目录服务属性或值不存在;
我正在使用C# 4.0 “集体投掷”;System.Runtime.InteropServices.COMException(0x8007200A):指定的目录服务属性或值不存在;,c#-4.0,active-directory,account-management,groupprincipal,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(_principalCont
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...
}
var\u principalContext=new principalContext(ContextType.Domain、domainAddress、adContainer、adQueryAccount、adQueryAccountPassword);
var user=UserPrincipal.FindByIdentity(_principalContext,IdentityType.SamAccountName,account);
var userGroups=user.GetGroups();
foreach(userGroups.Cast()中的var组)
{
//////////////////////////////////////////////////////
//正在获取显示的基础DirectoryEntry
//以证明我可以检索底层
//属性,而不引发异常
DirectoryEntry DirectoryEntry=group.getUnderlineingObject()作为DirectoryEntry;
var displayName=directoryEntry.Properties[“displayName”];
if(displayName!=null&&displayName.Value!=null)
Console.WriteLine(displayName.Value);
//////////////////////////////////////////////////////
Console.WriteLine(group.DisplayName);//此处引发异常。。。
}
我可以抓取底层的DirectoryEntry
对象并转储其属性和值,但只要访问GroupPrincipal.DisplayName
属性(或任何相关属性),它就会抛出以下异常:
“System.Runtime.InteropServices.COMException(0x8007200A):
指定的目录服务属性或值不存在。\r\n\r\n
位于System.DirectoryServices.DirectoryEntry.Bind(布尔值
throwIfFail)\r\n在
System.DirectoryServices.DirectoryEntry.Bind()\r\n位于
System.DirectoryServices.DirectoryEntry.get\u SchemaEntry()\r\n位于
System.DirectoryServices.AccountManagement.ADStoreCtx.IsContainer(DirectoryEntry
de)\r\n位于
System.DirectoryServices.AccountManagement.AdStoreCx..ctor(DirectoryEntry
ctxBase,布尔值ownCtxBase,字符串用户名,字符串密码,
ContextOptions选项)\r\n位于
System.DirectoryServices.AccountManagement.PrincipalContext.CreateContextFromDirectoryEntry(DirectoryEntry
条目)\r\n位于
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\u QueryCtx()\r\n位于
系统.DirectoryServices.AccountManagement.Principal.HandleGet[T](T&
currentValue、字符串名称、LoadState和state)\r\n位于
System.DirectoryServices.AccountManagement.Principal.get\u DisplayName()\r\n
在控制台Application 9.Program.Main(字符串[]args)”
为什么我能够转储底层
DirectoryEntry
的原始属性,但不能直接调用GroupPrincipal
上的任何属性?什么会导致这种异常?请注意,这不会发生在“域用户”组上,但会发生在后续组上…为什么要使用.getunderyingobject()
调用?似乎完全多余。。。只需直接使用GroupPrincipal
的.SamAccountName
属性
试试这个:
foreach (var group in userGroups.Cast<GroupPrincipal>())
{
Console.WriteLine(group.SamAccountName);
Console.WriteLine(group.DisplayName);
Console.WriteLine(group.IsSecurityGroup);
}
foreach(userGroups.Cast()中的var组)
{
Console.WriteLine(group.SamAccountName);
Console.WriteLine(group.DisplayName);
Console.WriteLine(group.IsSecurityGroup);
}
似乎要容易得多-不?我找到了解决办法。如果我将上下文传递给
GetGroups
方法,它就会工作
var user = UserPrincipal.FindByIdentity(_principalContext, IdentityType.SamAccountName, account);
var userGroups = user.GetGroups(_principalContext);
显然,这将检索到的组限制在与上下文关联的域中。虽然这不是直观的,因为上下文首先用于检索用户
这让我相信,以前一定有来自其他域的组被返回,并且权限是阻止访问这些信息的。我这样做是为了证明我可以。如果我调用group.SamAccountName,它会立即抛出上述异常。我将编辑代码示例,以明确这一点…无法重现该行为-当我直接访问
组
属性时,我会得到预期的结果。。。这可能是你用来查询广告的用户的权限问题吗???@marc_s,可能是权限问题,但我正试图缩小这个问题的范围,因为处理这个问题既慢又痛苦,所以我想获得尽可能多的关于这个问题的信息,