Vb.net 如何通过Outlook的对象模型查找“联系人”文件夹?

Vb.net 如何通过Outlook的对象模型查找“联系人”文件夹?,vb.net,office-2007,outlook-object-model,Vb.net,Office 2007,Outlook Object Model,我有一些代码,可以通过迭代Application.Session.Stores集合来定位用户有权访问的所有联系人文件夹 这适用于用户的联系人以及所有公共联系人文件夹。它还可以在用户通过工具->帐户设置添加的其他邮箱帐户中查找所有联系人文件夹。。。菜单命令 但是,这要求用户拥有对其他人帐户的完全访问权限。当用户只能访问另一个人的联系人时,该人的联系人将显示在“联系人”视图中的“联系人”组下。我如何找到那些未显示在Session.Stores下的联系人文件夹 要查看其他用户的联系人文件夹而不添加对其

我有一些代码,可以通过迭代Application.Session.Stores集合来定位用户有权访问的所有联系人文件夹

这适用于用户的联系人以及所有公共联系人文件夹。它还可以在用户通过工具->帐户设置添加的其他邮箱帐户中查找所有联系人文件夹。。。菜单命令

但是,这要求用户拥有对其他人帐户的完全访问权限。当用户只能访问另一个人的联系人时,该人的联系人将显示在“联系人”视图中的“联系人”组下。我如何找到那些未显示在Session.Stores下的联系人文件夹

要查看其他用户的联系人文件夹而不添加对其完整邮箱的访问权限,请单击文件->打开->其他用户文件夹。。。从Outlook菜单中。在对话框中,输入其他用户的姓名,然后从“文件夹类型”下拉列表中选择“联系人”

下面是代码减去错误检查和日志记录,我用来查找用户所有Outlook联系人文件夹的列表。我知道这可以而且可能应该使用Outlook.Application类型的早期绑定来完成,但这不会影响结果。EnumerateFolders是递归的,因此它搜索所有子文件夹

Dim folderList = New Dictionary(Of String, String)
Dim outlookApp = CreateObject(Class:="Outlook.Application")
For Each store As Object In outlookApp.Session.Stores
    EnumerateFolders(folderList, store.GetRootFolder)
Next

Private Sub EnumerateFolders(ByRef folderList As Dictionary(Of String, String), ByVal folder As Object)
    Try
        If folder.DefaultItemType = 2 Then
            folderList.Add(folder.EntryID, folder.FolderPath.Substring(2))
        End If

        For Each subFolder As Object In folder.Folders
            EnumerateFolders(folderList, subFolder)
        Next
    Catch ex As Exception

    End Try
End Sub

因为我在这里没有得到任何答案,所以我在msdn论坛上问了这个问题

答案如下:

在Outlook 2007或更高版本中,浏览导航窗格。有关概述,请参阅。处的示例显示了如何迭代日历模块中的所有导航组。每个NavigationFolder都有一个文件夹对象属性,该属性返回其他用户邮箱或其他存储中的实际文件夹

这将获得用户正在使用的所有文件夹。如果希望他们理论上有权访问的所有文件夹,可以迭代GAL中的条目,并尝试对每个条目执行Namespace.GetSharedDefaultFolder。如果无法返回文件夹,则用户没有访问权限

现在我已经看到了这一点,我想我将使用ContactsModule查找所有联系人文件夹,而不是在商店中的所有文件夹中搜索联系人文件夹。应该快得多