使用服务中的IApplicationAssociationRegistration

时间:2012-10-12 14:10:22

标签: winapi com

我在使用IApplicationAssociationRegistration检查默认电子邮件客户端时遇到问题。在用户上下文中一切都很好,但是从系统上下文中运行的服务返回错误的默认客户端,因为它似乎从系统用户而不是当前登录用户中获取值。

以下是我采取的步骤:

1)调用CoInitialize和CoInitializeSecurity进行模拟。

2)调用DuplicateTokenEx获取登录用户的SecurityImpersonation安全令牌。

3)使用令牌调用ImpersonateLoggedOnUser。

4)调用CoCreateInstance以创建IApplicationAssociationRegistration的实例。我得到S_OK返回和一个实例指针。

5)为从步骤(4)获得的实例指针和IUnknown指针调用CoSetProxyBlanket。我再次得到S_OK。

6)使用我从步骤(4)获得的实例指针调用方法IApplicationAssociationRegistration :: QueryAppIsDefault for Outlook。我再次返回S_OK,但是在系统上下文中我返回TRUE,并且在用户上下文中我正确地返回FALSE。如果我在regedit中手动修改HKEY_USERS / .DEFAULT的UrlAssociations / mailto / UserChoice / ProgId值并再次调用,则会获取新值。

7)同样,如果我调用SetAppAsDefault,它似乎在系统上下文中设置关联,而不是我想要的用户上下文。

如果我将步骤4到7放入控制台应用程序并使用CreateProcessAsUser从服务运行,那么它可以正常工作。但我宁愿避免这样做。

任何帮助都将不胜感激。

0 个答案:

没有答案