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



我可以使用以下powershell命令检索存储在特定公用文件夹邮箱中的公用文件夹:

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

(但我不想使用远程PowerShell)

我无法使用EWS完成此操作。

我的第一个想法是获取所有公用文件夹,然后根据公用文件夹邮箱对它们进行排序。

但可能没有包含公用文件夹邮箱名称的Extended 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)服务器不可用的"或"类型的未处理异常"微软。交换Web服务。数据ServiceResponseException发生在Microsoft中。交换WebServices.dll">

当我尝试模拟时

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

我得到错误:

"该帐户无权模拟请求的使用者">

用户Administrator和PFMailbox1的所有邮箱权限都设置为完全访问权限。我正在使用最新的Exchange2013 dll。

第1版:

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

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

我知道的唯一解决方案是为每个公用文件夹邮箱使用远程电源外壳创建一级(根)文件夹。

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

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

我没有尝试委托访问或模拟,但如果我是公用文件夹的发布编辑器,我可以使用以下代码检索公用文件夹邮箱的直接子文件夹。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);
}
}

我找到了一个可能的解决方案。

Exchange 2013中的公用文件夹中有一个未命名的扩展EWS属性"0x6656"(我使用了OutlookSpy-选定的公用文件夹邮箱,单击EMAPIFolder)。

例如,有4e1f53e4-0f2d-46eb-873f-b4857d9d395a@myDomain.local

一个公用文件夹邮箱中的每个文件夹的值都相同。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);
}

以下是我在方法GetPublicFolders:中使用的PowerShell命令

Get-PublicFolder -GetChildren

编辑:我认为EWS不完全支持Exchange 2013公用文件夹-

  1. 如何从任何"公用文件夹邮箱"获取公用文件夹
  2. 将根级别的公用文件夹保存到任何"公用文件夹邮箱"(不仅仅是主公用文件夹邮箱)

相关内容

最新更新