找到所有.pst文件

时间:2016-09-28 05:03:00

标签: c# outlook mapi

问候语

我在查找.pst文件时遇到问题。 **

任务

**是查找计算机上的所有.pst文件并创建它们的列表。

我尝试使用注册表项:“ HKCU \ Software \ Microsoft \ Office \%OfficeVersion%\ Outlook \ Search \ Catalog ”。看起来它包含所有的列表。 pst & 。 ost 文件,但结果表明它还包含已删除(或移动)文件的条目,只有在Outlook中手动连接.pst时才会更新。因此,如果您在某种“存档”中移动旧的.pst,我的注册表将不包含有关它的信息。

我知道浏览所有文件需要花费太多时间,所以我想避免这种情况。

另外,请记住,用户可能拥有大量邮箱和大量.pst(其中一些甚至可能根本不连接到Outlook)。我不能使用救赎等任何东西。只是简单的C#(可能是一些C ++ MAPI lib)

非常感谢。

1 个答案:

答案 0 :(得分:1)

PST文件位置存储在注册表的配置文件部分中。旨在访问和操作配置文件数据的官方支持的API是StreamReader constructor界面(如果单击IProfAdmin按钮,则可以在IProfAdmin中使用它)。 PST路径存储在PR_PST_PATH属性中。扩展MAPI只能从C ++或Delphi访问。

配置文件数据存储在注册表中,因此理论上您可以从注册表中读取数据,但键名是特定于配置文件的并且是随机生成的(配置文件部分名称是guid)。另请注意,注册表中的配置文件数据位置是特定于Outlook版本的。

您可以使用OutlookSpy(它附带ProfMan的可分发版本); ProfMan可以使用任何语言。以下脚本(VB)从所有本地配置文件中检索PST文件名称:

'Print the path to all the PST files in all profiles
 PR_PST_PATH = &H6700001E

 set Profiles=CreateObject("ProfMan.Profiles")
 for i = 1 to Profiles.Count
   set Profile = Profiles.Item(i)
   set Services = Profile.Services
   Debug.Print "------ Profile: " & Profile.Name & " ------"
   for j = 1 to Services.Count
     set Service = Services.Item(j)
     If (Service.ServiceName = "MSPST MS") or (Service.ServiceName = "MSUPST MS") Then
      MsgBox Service.Providers.Item(1).ProfSect.Item(PR_PST_PATH)
     End If
   next
 next

您还可以使用Outlook对象模型从PST存储中检索PST文件名(但这需要运行Outlook,并且只能对当前使用的配置文件执行此操作) - 使用Store.FilePath属性:

set vApp = CreateObject("Outlook.Application")
for each vStore in vApp.Session.Stores
  MsgBox vStore.DisplayName & " - " & vStore.FilePath
next