C# 获得一个用户';在Active Directory中创建组

C# 获得一个用户';在Active Directory中创建组,c#,asp.net,wpf,web-services,active-directory,C#,Asp.net,Wpf,Web Services,Active Directory,我在将我的ASP.NET web服务与Active Directory设置集成时遇到问题,并使用它来验证用户,检查他们是否是广告组的成员,以及他们是否有权使用我的自定义应用程序 我的自定义应用程序有自己的权限,管理员配置允许使用自定义应用程序的Active Directory组 我遇到的问题是,当一个来自另一个受信任的广告林(具有完全双向信任)的用户尝试登录时,我无法从与我的ASP.NET web服务通信的广告服务器获取他的组列表。ASP.NET web服务只能访问AD服务器(AD Main),

我在将我的ASP.NET web服务与Active Directory设置集成时遇到问题,并使用它来验证用户,检查他们是否是广告组的成员,以及他们是否有权使用我的自定义应用程序

我的自定义应用程序有自己的权限,管理员配置允许使用自定义应用程序的Active Directory组

我遇到的问题是,当一个来自另一个受信任的广告林(具有完全双向信任)的用户尝试登录时,我无法从与我的ASP.NET web服务通信的广告服务器获取他的组列表。ASP.NET web服务只能访问AD服务器(AD Main),而不能访问信任AD控制器(AD Secondary)

该用户是(AD Secondary)域的成员,我可以针对(AD Main)域对该用户进行身份验证,但当该用户位于(AD Secondary)域时,我无法从(AD Main)域获取组列表

我试过这个代码

StringCollection groupids = new StringCollection();
try
{
    DirectoryLibrary dirLib = new DirectoryLibrary();
    DirectoryEntry directoryEntry = new DirectoryEntry("LDAP://" + domain,username, password);   
    if (directoryEntry != null)
    {
        //Enum the properties so we can see what is in them
        foreach (string propname in directoryEntry.Properties.PropertyNames)
        {
            Debug.WriteLine(propname);
        }

        object obGroups = directoryEntry.Invoke("Groups");
        foreach (object ob in (IEnumerable)obGroups)
        {
        // Create object for each group.
            DirectoryEntry obGpEntry = new DirectoryEntry(ob);
            groupids.Add(obGpEntry.NativeGuid);
        }
    }
}
catch (DirectoryServicesCOMException ex) { throw ex; }
我试着从DirectoryEntry对象转移到类似这样的对象

List<GroupPrincipal> result = new List<GroupPrincipal>();
StringCollection groupids = new StringCollection();

PrincipalContext yourDomain = new PrincipalContext(ContextType.Domain, domain, userName, password);

// find your user
UserPrincipal user = UserPrincipal.FindByIdentity(yourDomain, userName);

// if found - grab its groups
if (user != null)
{
    PrincipalSearchResult<Principal> groups = user.GetGroups();

    // iterate over all groups
    foreach (Principal p in groups)
    {
        // make sure to add only group principals
        if (p is GroupPrincipal)
        {
            groupids.Add(p.DisplayName);
        }
    }

}
列表结果=新列表();
StringCollection GroupId=新建StringCollection();
PrincipalContext yourDomain=新PrincipalContext(ContextType.Domain,Domain,userName,password);
//查找您的用户
UserPrincipal user=UserPrincipal.FindByIdentity(您的域,用户名);
//如果找到-抓取它的组
如果(用户!=null)
{
PrincipalSearchResult groups=user.GetGroups();
//迭代所有组
foreach(组中的主体p)
{
//确保只添加组主体
if(p是GroupPrincipal)
{
groupid.Add(p.DisplayName);
}
}
}

但是,我无法获取该用户,也无法获取该用户在其他域中的组列表。任何帮助都将不胜感激。

这似乎是一个很好的使用案例,用于从广告中派生的memberOf属性。使用
DirectoryEntry DirectoryEntry
对象,可以枚举用户所属的组

foreach (object group in directoryEntry.Properties["memberOf"])
{
    DirectoryEntry obGpEntry = New DirectoryEntry("LDAP://" + (String)group);
    groupids.Add(obGpEntry.NativeGuid);
}

如果您在ob前面加上“LDAP://”前缀,您也可能会使用第一个代码段。

我认为您必须连接到远程广告并获取所需的数据

我曾经写过一次复制,从很多广告中复制

其中的一些代码:

Public Function GetDirectoryEntry() As Object

    If InStr(1, m_sLdapPath, "DC=") > 0 Then
      Dim directory_service As New PrincipalContext(ContextType.Domain, m_sDomain, m_sLdapPath)
      Return directory_service
    Else
      Dim directory_service As New PrincipalContext(ContextType.Machine, m_sDomain, m_sLdapPath)
      Return directory_service
    End If

  End Function

  Public Function GetUserList() As PrincipalSearchResult(Of Principal)

    Dim directory_service As PrincipalContext = CType(GetDirectoryEntry(), PrincipalContext)
    Dim directory_user As New UserPrincipal(directory_service)

    Dim directory_userlist As New PrincipalSearcher(directory_user)
    directory_userlist.QueryFilter = directory_user
    Return directory_userlist.FindAll

  End Function

  Public Function GetGroupList() As PrincipalSearchResult(Of Principal)

    Dim directory_service As PrincipalContext = CType(GetDirectoryEntry(), PrincipalContext)
    Dim directory_group As New GroupPrincipal(directory_service)

    Dim directory_grouplist As New PrincipalSearcher(directory_group)
    directory_grouplist.QueryFilter = directory_group
    Return directory_grouplist.FindAll

  End Function
我知道这不完全是你需要的,但这显示了如何连接和获取任何广告的数据。 在我的例子中,我得到一个userlist、grouplist或其他什么,然后处理这些集合

Dim l_oGroupList As Object = oDirectory.GetGroupList()
For Each l_oGroup In l_oGroupList
  If l_oGroup.Members.Count > 0 Then
  If l_oGroup.Members.Contains(directory_service, IdentityType.UserPrincipalName, Username) Then
    ' he is part of the group
  End If
  End If
Next

我希望这有助于解决这个问题……

我对广告组成员感到很痛苦。祝你好运,这就是我所能说的…我们还没有找到解决方案,但看起来我们将要安装ADFSOh,你是否尝试过模拟一个对你查询的所有对象都拥有主域和辅助域读取权限的用户?这听起来像是一个广告版权问题