Список адресов электронной почты для общих папок в обмен - PullRequest
2 голосов
/ 02 ноября 2009

Как получить список всех адресов электронной почты для обмена общими папками?

Отвечу сам, приму лучший предложенный ответ.

Ответы [ 2 ]

3 голосов
/ 02 ноября 2009

Хотя то, что вы разместили в качестве собственного ответа, сработает, это поможет прочитать документацию по методам и объектам, которые вы используете, чтобы понять их ограничения. Если бы вы вызывали этот код несколько раз, у вас могла бы быть утечка памяти. Оператор 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, не требуя консоли для взаимодействия с пользователем.

0 голосов
/ 02 ноября 2009

Следующий код получит список всех адресов электронной почты общих папок при обмене.

public static void GetPublicFolderList()
{
 DirectoryEntry entry = new DirectoryEntry("LDAP://FakeDomain.com");
 DirectorySearcher mySearcher = new DirectorySearcher(entry);
 mySearcher.Filter = "(&(objectClass=publicfolder))";
 mySearcher.SizeLimit = int.MaxValue;
 mySearcher.PageSize = int.MaxValue;            

 foreach (SearchResult resEnt in mySearcher.FindAll())
 {
  if (resEnt.Properties.Count == 1)
   continue;

  object OO = resEnt.Properties["mail"][0];
 }
}

Если вы хотите Все адреса электронной почты общей папки,

удалить

object OO = resEnt.Properties["mail"][0];

Добавить: for (int counter = 0; counter

{
 string Email = (string)resEnt.Properties["proxyAddresses"][counter];
 if (Email.ToUpper().StartsWith("SMTP:"))
 {
  Email = Email.Remove(0, "SMTP:".Length);
 }
}
...