从DMZ访问Active Directory用户组

时间:2016-03-10 11:41:15

标签: c# active-directory dmz

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

  

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

     

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

     

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

     

在System.DirectoryServices.PropertyValueCollection.PopulateList()
  在System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry条目,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对象。

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

1 个答案:

答案 0 :(得分:0)

这是通过使用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;
    }