2016-03-23 5 views
0

В одном почтовом ящике с общей папкой у меня есть две папки с поддержкой почты.Поиск общей папки для определенного почтового адреса

Теперь при выборе всех записей Active Directory для глобального списка адресов, есть некоторые записи :

Итак, я, естественно, вызовет автообнаружение EWS для этих адресов электронной почты. Это отлично подходит для всех пользователей, но не для общих папок - в нем говорится, что он не может найти почтовый ящик для этого адреса электронной почты. Поэтому я получил из Active Directory адрес электронной почты почтового ящика и подключился к нему.

Но как я могу теперь перейти в соответствующую папку? Я пробовал:

FolderView view = new FolderView(1); 
view.Traversal = FolderTraversal.Shallow; 
var folders = ews.FindFolders(
     WellKnownFolderName.Root, 
     new SearchFilter.IsEqualTo(
      FolderSchema.DisplayName, // <- how can I search by the folder's email address? 
      displayName 
     ), view); 

Это проливает следующее, действительно полезно сообщение об ошибке:

Internal Server Error. The operation failed. 

Для полноты картины, создается следующий EWS XML:

<Trace Tag="EwsRequest" Tid="121" Time="2016-03-23 13:31:41Z" Version="15.00.0913.015"> 
    <?xml version="1.0" encoding="utf-8"?> 
    <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Header> 
     <t:RequestServerVersion Version="Exchange2013" /> 
     <t:ExchangeImpersonation> 
     <t:ConnectingSID> 
      <t:SmtpAddress>[email protected]</t:SmtpAddress> 
     </t:ConnectingSID> 
     </t:ExchangeImpersonation> 
    </soap:Header> 
    <soap:Body> 
     <m:FindFolder Traversal="Shallow"> 
     <m:FolderShape> 
      <t:BaseShape>AllProperties</t:BaseShape> 
     </m:FolderShape> 
     <m:IndexedPageFolderView MaxEntriesReturned="1" Offset="0" BasePoint="Beginning" /> 
     <m:Restriction> 
      <t:IsEqualTo> 
      <t:FieldURI FieldURI="folder:DisplayName" /> 
      <t:FieldURIOrConstant> 
       <t:Constant Value="Test Public Folder Mailbox" /> 
      </t:FieldURIOrConstant> 
      </t:IsEqualTo> 
     </m:Restriction> 
     <m:ParentFolderIds> 
      <t:DistinguishedFolderId Id="root" /> 
     </m:ParentFolderIds> 
     </m:FindFolder> 
    </soap:Body> 
    </soap:Envelope> 
</Trace> 

и следующий ответ от сервера:

<Trace Tag="EwsResponse" Tid="121" Time="2016-03-23 13:31:41Z" Version="15.00.0913.015"> 
    <?xml version="1.0" encoding="utf-8"?> 
    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body> 
     <s:Fault> 
     <faultcode xmlns:a="http://schemas.microsoft.com/exchange/services/2006/types">a:ErrorInternalServerError</faultcode> 
     <faultstring xml:lang="de-DE">Interner Serverfehler. Fehler bei diesem Vorgang.</faultstring> 
     <detail> 
      <e:ResponseCode xmlns:e="http://schemas.microsoft.com/exchange/services/2006/errors">ErrorInternalServerError</e:ResponseCode> 
      <e:Message xmlns:e="http://schemas.microsoft.com/exchange/services/2006/errors">Interner Serverfehler. Fehler bei diesem Vorgang.</e:Message> 
     </detail> 
     </s:Fault> 
    </s:Body> 
    </s:Envelope> 
</Trace> 

Что может вызвать эта проблема или где я могу найти дополнительную информацию о том, почему эта проблема возникает?

ответ

1

Вначале вы не правы, вы не можете использовать EWS или любой из API доступа к почтовому ящику, чтобы открывать почтовые ящики общих папок прямо, вы должны обращаться к общедоступным папкам с помощью правильной конечной точки API, например DistinguishedFolderIdNameType.publicfolders, а также пытаетесь олицетворять общих папок почтового ящика, например

<t:ConnectingSID> 
     <t:SmtpAddress>[email protected]</t:SmtpAddress> 
    </t:ConnectingSID> 

вы не можете сделать это можно только имитировать реального пользователя, в случае доступа к дереву общих папок, вы должны использовать пользователь, имеющий права на общую папку вы хотите для доступа. Единственное, что вы должны делать с SMTP PublicFolder Mailbox, - это установить заголовки маршрутизации, чтобы убедиться, что ваш запрос правильно маршрутизирован. https://msdn.microsoft.com/en-us/library/office/dn818490(v=exchg.150).aspx

Чтобы найти общую папку, подключаемую как пользователь, и поиск в дереве общих папок и всех его дочерних , вы не можете использовать Deep traversal с деревом общих папок, поэтому вам нужно будет сделать отдельные запросы обхода неглубокого изображения для каждого уровня дочерних папок.У меня есть библиотека EWS Power Shell, которая делает это и кучу вещей, как перечисление MailEnabled папки и т.д., которые, возможно, полезно https://github.com/gscales/Powershell-Scripts/blob/master/PublicFolderMod.ps1

Если у вас есть обмен 2013 вы можете использовать управление Exchange Get-MailPublicFolder командлет, чтобы получить HexEntryId из папки затем используйте ConvertId, чтобы преобразовать его в EWSid и напрямую привязать к папке.

Приветствия Глен

+0

Выработать: Я нашел '' HexEntryId' от Get-MailPublicFolder' является то же, что и 'msExchPublicFolderEntryId' из LDAP/AD, поэтому я могу даже получить их без установки PowerShell. 'ConvertId' возвращает то, что похоже на' UniqueId' (хотя в конце он не имеет '='). Но когда я пытаюсь связать папку, сообщение об ошибке «Недопустимый идентификатор». – Alexander

0

Для тех, кто ищет, некоторые C# код для привязки к определенной общей папке:

AlternatePublicFolderId hexId = new AlternatePublicFolderId(IdFormat.HexEntryId, directoryEntry.msExchPublicFolderEntryId); 
AlternatePublicFolderId ewsId = service.ConvertId(hexId, IdFormat.EwsId) as AlternatePublicFolderId; 
calendar = CalendarFolder.Bind(service, new FolderId(ewsId.FolderId)); 

 Смежные вопросы

  • Нет связанных вопросов^_^