Exchange Server から連絡先リストを取得する最も簡単な方法を教えてください。私はC#を使用しています
私が調べたところ、Exchange Web サービスは Exchange Server 2007 以降にのみ存在します。それが私の最初のオプションですが、以前のバージョンの Exchange (WebDav など) の代替手段も必要です。ディレクトリ サービスはオプションではありません。
Exchange Server から連絡先リストを取得する最も簡単な方法を教えてください。私はC#を使用しています
私が調べたところ、Exchange Web サービスは Exchange Server 2007 以降にのみ存在します。それが私の最初のオプションですが、以前のバージョンの Exchange (WebDav など) の代替手段も必要です。ディレクトリ サービスはオプションではありません。
これは、EWS を使用して連絡先リストから連絡先リストを取得する方法です。グローバル リストから連絡先を取得する方法はまだわかりません。1 時間前に API を見ただけです。
private static void ListContacts(ExchangeService svc) {
foreach (var v in svc.FindItems(WellKnownFolderName.Contacts,
new ItemView(20))) {
Contact contact = v as Contact;
ContactGroup contactGroup = v as ContactGroup;
//v.Load(); // Turns out you don't need to load for basic props.
if (contact != null) {
Console.WriteLine("Contact: {0} <{1}>",
contact.DisplayName,
contact.EmailAddresses[EmailAddressKey.EmailAddress1]);
} else if (contactGroup != null) {
Console.WriteLine("Contact Group: {0}", contactGroup.DisplayName);
switch (svc.RequestedServerVersion) {
case ExchangeVersion.Exchange2007_SP1:
ExpandGroupResults groupResults
= svc.ExpandGroup((contactGroup.Id));
foreach (var member in groupResults) {
Console.WriteLine("+ {0} <{1}>",
member.Name, member.Address);
}
break;
case ExchangeVersion.Exchange2010:
foreach (GroupMember member in contactGroup.Members) {
Console.WriteLine("+ {0} <{1}>",
member.AddressInformation.Name,
member.AddressInformation.Address);
}
break;
default:
Console.WriteLine(
"** Unknown Server Version: {0}",
svc.RequestedServerVersion);
break;
}
} else {
Console.WriteLine("Unknown contact type: {0} - {1}",
contact.GetType(), v.Subject);
}
}
}
詳細については、Exchange Web サービス APIを参照してください。
まず、Microsoft Exchange Webservices Library への参照を追加することを忘れないでください。
private static void ConnectToExchangeService()
{
service = new ExchangeService();
service.Credentials = new WebCredentials(USERNAME, PASSWORD, DOMAIN_NAME);
service.AutodiscoverUrl(USER_ADDRESS);
}
private static void ListGlobalContacts(ExchangeService service)
{
/* passing true as the third parameter to "ResolveName" is important to
make sure you get the contact details as well as the mailbox details */
NameResolutionCollection searchResult = service.ResolveName(NAME_YOURE_LOOKING_FOR, ResolveNameSearchLocation.DirectoryOnly, true);
foreach (NameResolution resolution in searchResult )
{
Console.WriteLine("name is " + resolution.Contact.DisplayName);
Console.WriteLine("address is " + resolution.Mailbox.Address);
Console.WriteLine("business phone is " + resolution.Contact.PhoneNumbers[PhoneNumberKey.BusinessPhone]);
Console.WriteLine("mobile phone is " + resolution.Contact.PhoneNumbers[PhoneNumberKey.MobilePhone]);
}
}
...そして、Brett Ryan はすでに、ローカルの連絡先リストを取得するためのコードを提供しています。
グローバルな連絡先リスト (少なくともそのうちの 1 つ) を取得するこの方法の問題点は、関数 "ResolveName" が最大 100 の連絡先を返すため、組織にそれよりも多くのレコードがある場合、問題が発生することです。考えられる回避策の 1 つ (および私が実装した回避策) は、文字ごとに個別の検索を実行し (そのような検索が常に 100 件未満の結果を返すことを確認できると仮定して)、すべての一意のエントリを 1 つのリストにまとめることです。