我在使用 IApplicationAssociationRegistration 检查默认电子邮件客户端时遇到问题。在用户上下文中,一切都很好,但是从系统上下文中运行的服务返回错误的默认客户端,因为它似乎从系统用户而不是当前登录用户那里获取值。
以下是我采取的步骤:
1) 调用 CoInitialize 和 CoInitializeSecurity 进行模拟。
2) 调用 DuplicateTokenEx 获取登录用户的 SecurityImpersonation 的安全令牌。
3) 使用令牌调用 ImpersonateLoggedOnUser。
4) 调用 CoCreateInstance 创建 IApplicationAssociationRegistration 的实例。我得到 S_OK 返回和一个实例指针。
5) 为我从步骤 (4) 获得的实例指针和 IUnknown 指针调用 CoSetProxyBlanket。我再次得到 S_OK 返回。
6) 使用我从步骤 (4) 中获得的实例指针为 Outlook 调用方法 IApplicationAssociationRegistration::QueryAppIsDefault。我再次返回 S_OK,但在系统上下文中返回 TRUE,在用户上下文中正确返回 FALSE。如果我在 regedit 中手动修改 HKEY_USERS/.DEFAULT 的 UrlAssociations/mailto/UserChoice/ProgId 值并再次调用,它将获取新值。
7) 同样,如果我调用 SetAppAsDefault,它似乎是在系统上下文中设置关联,而不是我想要的用户上下文。
如果我将步骤 4 到 7 放入控制台应用程序并使用 CreateProcessAsUser 从服务运行它,那么它可以正常工作。但我宁愿避免这样做。
任何帮助,将不胜感激。