【问题标题】:outlook profile .PST and .OST file location using MAPI in delphi在 delphi 中使用 MAPI 的 Outlook 配置文件 .PST 和 .OST 文件位置
【发布时间】:2014-08-24 12:30:18
【问题描述】:

有人告诉我如何在 Delphi 中使用 MAPI 查找特定配置文件的 .PST 和 .OST 文件位置吗?

代码:

我编写了以下代码来查找 .PST 路径。但我在“HrgetoneProps”行中收到错误“2147221233”

 FMapiSession := nil;
  res := MAPILogonEx(0, 'Default Outlook Profile', nil, ulFlags, FMapiSession);
if res = S_OK then
  begin
    res := MAPIAdminProfiles(0, ProfAdmin);
    {$IFDEF DEBUG}CodeSite.Send('MAPIAdminProfiles'); {$ENDIF}
    if res = S_OK then
      begin
        res := FMapiSession.AdminServices(0, ServAdmin);
        if res = S_OK then
          begin
            res := ServAdmin.GetMsgServiceTable(0, Tbl);
            if res = S_OK then
              begin
                res := Tbl.SetColumns(PSPropTagArray(@sptCols), 0);
                if res = S_OK then
                  begin
                    sres.rt := RES_PROPERTY;
                    sres.res.resProperty.relop := RELOP_EQ;
                    sres.res.resProperty.ulPropTag := PR_SERVICE_NAME;
                    sres.res.resProperty.lpProp := @spv;
                    spv.ulPropTag := PR_SERVICE_NAME;
                    spv.Value.lpszA := 'MSUPST MS';
                    res := HrQueryAllRows(Tbl, @sptCols, @sres, nil, 0, pRow);
                    if res = S_OK then
                      begin
                        for I := 0 to pRow.aRow[0].cValues - 1 do
                          begin
                            if (pRow.aRow[0].lpProps[I].ulPropTag = PR_SERVICE_UID) then
                              begin
                                MsgStoreUID := PMAPIUID(pRow.aRow[0].lpProps[I].Value.bin.lpb);
                                break;
                              end;
                          end;
                        res := ServAdmin.OpenProfileSection(MsgStoreUID, TGUID(nil^),
                          MAPI_Force_ACCESS or MAPI_MODIFY, ProfSect);

                        if res = S_OK then
                          begin
                            {$IFDEF DEBUG}CodeSite.Send('HrGetOneProp'); {$ENDIF}
                            res := HrGetOneProp(ProfSect, PR_PST_PATH, propVal);
                            if res = S_OK then
                              begin
                                Result := propVal^.Value.lpszA;
                                MAPIFreeBuffer(propVal);
                              end
                          end
                        else
                          begin
                            // ...
                          end;
                        FreePRows(pRow);
                      end;
                  end;
              end;
          end;
      end;
  end

【问题讨论】:

    标签: delphi outlook-2010 mapi


    【解决方案1】:

    你可以

    1. 解析商店条目 ID(其格式记录在 MSDN 上 - 查看 OutlookSpy 中的 PR_STORE_ENTRYID)。

    2. 查看配置文件 (IMsgServiceAdmin.GetMsgServiceTable) 中的所有服务提供商。对于 PR_SERVICE_NAME == 'MSPST MS' / 'MSUPST MS'/ 'INTERSTOR' 等的服务,请阅读服务提供商表 (IMsgServiceAdmin.AdminProviders),打开配置文件部分,阅读 PR_ENTRYID。使用 IMAPISession::CompareEntryIDs 将该条目 ID 与相关商店的条目 ID 进行比较。如果它们匹配,请阅读 PR_PST_PATH 属性。您可以在 OutlookSpy 中使用它 - 单击 IMAPISession |管理服务。

    3. 使用兑换 - 它公开 RDOPstStore.PstPath 和 RDOExchangeStore.OstPath。

    【讨论】:

    • 我尝试了第二个选项。但是还是无法获取到PR_PST_PATH,请问可以分享一下delphi中的sn-p代码吗?
    • 我无法分享我现有的代码(它是商业项目的一部分)。发布您现有的代码,我会看看。
    • 错误为MAPI_E_NOT_FOUND,表示该属性不存在。 PST 路径位于该服务提供商的配置文件部分。调用 IMsgServiceAdmin.AdminProviders 获取 IProviderAdmin。然后调用 IProviderAdmin.GetProviderTable。 PST 提供程序将在该表中只有一行。从该表中读取 PR_PROVIDER_UID,使用它调用 IProviderAdmin.OpenProfileSection,然后读取 PR_PST_PATH 属性。
    • 感谢您的建议。现在我可以检索 PR_PST_PATH 属性。但如果同一个配置文件有多个 .PST 路径,它会检索第一个路径。我无法检索所有 .PST 路径。
    • 您上面的代码仅适用于 HrQueryAllRows (pRow.aRow[0]) 返回的第一行。您需要遍历所有这些。
    猜你喜欢
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多