从Exchange登录用户获取直接报告

时间:2014-04-04 19:02:02

标签: c# asp.net-mvc-4 exchange-server ews-managed-api

我需要从登录用户(MVC 4)获取直接报告 我不需要直接下属的名称,但我确实需要他们的电子邮件地址,包括他们的代理地址。 因此,我需要搜索Exchange。我个人过去从未尝试过搜索Exchange,我发现的所有信息都告诉我如何从第8步到达终点,但没有说明如何从第1步到第8步。

我只需

即可获得当前用户的用户名
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 个答案:

答案 0 :(得分:2)

我将URL中的示例重新编写为以下LINQPad 4查询。我发现LINQPad是一种很好的实验方式,因为它非常易于编写,可以快速进行实验,您可以使用Dump()扩展方法轻松查看数据。购买intellisense支持是完全值得的。

另外,我注意到有很多精美的印刷品:

  

登录用户必须在线才能使此方法返回AddressEntries集合;否则,GetDirectReports返回一个空引用。对于生产代码,您必须使用_NameSpace.ExchangeConnectionMode属性或多个Exchange方案的_Account.ExchangeConnectionMode属性来测试用户是否处于脱机状态。

  

如果当前用户有经理,则调用GetDirectReports()以返回AddressEntries集合,该集合表示用户经理的所有直接报告的地址条目。如果经理没有直接报告,GetDirectReports将返回一个计数为零的AddressEntries集合。

所以有很多假设,比如使用直接报告关系正确配置Exchange,并且当前用户在线......我认为这会使Lync进入等式。希望这个LINQPad查询对您有用。只需将其复制并粘贴到文本编辑器中,并使用.linq文件扩展名命名。然后,您就可以在LINQPad 4中打开它.BTW:您的问题引起了我的注意,因为我最近在从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();
                }
            }
        }
    }
}

答案 1 :(得分: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
  5. 基本上你想要达到可以运行类似命令的程度:

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

    如果您在 NameToResolve 参数中提供足够唯一的值,则只应返回集合中的一个项目。有了它,您可以查看该项目中的直接报告集合,不仅可以查看其直接报告的名称,还可以查看其电子邮件地址。

    我希望这些信息有所帮助。如果这确实解决了您的问题,请将帖子标记为已回答。

    谢谢,

    ---鲍勃---