現在ログオンしているすべてのユーザーのWindowsMediaPlayerライブラリにアクセスする必要があるWindowsサービスがあります。そのサービスなので、ログオンしたユーザーを偽装して、WMP COMへの呼び出しが偽装ユーザーのコンテキストで情報を返すようにする必要があります(つまり、システムのライブラリではなく、偽装ユーザーのライブラリを返します)。ログオンしているユーザーごとにこれを行う必要があります。
を介してスレッド内のユーザーを正常に偽装しImpersonateLoggedOnUser
、ユーザーのライブラリを取得してから、を実行することができますRevertToSelf
。次にログオンしたユーザーに対してこれを実行しようとすると、問題が発生します。WMP COMへの後続の呼び出しは、現在のユーザーが偽装されているのではなく、常に最初の偽装されたユーザーのライブラリを返すようです。
これが私がしていることの一般的な要点です:
CoInitialize(NULL);
IWMPCore* Core = NULL;
CoCreateInstance(__uuidof(WindowsMediaPlayer), 0, CLSCTX_INPROC_SERVER, __uuidof(IWMPCore), (void **)&Core);
IWMPMediaCollection* Collection = NULL;
Core->QueryInterface(__uuidof(WindowsMediaPlayer), (void **)&Collection);
...
//Do work
...
CoUninitialize();