0

何時間も検索した後、ここで私の運を試しています。

john.doe@company.com と admin.test@company.com の 2 つのアクティブなアカウントを持つ Outlook 2010 があるとします。

admin.test@company.com のグローバル アドレス リストをプルする必要があります。

            using Microsoft.Office.Interop.Outlook;

            Application app = new Application();
            NameSpace ns = app.GetNamespace("MAPI");
            ns.Logon("", "", false, true);

            AddressList GAL = ns.AddressLists["Global Address List"];

            foreach (AddressEntry oEntry in GAL.AddressEntries)
            {
                // do something
            }

ここでの問題は、GAL がいずれかのアカウントに属している可能性があり、少なくとも MSDN を読んでも、実際に使用するアカウントをどのように指定すればよいかがわからないことです。

そのようなすべてのリストを調べる場合:

foreach (AddressList lst in ns.AddressLists)
{
    Console.WriteLine("{0}, {1}", lst.Name, lst.Index);
}

「Global Address List」という名前の 2 つのエントリ、「Contacts」という名前の 2 つのエントリなど、インデックスが異なることがわかりますが、どちらがどのアカウントに属しているかはまだ明確ではありません。

フォルダの場合、次のような構成を使用できるため、非常にうまく機能します。

ns.Folders["admin.test@company.com"].Folders["Inbox"];

しかし、AddressLists の同様のメカニズムがわかりません。

どんな助けでも感謝します。

ありがとうございました。

4

2 に答える 2

0

異なるサーバーからの GAL は、プロファイル (IProfAdmin) とアカウント管理 API (IOlkAccountManager) を使用して、対応するストアとアカウントに関連付ける必要があります。これらのインターフェイスは、C++ または Delphi でのみアクセスできます。ストア (IMsgSTore) とアドレス帳オブジェクト (IABContainer) の両方から PR_EMSMDB_SECTION_UID を読み取る必要があります。アカウントと照合する必要がある場合、IOlkAccount オブジェクトの PROP_MAPI_EMSMDB_SECTION_UID (0x20070102) プロパティで同じ値を使用できます。IOlkAccountManagerボタンをクリックして Exchange アカウントをダブルクリックすると、OutlookSpy で確認できます。

Redemptionを使用するオプションがある場合は、GAL、AllAddressLists、PrimaryStore、PublicFolders などのプロパティを公開するRDOExchangeAccountオブジェクトを使用できます。

于 2013-03-12T20:07:48.710 に答える
0

Account.CurrentUser UID と一致する AddressList UID を使用して、正しいリストを選択しました。Store を使用する方が良い方法かどうかはわかりませんが、これはうまく機能します。

リチャードとドミトリー、助けてくれてありがとう。

また、Dmitry インターネットで利用できるすべての MAPI タグの唯一のソースを維持してくれてありがとう。

コード:

using Microsoft.Office.Interop.Outlook;

const string PR_EMSMDB_SECTION_UID = "http://schemas.microsoft.com/mapi/proptag/0x3D150102";

Application app = new Application();
NameSpace ns = app.GetNamespace("MAPI");
ns.Logon("", "", false, true);

string accountName = "admin.test@company.com";
string accountUID = null;

// Get UID for specified account name
foreach (Account acc in ns.Accounts)
{
    if (String.Compare(acc.DisplayName, accountName, true) == 0)
    {
        PropertyAccessor oPAUser = acc.CurrentUser.PropertyAccessor;
        accountUID = oPAUser.BinaryToString(oPAUser.GetProperty(PR_EMSMDB_SECTION_UID));
        break;
    }
}

// Select GAL with matched UID
foreach (AddressList GAL in ns.AddressLists)
{
    if (GAL.Name == "Global Address List")
    {
        PropertyAccessor oPAAddrList = GAL.PropertyAccessor;
        if (accountUID == oPAAddrList.BinaryToString(oPAAddrList.GetProperty(PR_EMSMDB_SECTION_UID)))
        {
            foreach (AddressEntry oEntry in GAL.AddressEntries)
            {
                // do something
            }
            break;
        }
    }
}
于 2013-03-13T16:17:26.410 に答える