4

ユーザーを照会して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(Boolean throwIfFail)\r\n で System. DirectoryServices.DirectoryEntry.Bind()\r\n で System.DirectoryServices.DirectoryEntry.get_SchemaEntry()\r\n で System.DirectoryServices.AccountManagement.ADStoreCtx.IsContainer(DirectoryEntry de)\r\n で System.DirectoryServices.AccountManagement. ADStoreCtx..ctor(DirectoryEntry ctxBase, Boolean ownCtxBase, String username, String password, ContextOptions options)\r\n System.DirectoryServices.AccountManagement.PrincipalContext.CreateContextFromDirectoryEntry(DirectoryEntry entry) で\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_QueryCtx で()\r\n で System.DirectoryServices.AccountManagement.Principal.HandleGet[T](T& currentValue, String name, LoadState& state)\r\n で System.DirectoryServices.AccountManagement.Principal.get_DisplayName()\r\n でConsoleApplication9.Program.Main(文字列[]引数)"AccountManagement.Principal.HandleGet[T](T& currentValue, String name, LoadState& state)\r\n System.DirectoryServices.AccountManagement.Principal.get_DisplayName() で\r\n ConsoleApplication9.Program.Main(String[] args) で"AccountManagement.Principal.HandleGet[T](T& currentValue, String name, LoadState& state)\r\n System.DirectoryServices.AccountManagement.Principal.get_DisplayName() で\r\n ConsoleApplication9.Program.Main(String[] args) で"

基になるの未加工のプロパティをダンプできるのに、DirectoryEntryで直接プロパティを呼び出すことができないのはGroupPrincipalなぜですか? この例外の原因は何ですか? これは「Domain Users」グループでは発生せず、後続のグループでは発生することに注意してください...

4

2 に答える 2

0

なぜ.GetUnderlyingObject()コールを使用しているのですか?完全に不必要なようです...の.SamAccountNameプロパティをGroupPrincipal直接使用するだけです...

これを試して:

foreach (var group in userGroups.Cast<GroupPrincipal>())
{
    Console.WriteLine(group.SamAccountName);
    Console.WriteLine(group.DisplayName);
    Console.WriteLine(group.IsSecurityGroup);
}

はるかに簡単に思えます-いいえ?

于 2013-04-17T20:25:55.967 に答える