0

次の PowerShell コマンドを使用して、特定のパブリック フォルダー メールボックスに格納されているパブリック フォルダーを取得できます。

Get-PublicFolder –GetChildren | Where { $ _.ContentMailboxName –eq “PFMailbox1” }

(ただし、リモート PowerShell は使用したくありません)

EWS を使用してこれを行うことはできません。

私の最初のアイデアは、すべてのパブリック フォルダーを取得し、パブリック フォルダー メールボックスに従って並べ替えることでした。

ただし、パブリック フォルダーのメールボックス名を含む拡張 MAPI プロパティはおそらく存在しません (ContentMailboxName powershell プロパティに似ています)。

だから私はこれを試しました:デリゲートアクセスを使用したEWS

var mailbox = new Mailbox("PFMailbox1@MyDomain.local"); 
// PFMailbox1 is Public Folder mailbox with Pubclic folders
FolderId folderId = new FolderId(WellKnownFolderName.MsgFolderRoot, mailbox);
Folder rootfolder = Folder.Bind(service, folderId);

(WellKnownFolderName プロパティは .Root および PublicFolderRoot でもテストされました)

しかし、私は常にエラーが発生します:

「要求に失敗しました。リモート サーバーがエラーを返しました: (503) サーバーを利用できません。」または「タイプ 'Microsoft.Exchange.WebServices.Data.ServiceResponseException' の未処理の例外が Microsoft.Exchange.WebServices.dll で発生しました」

真似してみたところ

service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, impUser);
// impUser=PFMailbox1@MyDomain.local
Folder rootfolder = Folder.Bind(service, WellKnownFolderName.MsgFolderRoot );

エラーが発生します:

「このアカウントには、要求されたユーザーを偽装する権限がありません。」

ユーザー Administrator と PFMailbox1 のすべてのメールボックス アクセス許可は、フル アクセスに設定されています。最新の Exchange2013 dll を使用しています。

EDIT1:

2 番目の問題は、ルート パブリック フォルダーを作成し、目的のパブリック フォルダー メールボックスに保存する方法です。

EWS メソッド Folder.Save(FolderId) にはパラメーターが 1 つしかなく、FolderId = PublicFolderRoot を使用すると、すべてのフォルダーが MasterHierarchy パブリック フォルダー メールボックス (最初に作成されたメールボックス) に保存されます。

私が知っている唯一の解決策は、すべてのパブリック フォルダー メールボックスに対してリモート パワー シェルを使用して第 1 レベル (ルート) フォルダーを作成することです。

New-PublicFolder "Folder1" -Mailbox "PFMailbox1"
New-PublicFolder "Folder2" -Mailbox "PFMailbox2"

次に、2 番目 (3 番目、..) のフォルダー レベルで、Folder.Save(FolderID) を使用できます。しかし、EWS を使用してそれを行う方法は?

4

2 に答える 2

0

可能な解決策を見つけました。

Exchange 2013 のパブリック フォルダーに名前のない拡張 EWS プロパティがあり"0x6656"ます (私は OutlookSpy を使用しました - パブリック フォルダー メールボックスを選択し、EMAPIFolder をクリックします)。

たとえば、4e1f53e4-0f2d-46eb-873f-b4857d9d395a@myDomain.local

値は、1 つのパブリック フォルダー メールボックス内のすべてのフォルダーで同じです。GUID ( の前@) はExchangeMailboxGuid- これは、Active Directory からパブリック フォルダー メールボックスと共に読み取られ、パブリック フォルダーとメールボックスをペアにすることができます。

問題は、マネージド EWS を使用してこのプロパティを読み取ることができなかったことです (名前のない拡張プロパティを読み取ることができません)。私はこの定義を使用しました:

var ExchangeMailboxGuid = new ExtendedPropertyDefinition(0x6656, MapiPropertyType.String);

管理されていない EWS を試すこともできますが、もっと複雑です。

一時的な解決策として、EWS とリモート PowerShell を組み合わせました。ここに私の疑似コードがあります:

if (folderId == null)   // It is root public folder
{
    var mailboxGuid = GetMailboxId();
    // public folder root
    var ewsFolderId = EwsAdapter.GetPublicFolderId(folderId);
    // get all root public folders from all public folder mailboxes
    var tempFindFolderResults = FindFolders(ewsFolderId);

    var powerShellConnection = new powerShellConnection(ConnectionConfiguration);
    // get all root public folders with info which mailbox is owner
    var PublicFolderMailboxes = powerShellConnection.GetPublicFolders();

    foreach (var publicFolderMailbox in PublicFolderMailboxes)
    {
        if (publicFolderMailbox.Attributes["ExchangeMailboxGuid"].Value == mailboxGuid)
        {
            foreach (var tempFindFolderResult in tempFindFolderResults)
            {
                if (tempFindFolderResult.DisplayName == publicFolderMailbox.Attributes["Name"].Value)
                {
                    // add only folder from selected public folder mailbox
                    findFolderResults.Add(tempFindFolderResult);
                }
            }
        }
    }
}
else  // it is public subfolder - standard handling
{
    var ewsFolderId = EwsAdapterHelper.GetPublicFolderId(folderId);
    findFolderResults = FindFolders(ewsFolderId);
}

メソッドで使用する PowerShell コマンドは次のGetPublicFoldersとおりです。

Get-PublicFolder -GetChildren

編集: EWS は Exchange 2013 パブリック フォルダーを完全にはサポートしていないと思います -

  1. 「パブリックフォルダーメールボックス」からパブリックフォルダーを取得する方法と
  2. ルート レベルのパブリック フォルダーを任意の "パブリック フォルダー メールボックス" (プライマリ パブリック フォルダー メールボックスだけでなく) に保存します。
于 2014-02-28T13:50:51.173 に答える