2012-06-15 3 views
2

У меня есть две целей с кодом нижеПолучить информацию о пользователе из DN

1) Получить список пользователей, которые ниже определенной AD группы
2) Получить электронное/LastName/имя всех пользователей которые принадлежат этой группе

Если есть лучший способ выполнить оба действия, сообщите мне об этом.

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

Когда я попытался сделать DirectorySearcher с использованием полного DN.

HashSet<string> User_Collection = new HashSet<string>(); 

SearchResultCollection sResults = null; 
DirectoryEntry dEntryhighlevel = new DirectoryEntry("LDAP://CN=Global_Users,OU=Astrix,OU=Clients,OU=Channel,DC=astro,DC=net"); 
foreach (object dn in dEntryhighlevel.Properties["member"]) 
{ 
    DirectoryEntry dEntry = new DirectoryEntry(dn); 
    Console.WriteLine(dn); 
    DirectorySearcher dSearcher = new DirectorySearcher(dEntry); 
    //filter just user objects 
    dSearcher.SearchScope = SearchScope.Base; 
    //dSearcher.Filter = "(&(objectClass=user)(dn="+dn+")"; 
    dSearcher.PageSize = 1000; 
    sResults = dSearcher.FindAll(); 
    foreach (SearchResult sResult in sResults) 
    { 
     string Last_Name = sResult.Properties["sn"][0].ToString(); 
     string First_Name = sResult.Properties["givenname"][0].ToString(); 
     string Email_Address = sResult.Properties["mail"][0].ToString(); 
     User_Collection.Add(Last_Name + "|" + First_Name + "|" + Email_Address); 
    } 

Скорость важна, и да, я понимаю, что я не использую HashSet, поскольку он разработан.

ответ

1

Я всегда использую System.DirectoryServices.AccountManagement.

Одна из первых вещей, которые вы увидите, это следующее: «Скорость соединений увеличивается с помощью функции быстрого параллельного привязки (FSB), когда она доступна. Кэширование соединений уменьшает количество используемых портов». , сказав, что я не тестировал ваш код против этого для скорости, вам придется делать это самостоятельно, но это новая библиотека Microsoft.

Вот мой пример кода:

// Create the context for the principal object. 
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, 
              "fabrikam", 
              "DC=fabrikam,DC=com"); 

// Create an in-memory user object to use as the query example. 
GroupPrincipal u = new GroupPrincipal(ctx) {DisplayName = "Your Group Name Here"}; 

// Set properties on the user principal object. 

// Create a PrincipalSearcher object to perform the search. 
PrincipalSearcher ps = new PrincipalSearcher {QueryFilter = u}; 

// Tell the PrincipalSearcher what to search for. 

// Run the query. The query locates users 
// that match the supplied user principal object. 
PrincipalSearchResult<Principal> results = ps.FindAll(); 

foreach (UserPrincipal principal in ((GroupPrincipal)results.FirstOrDefault()).Members) 
{ 
    string email = principal.EmailAddress; 
    string name = principal.Name; 
    string surname = principal.Surname; 
} 
0

Похоже, что вы идете на членство в группе какой-либо группы в AD ... (предполагаю, что это от базового элемента выше)

Во всяком случае , вам нужно решить, какой API вы ищете. Тот, который вы используете сейчас, немного ниже (хотя вы можете пойти ниже, если хотите :)). Переход на более высокий уровень - это вариант, поскольку предыдущий ответ ускользает.

Чтобы вытряхнуть код немного больше (и не поможет с перфорацией, как вы сказали, что это impt к вам):

  • Используйте то же соединение, которое используется для самого поиска членства в группе (т.е. без дополнительного connect/bind)
  • Сделайте базовый поиск, где базовое DN является DN пользователя, фильтр поиска (objectclass = *), и атрибуты являются ТОЛЬКО вашими атрибутами (нет *)
  • Вы можете удалить страницу размер. Пейджинг - это способ запросить множество объектов в группах (ака страниц), но базовый поиск возвращает только 1 объект, поэтому он фактически ничего не делает.
  • Базовый поиск счетчик результат всегда должен быть 1.

Хранить в вопросах междоменных ума тоже. Убедитесь, что вы протестировали свой код в 2-доменном лесу, где группа домена типа, локальная в домене1, имеет член в нем из домена 2. Это даст дополнительную работу, чтобы получить больше свойств, поскольку вам необходимо подключиться к DC в другом домен (или GC, если несколько свойств, о которых вы заботитесь, все находятся в частичном атрибуте GC) ...

Также имейте в виду безопасность. Если у вас нет доступа к этим свойствам для какого-либо пользователя в вашем домене, что делает код? Приведенный выше код провалился бы противно.:) Возможно, вы захотите обработать это более изящно ...

Надеюсь, это поможет. ~ Eric

Смежные вопросы