【问题标题】:Using COM objects in the Impersonated thread在模拟线程中使用 COM 对象
【发布时间】:2013-05-06 03:50:15
【问题描述】:

我正在编写包含三个独立线程的 Windows 服务。当用户登录时(在服务启动时登录)我模拟每个线程(因此它以与当前登录用户相同的访问权限运行)。

(Impersonation code without error handling)

    /*Query Token */
    WTSQueryUserToken(SessionId, &hUserToken)

    /* Duplicate Token */
    DuplicateToken(
        hUserToken,
        SecurityImpersonation,
        &hDuplicateUserToken
        )

    /* Open Thread handle */
    hThreadHandle = OpenThread(
            THREAD_IMPERSONATE | 
            THREAD_QUERY_INFORMATION | 
            THREAD_SET_THREAD_TOKEN,
            TRUE,
            threadID
            );

    /* Assign the impersonation token to the thread */
    SetThreadToken(&hThreadHandle, hDuplicateUserToken)

稍后在同一个线程中,我使用 COM(图像工厂)对象来检索图像的缩略图(使用许多可用的 API 会产生类似的结果)

    /* com initialization */
    CoInitializeEx(NULL, COINIT_MULTITHREADED | COINIT_DISABLE_OLE1DDE);

    /* piece of code to retrieve a thumbnail */
    hr = pImageFactory->GetImage(size, SIIGBF_BIGGERSIZEOK, &thumbNail);

当从非模拟线程或普通桌面应用程序调用检索缩略图的代码时,我会收到图像和视频的缩略图。 当从模拟线程调用代码时,我收到的唯一信息是所有图像的一个图标或未实现的 hresult(对于 IThumbnail 提供程序)。

在调用 COM API 之前,我应该对模拟线程做些什么吗?

【问题讨论】:

  • 您是否尝试将您的线程放在 STA 而不是 MTA 中?此外,Windows 服务不太适合 1) 模拟登录用户和 2) 使用 Windows Shell 服务。为什么不写一个在用户登录时运行的应用程序?
  • 谢谢西蒙!使用 STA 代替 MTA 可与 IThumbnail Provider 配合使用。

标签: c++ multithreading com impersonation


【解决方案1】:

正如 Simon Mourier 建议的那样 - 使用 STA 代替 MTA 可以解决问题。

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 2014-04-21
    • 2014-12-27
    相关资源
    最近更新 更多