Хотя то, что вы разместили в качестве собственного ответа, сработает, это поможет прочитать документацию по методам и объектам, которые вы используете, чтобы понять их ограничения. Если бы вы вызывали этот код несколько раз, у вас могла бы быть утечка памяти. Оператор foreach
не вызывает Dispose()
для используемого объекта, а только перечислитель, который он создает. Ниже приведен несколько лучший способ поиска в каталоге (хотя очень мало проверок на ошибки и обработки исключений).
public static void GetPublicFolderList()
{
DirectoryEntry entry = new DirectoryEntry("LDAP://sorcogruppen.no");
DirectorySearcher mySearcher = new DirectorySearcher(entry);
mySearcher.Filter = "(&(objectClass=publicfolder))";
// Request the mail attribute only to reduce the ammount of traffic
// between a DC and the application.
mySearcher.PropertiesToLoad.Add("mail");
// See Note 1
//mySearcher.SizeLimit = int.MaxValue;
// No point in requesting all of them at once, it'll page through
// all of them for you.
mySearcher.PageSize = 100;
// Wrap in a using so the object gets disposed properly.
// (See Note 2)
using (SearchResultCollection searchResults = mySearcher.FindAll())
{
foreach (SearchResult resEnt in searchResults)
{
// Make sure the mail attribute is provided and that there
// is actually data provided.
if (resEnt.Properties["mail"] != null
&& resEnt.Properties["mail"].Count > 0)
{
string email = resEnt.Properties["mail"][0] as string;
if (!String.IsNullOrEmpty(email))
{
// Do something with the email address
// for the public folder.
}
}
}
}
}
Примечание 1
Примечания для DirectorySearcher.SizeLimit указывают, что ограничение размера игнорируется, если оно превышает значение, определенное сервером по умолчанию (1000 записей). Пейджинг позволяет получать все нужные вам записи по мере необходимости.
Примечание 2
Замечания для DirectorySearcher.FindAll () указывают на то, что SearchResultCollection необходимо утилизировать для освобождения ресурсов. Заключение в оператор using
четко определяет ваши намерения программиста.
Extra
Если вы используете Exchange 2007 или 2010, вы также можете установить средства управления Exchange и использовать командлеты powershell для запроса общих папок. Вы можете прагматично создать пространство выполнения powershell и напрямую вызывать командлеты Exchange, не требуя консоли для взаимодействия с пользователем.