【问题标题】:Access Active Directory user groups from DMZ从 DMZ 访问 Active Directory 用户组
【发布时间】:2016-03-10 11:41:14
【问题描述】:

我有一个方法可以检查用户是否是 AD 组的成员。我尝试使用我自己的 AD 帐户作为凭据,然后我获得了一些有关 userprincipal 的信息,例如电子邮件等。但是在访问 userprincipals 组时,我收到以下错误消息:

例外:
消息:服务器无法运行。
来源:System.DirectoryServices.AccountManagement
目标:System.DirectoryServices.AccountManagement.ResultSet GetGroupsMemberOf(System.DirectoryServices.AccountManagement.Principal)

堆栈跟踪:
在 System.DirectoryServices.AccountManagement.ADStoreCtx.GetGroupsMemberOf(Principal p)
在 Authorization.AuthorizeAD.IsMemberOfGroup(字符串用户)
在 PVM.Controllers.SecurityController.IsMemberOfGroup(String user)

InnerException: System.Runtime.InteropServices.COMException (0x8007203A): 服务器无法运行。

在 System.DirectoryServices.PropertyValueCollection.PopulateList()
在 System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName)
在 System.DirectoryServices.PropertyCollection.get_Item(String propertyName)
在 System.DirectoryServices.AccountManagement.ADStoreCtx.LoadDomainInfo()
在 System.DirectoryServices.AccountManagement.ADStoreCtx.get_DnsForestName()
在 System.DirectoryServices.AccountManagement.ADStoreCtx.GetGroupsMemberOf(Principal p)

代码:

public bool IsMemberOfGroup(string user) {
    using (var context = new PrincipalContext(ContextType.Domain, ContextName, ContextContainer, ContextOptions.Negotiate | ContextOptions.SecureSocketLayer, "myUsername", "myPass")) {
        using (var userPrincipal = UserPrincipal.FindByIdentity(
                context,
                IdentityType.SamAccountName,
                user)) {
            //I can access userPrincipal.DisplayName etc
                var groupName = "TestGroup"
                //This is where I get the error
                return userPrincipal.IsMemberOf(context, IdentityType.SamAccountName, groupName);
            }
        }

        return false;
    }

我认为这可能是权限问题,但是当从服务器使用ldp.exe 时,查询活动目录没有问题。

在本地一切正常。我尝试更改 IIS AppPool 登录等,但现在我最终将凭据与我的 PrincipalContext 对象一起发送。

有人知道我在这里缺少什么吗?

【问题讨论】:

    标签: c# active-directory dmz


    【解决方案1】:

    通过使用 PrincipalSearcher 而不是 UserPrincipal.IsMemberOf 解决了这个问题,然后我做了自己的 IsMemberOf()。

    private static bool IsMemberOf(PrincipalContext context, PrincipalSearcher searcher, string user,
            string groupToFind) {
            searcher.QueryFilter = new GroupPrincipal(context, groupToFind);
    
            var group = searcher.FindOne() as GroupPrincipal;
            if (group == null) {
                return false;
            }
    
            if (group.GetMembers()
                .Select(member => member as UserPrincipal)
                .Where(principal => !string.IsNullOrEmpty(principal?.SamAccountName))
                .Any(principal => principal.SamAccountName.Equals(user))) {
                return true;
            }
    
            return false;
        }
    

    【讨论】:

      猜你喜欢
      • 2021-08-03
      • 1970-01-01
      • 2014-03-24
      • 1970-01-01
      • 2010-09-06
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多