0

グローバル アドレス リスト (GAL) の Outlook 配布リスト (DL) をプログラムで更新できる C# コンソール アプリを作成しようとしています。この DL を更新する権限があります。PC で Outlook を使用してインタラクティブに実行できます。また、Perl コードを使用してWin32::NetAdmin::GroupAddUsers.

COM ライブラリ「Microsoft Outlook 14.0 Object Library」への参照を追加した後、次の方法でアクセスします。

using Outlook = Microsoft.Office.Interop.Outlook;

検索されている「メイン」DL内のDLを再帰的にしても、DLから正常に読み取ることができます。これがその作業コードです(この作品には批評は必要ありません):

private static List<Outlook.AddressEntry> GetMembers(string dl, bool recursive)
{
    try
    {
        List<Outlook.AddressEntry> memberList = new List<Outlook.AddressEntry>();

        Outlook.Application oApp = new Outlook.Application();
        Outlook.AddressEntry dlEntry = oApp.GetNamespace("MAPI").AddressLists["Global Address List"].AddressEntries[dl];
        if (dlEntry.Name == dl)
        {
            Outlook.AddressEntries members = dlEntry.Members;
            foreach (Outlook.AddressEntry member in members)
            {
                if (recursive && (member.AddressEntryUserType == Outlook.OlAddressEntryUserType.olExchangeDistributionListAddressEntry))
                {
                    List<Outlook.AddressEntry> sublist = GetMembers(member.Name, true);
                    foreach (Outlook.AddressEntry submember in sublist)
                    {
                        memberList.Add(submember);
                    }
                }
                else {
                    memberList.Add(member);
                }
            }
        }
        else
        {
            Console.WriteLine("Could not find an exact match for '" + dl + "'.");
            Console.WriteLine("Closest match was '" + dlEntry.Name +"'.");
        }

        return memberList;
    }
    catch
    {
        // This mostly fails if running on a PC without Outlook.
        // Return a null, and require the calling code to handle it properl
        // (or that code will get a null-reference excception).
        return null;
    }
}

その出力を使用してメンバーを詳しく調べることができるので、DL/メンバー オブジェクトについて少し理解できたと思います。

ただし、次のコードはメンバーを DL に追加しません。

private static void AddMembers(string dl)
{
    Outlook.Application oApp = new Outlook.Application();
    Outlook.AddressEntry ae = oApp.GetNamespace("MAPI").AddressLists["Global Address List"].AddressEntries[dl];
    try {
        ae.Members.Add("EX", "Tuttle, James", "/o=EMC/ou=North America/cn=Recipients/cn=tuttlj");
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
    ae.Update();
}

への引数はここMembers.Add()で定義されており、コードに示されている値は、別の DL から自分の Member オブジェクトを調べた結果とまったく同じです。

表示される例外は、単に「ブックマークが無効です」です。以前にも同様の質問がありましたが、解決策は P/Invoke または LDAP を使用することでした。P/Invoke の使用方法がまったくわかりません (厳密には C# および Perl プログラマーであり、Windows/C/C++ プログラマーではありません)。また、LDAP サーバーにアクセスできないため、これを機能させたいと思っています。Microsoft.Office.Interop.Outlookオブジェクト。

どんな助けでも大歓迎です!

4

1 に答える 1

0

いくつかの異なる.NETオブジェクトを試した後、.NETのActive Directoryグループからユーザーを追加および削除するSystem.DirectorServices.AccountManagementに投稿されたように使用することで、最終的にこれが機能するコードになりました。私自身の質問を締めくくります。

于 2016-05-23T17:58:27.917 に答える