2014-04-04 25 views
1

我需要從登錄用戶(MVC 4)獲取直接報告 我不需要直接報告的名稱,但我確實需要他們的電子郵件地址,包括他們的代理地址。 因此,我需要通過Exchange進行搜索。我個人從未嘗試過去搜索Exchange,並且我發現的所有內容都告訴我如何從步驟8到終點線,但沒有說明如何從第1步到第8步。從Exchange登錄用戶獲取直接報告

我可以得到通過簡單地

User.Identity.Name.Replace(@"yourdomain\", "") 

當前用戶的用戶名,我發現這個例子,到目前爲止大概是我發現 http://msdn.microsoft.com/en-us/library/office/ff184617(v=office.15).aspx

但即使與例如線最好的例子

Outlook.AddressEntry currentUser = 
    Application.Session.CurrentUser.AddressEntry; 

實際上並未獲取當前登錄該網站的用戶。

我真的很希望有人在那裏熟悉這一點,可以讓我超越這一點。

回答

2

我重寫了URL中的示例,如下面的LINQPad 4查詢。我發現LINQPad是一種很好的實驗方法,因爲它非常靈活,可以快速進行實驗,並且可以使用擴展方法輕鬆查看數據。購買智能感知支持是完全有價值的。

而且,我注意到有很多小字一樣的:

登錄的用戶必須對這個方法返回一個AddressEntries收集在線;否則,GetDirectReports返回空引用。對於生產代碼,必須使用_NameSpace.ExchangeConnectionMode屬性或多個Exchange方案的_Account.ExchangeConnectionMode屬性來測試脫機用戶。

如果當前用戶有一個經理,GetDirectReports()被調用返回一個AddressEntries集合,表示對用戶的經理的所有直接報告的地址表項。如果管理器沒有直接報告,GetDirectReports將返回一個計數爲零的AddressEntries集合。

因此,有很多假設像Exchange直接報告關係正確配置,並且當前用戶在線...我認爲這會將Lync帶入等式中。希望這個LINQPad查詢對你有用。只需將其複製並粘貼到文本編輯器中,並使用.linq文件擴展名命名即可。然後你就可以在LINQPad 4中打開它了。順便說一句:你的問題引起了我的注意,因爲最近在我從Active Directory提取直接報告的工作中有人談論。我希望我能更有幫助......祝你好運。

<Query Kind="Program"> 
    <Reference>&lt;ProgramFilesX86&gt;\Microsoft Visual Studio 12.0\Visual Studio Tools for Office\PIA\Office15\Microsoft.Office.Interop.Outlook.dll</Reference> 
    <Reference>&lt;ProgramFilesX86&gt;\Microsoft Visual Studio 12.0\Visual Studio Tools for Office\PIA\Office15\Microsoft.Office.Interop.OutlookViewCtl.dll</Reference> 
    <Namespace>Microsoft.Office.Interop.Outlook</Namespace> 
</Query> 

void Main() 
{ 
    GetManagerDirectReports(); 
} 

// Define other methods and classes here 
private void GetManagerDirectReports() 
{ 
    var app = new Microsoft.Office.Interop.Outlook.Application(); 
    AddressEntry currentUser = app.Session.CurrentUser.AddressEntry; 
    if (currentUser.Type == "EX") 
    { 
     ExchangeUser manager = currentUser.GetExchangeUser().GetExchangeUserManager(); 
     manager.Dump(); 
     if (manager != null) 
     { 
      AddressEntries addrEntries = manager.GetDirectReports(); 
      if (addrEntries != null) 
      { 
       foreach (AddressEntry addrEntry in addrEntries) 
       { 
        ExchangeUser exchUser = addrEntry.GetExchangeUser(); 
        StringBuilder sb = new StringBuilder(); 
        sb.AppendLine("Name: " + exchUser.Name); 
        sb.AppendLine("Title: " + exchUser.JobTitle); 
        sb.AppendLine("Department: " + exchUser.Department); 
        sb.AppendLine("Location: " + exchUser.OfficeLocation); 
        sb.Dump(); 
       } 
      } 
     } 
    } 
} 
0

我建議使用EWS託管API與您的代碼一起獲取用戶的直接報告。正如傑里米在迴應中提到的那樣,你需要建立直接的報告關係。爲了幫助你開始,這裏的一些步驟獲得EWS託管API和運行:

  1. Download the latest version of EWS Managed API
  2. Get started with EWS Managed API client applications瞭解如何引用組件,設置服務URL,並與EWS通信。
  3. 開始使用您的代碼。如果您需要一些功能正常的代碼來幫助您,請查看Exchange 2013 101 Code Samples,該代碼已經寫入了一些驗證代碼,以及一些您可以修改以創建自己的代碼的示例。
  4. 如果您有當前用戶的電子郵件地址或用戶名,則可以使用ResolveName()方法訪問他們的郵箱以檢索其他信息。這裏是一個文章,以幫助與方法:How to: Resolve ambiguous names by using EWS in Exchange 2013

基本上你想要去的地步,你可以運行一個類似的命令:

NameResolutionCollection coll = service.ResolveName(NameToResolve, ResolveNameSearchLocation.DirectoryOnly, true, new PropertySet(BasePropertySet.FirstClassProperties)); 

如果你給一個獨特的足夠的值NameToResolve參數您應該只收回集合中的一個項目。因此,您可以查看該項目中的直接報告集合,不僅可以查看其直接報告的名稱,還可以查看其電子郵件地址。

我希望這些信息對您有所幫助。如果這確實解決了您的問題,請將帖子標記爲已回答。

感謝,

---鮑勃---