私は、3 つの独立したスレッドで構成される 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);
サムネイルを取得するコードが偽装されていないスレッドまたは通常のデスクトップ アプリケーションから呼び出されると、画像とビデオの両方のサムネイルを受け取ります。偽装されたスレッドからコードが呼び出されると、すべての画像に対して 1 つのアイコンが表示されるか、実装されていない hresult (IThumbnail プロバイダーの場合) のみが表示されます。
COM API を呼び出す前に、偽装されたスレッドに対して行うべきことはありますか?