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 を使用してサービスからこれを実行すると、正常に動作します。しかし、私はむしろこれを行う必要は避けたいと思います。
どんな助けでも大歓迎です。