Как я могу запросить, является ли пользователь одного домена членом группы в другом домене AD? - PullRequest
6 голосов
/ 07 июля 2011

У меня есть ряд приложений, которые используют один и тот же код C #, .Net 2.0, который я создал, чтобы проверить и проверить, является ли пользователь членом группы Active Directory.

У меня нет 'У меня не было проблем с моим кодом до недавнего времени, когда я добавил пользователя из другого доверенного домена AD в одну из моих групп AD.У меня вопрос, как я могу проверить, является ли пользователь членом группы Active Directory, независимо от его домена.Другими словами, они могут или не могут быть в том же домене, что и моя группа.Ниже приведен код, который я написал и использовал в течение многих лет для поиска, чтобы определить, входит ли пользователь в группу Active Directory.Я не уверен, откуда я адаптировал этот код, но я предполагаю, что он взят из статьи MSDN.Также решение должно быть для .Net 2.0 framework.Я нашел довольно много ответов, которые могут работать для этой проблемы в .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;
    }
}

1 Ответ

1 голос
/ 07 июля 2011

Это не тот ответ, которого вы ждете, но я надеюсь, что он может помочь.

Первый ; Вы предполагаете, что ваш код работает в домене, но я не вижу, где он заботится о пользователе ' основная группа '. Если вы выберете группу в качестве ' основной группы пользователей ', эта группа больше не будет частью атрибута участника.

Второй ; В моем понимании, способ (я надеюсь, не единственный, но я все еще ищу), чтобы увидеть, если пользователь присутствует в группе, это ' рекурсивно ' искать DN пользователя в атрибуте member объектов group . Таким образом, в вашем случае вы можете спросить свой домен и другой домен. Вы можете сделать это, выполнив ОДИН поиск по домену. Вот пример такого ' рекурсивного поиска одного выстрела ' с использованием элемента управления:

/* 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();

Примечание: например, вы можете использовать более точный фильтр для исключения групп рассылки.


Отредактировано (для ответов на вопросы комментариев):

Первый : нужны ли учетные данные? Я бы сказал, что нет, если запрос выполняется с компьютера, который принадлежит домену или утвержденному домену.

Второй и третий : Да, фильтры задокументированы Microsoft в Синтаксис фильтра поиска AD . То, как я написал этот фильтр, является вычетом из выборок.

...