我在使用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从服务运行,那么它可以正常工作。但我宁愿避免这样做。
任何帮助都将不胜感激。