Получение глобального списка адресов или набора списков адресов для хранилища
В этом разделе приведены два примера кода, в которых демонстрируется получение глобального списка адресов (GAL), связанного с хранилищем, а также способ получения всех списков адресов, которые с ним связаны.
Пример
Во время сеанса Outlook, где в профиле определены несколько учетных записей Exchange, с хранилищем может быть связано несколько списков адресов. В каждом из следующих примеров кода хранилищем, о котором идет речь, является хранилище для текущей папки, показанное в активном окне проводника, но алгоритм получения глобального списка адресов или набора объектов AddressList для хранилища применяется к любому хранилищу Exchange.
В первом примере кода используется метод DisplayGlobalAddressListForStore и функция GetGlobalAddressList. Метод DisplayGlobalAddressListForStore отображает в диалоговом окне Выбор имен глобальный список адресов, связанный с текущим хранилищем. Метод DisplayGlobalAddressListForStore сначала получает текущее хранилище. Если текущее хранилище является хранилищем Exchange, вызывается функция GetGlobalAddressList для получения глобального списка адресов, связанного с текущим хранилищем.
GetGlobalAddressList использует объект PropertyAccessor и свойство https://schemas.microsoft.com/mapi/proptag/0x3D150102
MAPI для получения свойства PR_EMSMDB_SECTION_UID списка адресов и текущего хранилища. GetGlobalAddressList определяет список адресов, связанный с хранилищем, если их свойства PR_EMSMDB_SECTION_UID совпадают, а список адресов — глобальный список адресов, если его свойство AddressListType имеет значение olExchangeGlobalAddressList. Если вызов GetGlobalAddressList выполняется успешно, метод DisplayGlobalAddressListForStore использует объект SelectNamesDialog для отображения возвращаемого глобального списка адресов в диалоговом окне Выбор имен.
Если вы используете Visual Studio для тестирования этого примера кода, сначала добавьте ссылку на компонент Microsoft Outlook 15.0 Object Library и задайте переменную Outlook при импорте пространства имен Microsoft.Office.Interop.Outlook. Инструкция using не должна находиться непосредственно перед функциями в примере кода, но ее нужно добавить перед объявлением общедоступного класса. В следующей строке кода показано, как выполнить импорт и назначение в C#.
using Outlook = Microsoft.Office.Interop.Outlook;
void DisplayGlobalAddressListForStore()
{
Outlook.Folder currentFolder =
Application.ActiveExplorer().CurrentFolder
as Outlook.Folder;
Outlook.Store currentStore = currentFolder.Store;
if (currentStore.ExchangeStoreType !=
Outlook.OlExchangeStoreType.olNotExchange)
{
Outlook.SelectNamesDialog snd =
Application.Session.GetSelectNamesDialog();
Outlook.AddressList addrList =
GetGlobalAddressList(currentStore);
if (addrList != null)
{
snd.InitialAddressList = addrList;
snd.Display();
}
}
}
public Outlook.AddressList GetGlobalAddressList(Outlook.Store store)
{
string PR_EMSMDB_SECTION_UID =
@"http://schemas.microsoft.com/mapi/proptag/0x3D150102";
if (store == null)
{
throw new ArgumentNullException();
}
Outlook.PropertyAccessor oPAStore = store.PropertyAccessor;
string storeUID = oPAStore.BinaryToString(
oPAStore.GetProperty(PR_EMSMDB_SECTION_UID));
foreach (Outlook.AddressList addrList
in Application.Session.AddressLists)
{
Outlook.PropertyAccessor oPAAddrList =
addrList.PropertyAccessor;
string addrListUID = oPAAddrList.BinaryToString(
oPAAddrList.GetProperty(PR_EMSMDB_SECTION_UID));
// Return addrList if match on storeUID
// and type is olExchangeGlobalAddressList.
if (addrListUID == storeUID && addrList.AddressListType ==
Outlook.OlAddressListType.olExchangeGlobalAddressList)
{
return addrList;
}
}
return null;
}
Во втором примере кода используется метод EnumerateAddressListsForStore и функция GetAddressLists. Метод EnumerateAddressListsForStore показывает тип и порядок разрешения каждого списка адресов, определенного для текущего хранилища. EnumerateAddressListsForStore сначала получает сведения о текущем хранилище, а затем вызывает GetAddressLists, чтобы получить универсальный объект платформы .NET Framework List<T>, который содержит объекты AddressList для текущего хранилища.
GetAddressLists перечисляет каждый список адресов, определенный для сеанса, использует объект PropertyAccessor и именованное свойство https://schemas.microsoft.com/mapi/proptag/0x3D150102
MAPI для получения свойства PR_EMSMDB_SECTION_UID списка адресов и свойства PR_EMSMDB_SECTION_UID текущего хранилища. GetGlobalAddressList определяет список адресов, связанный с хранилищем, если их свойства PR_EMSMDB_SECTION_UID совпадают, и возвращает набор списков адресов для текущего хранилища. Затем EnumerateAddressListsForStore применяет свойства AddressListType и ResolutionOrder объекта AddressList, чтобы показать тип и порядок разрешения для каждого возвращенного списка адресов.
private void EnumerateAddressListsForStore()
{
Outlook.Folder currentFolder =
Application.ActiveExplorer().CurrentFolder
as Outlook.Folder;
Outlook.Store currentStore = currentFolder.Store;
List<Outlook.AddressList> addrListsForStore =
GetAddressLists(currentStore);
foreach (Outlook.AddressList addrList in addrListsForStore)
{
Debug.WriteLine(addrList.Name
+ " " + addrList.AddressListType.ToString()
+ " Resolution Order: " +
addrList.ResolutionOrder);
}
}
public List<Outlook.AddressList> GetAddressLists(Outlook.Store store)
{
List<Outlook.AddressList> addrLists =
new List<Microsoft.Office.Interop.Outlook.AddressList>();
string PR_EMSMDB_SECTION_UID =
@"http://schemas.microsoft.com/mapi/proptag/0x3D150102";
if (store == null)
{
throw new ArgumentNullException();
}
Outlook.PropertyAccessor oPAStore = store.PropertyAccessor;
string storeUID = oPAStore.BinaryToString(
oPAStore.GetProperty(PR_EMSMDB_SECTION_UID));
foreach (Outlook.AddressList addrList
in Application.Session.AddressLists)
{
Outlook.PropertyAccessor oPAAddrList =
addrList.PropertyAccessor;
string addrListUID = oPAAddrList.BinaryToString(
oPAAddrList.GetProperty(PR_EMSMDB_SECTION_UID));
// Return addrList if match on storeUID
// and type is olExchangeGlobalAddressList.
if (addrListUID == storeUID)
{
addrLists.Add(addrList);
}
}
return addrLists;
}