【发布时间】: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