WMP COM 无法在后续用户模拟下运行

WMP COM fails to operate under subsequent user impersonations

本文关键字:用户 模拟 运行 COM WMP      更新时间:2023-10-16

我有一个Windows服务,需要访问所有当前登录用户的Windows Media Player库。由于这是一项服务,因此我必须模拟登录用户,以便对 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();

您确定要发布所有接口吗?

您是否尝试过调用CoFreeUnusedLibrariesEx并在WMP dll被卸载时签入Process Explorer(但是只有具有DllCanUnloadNow导出的dll才会被卸载)?

如果仍然失败,那么 WMP 可能无法完全卸载,然后您可能必须为每个用户使用帮助程序/主机进程,并使用某种形式的 IPC 将数据恢复到主进程中。