如何查询某个域的用户是否为其他AD域的组成员

本文关键字:是否 用户 其他 组成员 AD 何查询 查询 | 更新日期: 2023-09-27 18:01:28

我创建了一系列应用程序,它们都使用相同的c#, . net 2.0代码来检查用户是否是Active Directory组的成员。

直到最近,当我将来自另一个受信任的AD域的用户添加到我的一个AD组时,我的代码才遇到任何问题。我的问题是如何检查用户是否是Active Directory组的成员,而不管其域是什么。换句话说,他们可能和我的小组在同一个领域,也可能不在同一个领域。下面是我编写并使用了多年的代码,用于搜索用户是否在Active Directory组中。我不确定我从哪里改编了这段代码,但我认为它来自MSDN的一篇文章。此外,解决方案必须是针对。net 2.0框架的。我在。net 3.5中找到了一些可以解决这个问题的答案。不幸的是,这对我的场景不起作用。

//This method takes a user name and the name of an AD Group (role).  
//Current implementations of this method do not contain the user's domain 
//with userName, because it comes from the Environment.UserName property.
private static bool IsInRole(string userName, string role)
{
    try
    {
        role = role.ToLowerInvariant();
        DirectorySearcher ds = new DirectorySearcher(new DirectoryEntry(null));
        ds.Filter = "samaccountname=" + userName;
        SearchResult sr = ds.FindOne();
        DirectoryEntry de = sr.GetDirectoryEntry();
        PropertyValueCollection dir = de.Properties["memberOf"];
        for (int i = 0; i < dir.Count; ++i)
        {
            string s = dir[i].ToString().Substring(3);
            s = s.Substring(0, s.IndexOf(',')).ToLowerInvariant();
            if (s == role)
                return true;
        }
        throw new Exception();
    }
    catch
    {
        return false;
    }
}

如何查询某个域的用户是否为其他AD域的组成员

这不是你想要的答案,但我希望它能对你有所帮助。

首先

;你假设你的代码在一个域中工作,但我不知道它在哪里照顾用户'主组'。如果选择一个组作为"用户主体组",则该组不再是成员属性的一部分。

第二;在我的理解中,查看用户是否存在于组中的一种方法(我希望不是唯一的方法,但我仍在寻找)是"隐式"在""对象的"成员"属性中查找用户DN。所以,在你的情况下,你可能会问你的域和另一个域。你可以在每个域名做一次搜索。以下是使用control:

的"递归一次性搜索"的示例:
/* Connection to Active Directory
 */
string sFromWhere = "LDAP://WIN-COMPUTER:389/";
DirectoryEntry deBase = new DirectoryEntry(sFromWhere, "dom''user", "password");
/* To find all the groups that "user1" is a member of :
 * Set the base to the groups container DN; for example root DN (dc=dom,dc=fr) 
 * Set the scope to subtree
 * Use the following filter :
 * (member:1.2.840.113556.1.4.1941:=cn=user1,cn=users,DC=x)
 */
DirectorySearcher dsLookFor = new DirectorySearcher(deBase);
dsLookFor.Filter = "(member:1.2.840.113556.1.4.1941:=CN=user1 Users,OU=MonOu,DC=dom,DC=fr)";
dsLookFor.SearchScope = SearchScope.Subtree;
dsLookFor.PropertiesToLoad.Add("cn");
SearchResultCollection srcGroups = dsLookFor.FindAll();

备注:您可以使用更精确的过滤器来排除通讯组,例如


编辑(回答评论问题):

First:是否需要凭据?如果请求来自属于域或已批准域的计算机,我会说不。

第二个和第三个: Yes过滤器由Microsoft在AD搜索过滤器语法中记录。我编写这个过滤器的方式是从样本中推导出来的。