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



>我需要从登录用户那里获取直接报告(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;

实际上并没有让当前用户登录到站点。

我真的希望有人熟悉这一点,并能让我度过这一点。

我将 URL 中的示例重新设计为以下 LINQPad 4 查询。我发现 LINQPad 是一种很好的试验方法,因为它非常具有脚本性,允许快速试验,并且您可以使用 Dump() 扩展方法轻松查看数据。购买智能感知支持是完全值得的。

另外,我注意到有很多小字,例如:

登录用户必须联机,此方法才能返回 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.0Visual Studio Tools for OfficePIAOffice15Microsoft.Office.Interop.Outlook.dll</Reference>
  <Reference>&lt;ProgramFilesX86&gt;Microsoft Visual Studio 12.0Visual Studio Tools for OfficePIAOffice15Microsoft.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();
                }
            }
        }
    }
}

我建议将 EWS 托管 API 与您的代码结合使用,以获取用户的直接报告。正如 Jeremy 在他的回复中提到的那样,您需要已经建立直接下属关系。为了帮助您入门,下面是启动并运行 EWS 托管 API 的一些步骤:

  1. 下载最新版本的 EWS 托管 API
  2. 开始使用 EWS 托管 API 客户端应用程序,了解如何引用程序集、设置服务 URL 以及与 EWS 通信。
  3. 开始使用您的代码。如果您需要一些正常运行的代码来帮助您,请查看 Exchange 2013 101 代码示例,其中已编写了一些身份验证代码,以及一组可以修改以创建自己的示例。
  4. 如果您有当前用户的电子邮件地址或用户名,则可以使用 ResolveName() 方法访问其邮箱以检索其他信息。下面是帮助使用该方法的文章:如何:在 Exchange 2013 中使用 EWS 解析不明确的名称

本质上,您希望达到可以运行类似如下命令的地步:

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

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

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

谢谢

---鲍勃---

最新更新