如何通过EWS从Exchange 2013中的一个公用文件夹邮箱获取公用文件夹

时间:2014-02-20 14:48:06

标签: c# powershell exchange-server exchangewebservices public-folders

我可以使用此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:

第二个问题是如何创建根公用文件夹并将其保存到所需的公用文件夹邮箱?

EWS方法Folder.Save(FolderId)只有一个参数,如果我使用FolderId = PublicFolderRoot - >所有文件夹都将保存到MasterHierarchy公用文件夹邮箱(首次创建的邮箱)。

我所知道的唯一解决方案是使用Remote Power Shell为每个公用文件夹邮箱创建第一级(根)文件夹。

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

然后在第二个(第三个,..)文件夹级别我可以使用Folder.Save(FolderID)。 但是如何使用EWS呢?

2 个答案:

答案 0 :(得分:0)

我没有尝试使用委托访问或模拟,但如果我是公用文件夹的发布编辑器,我可以使用以下代码检索公用文件夹邮箱的直接子文件夹。有一个FolderTraversal值来指定浅层搜索(仅直接子文件夹)或深度搜索(整个层次结构),但不能在公共文件夹上使用深层。

private static void GetFolderHierarchy(int folderViewSize, ExchangeService service)
    {
        FolderView view = new FolderView(folderViewSize);
        view.PropertySet = new PropertySet(BasePropertySet.IdOnly, FolderSchema.DisplayName);     

        // Call FindFolders to retrieve the folder hierarchy, starting with the PublicFoldersRoot folder.
        FindFoldersResults findResults = service.FindFolders(WellKnownFolderName.PublicFoldersRoot, view);

        foreach (Folder folder in findResults.Folders)
        {
             Console.WriteLine("Public folder display name: {0} ", folder.DisplayName);

        }
   }

答案 1 :(得分:0)

我找到了可能的解决方案。 Exchange 2013中的公用文件夹中有未命名的扩展EWS属性“0x6656”(我使用OutlookSpy - 选择公用文件夹邮箱,单击EMAPIFolder)。 例如4e1f53e4-0f2d-46eb-873f-b4857d9d395a@myDomain.local

一个公用文件夹邮箱中的每个文件夹的值都相同。 GUID(在@之前)是ExchangeMailboxGuid - 可以与ActiveDirectory中的公用文件夹邮箱一起读取,然后将公用文件夹与邮箱配对。

问题是我无法使用托管EWS读取此属性(我无法读取任何未命名的扩展属性)。我使用了这个定义:

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

也许我可以尝试非托管的EWS。但它更复杂。

作为临时解决方案,我将EWS和远程PowerShell结合起来。这是我的伪代码:

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

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

            foreach (var PublicFolderMailbox in PublicFolderMailboxes)
            {
                if ((PublicFolderMailbox.Attributes["ExchangeMailboxGuid"].Value.Equals(mailboxGuid))
                {
                    foreach (var tempFindFolderResult in tempFindFolderResults)
                    {
                        if (tempFindFolderResult.DisplayName.Equals(PublicFolderMailbox.Attributes["Name"].Value)
                        {
                            findFolderResults.Add(tempFindFolderResult);  // add only folder from selected public folder mailbox
                        }
                    }
                }
            }
        }
        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.将根级别的公用文件夹保存到任何“公用文件夹邮箱”(不仅是主公用文件夹邮箱)。