Получить пользователей из группы AD - PullRequest
2 голосов
/ 17 мая 2011

У меня есть этот код для работы с пользователями из группы

DirectorySearcher myGroupSearcher = new DirectorySearcher(myDirectoryEntry);
myGroupSearcher.Filter = String.Format("(&(objectClass=group)(|(cn={0})(dn={0})))", strGroupName);
myGroupSearcher.PropertiesToLoad.Add("member");

SearchResult myGroupSearchResult = myGroupSearcher.FindOne();

if (myGroupSearchResult != null)
{
    ResultPropertyValueCollection myUsersInGroup = myGroupSearchResult.Properties["member"];

    int intMemberCount = myUsersInGroup.Count;

    for (int i = 0; i < intMemberCount; i++)
    {
        //Split the current result
        string[] strProperites = myUsersInGroup[i].ToString().Split(',');

        //Get the CN
        string strUsername = strProperites[0].Substring(3);

        DirectorySearcher myUserSearcher = new DirectorySearcher(myDirectoryEntry);
        myUserSearcher.Filter = String.Format("(&(objectClass=user)(|(cn={0})(sAMAccountName={0})))", strUsername);
        myUserSearcher.PropertiesToLoad.Add("memberOf");

        SearchResult myUserSearchResult = myUserSearcher.FindOne();

        //Do some work
    }
}

Это работает для большинства пользователей, но для некоторых имя strUsername меняется в зависимости от того, как выглядит клиентский AD (если у пользователя есть CN, содержащий). Так что это решение не самое оптимальное для использования. Есть ли способ получить имя samaccount при поиске членов в группе? Или есть лучший способ?

Ответы [ 3 ]

7 голосов
/ 17 мая 2011

Предполагая, что вы используете .NET 3.5 или новее (или можете обновиться до него), вы должны проверить пространство имен System.DirectoryServices.AccountManagement (S.DS.AM). Читайте все об этом здесь:

Управление принципами безопасности каталогов в .NET Framework 3.5

По сути, вы можете определить контекст домена и легко найти пользователей и / или группы в AD:

// set up domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

// find the group in question
GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, "YourGroupNameHere");

// if found....
if (group != null)
{
   // iterate over members
   foreach (Principal p in group.GetMembers())
   {
      Console.WriteLine("{0}: {1}", p.StructuralObjectClass, p.DisplayName);
      // do whatever you need to do to those members
   }
}

Новый S.DS.AM позволяет очень легко играть с пользователями и группами в AD:

0 голосов
/ 17 мая 2011

Может быть вариант использовать классы System.DirectoryServices.AccountManagement вместо DirectorySearcher. Существует класс GroupPrincipal, который имеет свойство Members, которое содержит объекты UserPrincipal.

0 голосов
/ 17 мая 2011
string[] strProperites = myUsersInGroup[i].ToString().Split(new string[] { "cn=" }, StringSplitOptions.RemoveEmptyEntries);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...