我需要从登录用户(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;
实际上并没有让当前用户登录该站点。
我真的希望那里的人熟悉这一点,并且可以让我超越这一点。
答案 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><ProgramFilesX86>\Microsoft Visual Studio 12.0\Visual Studio Tools for Office\PIA\Office15\Microsoft.Office.Interop.Outlook.dll</Reference>
<Reference><ProgramFilesX86>\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:
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 参数中提供足够唯一的值,则只应返回集合中的一个项目。有了它,您可以查看该项目中的直接报告集合,不仅可以查看其直接报告的名称,还可以查看其电子邮件地址。
我希望这些信息有所帮助。如果这确实解决了您的问题,请将帖子标记为已回答。
谢谢,
---鲍勃---