0

私は、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 を呼び出す前に、偽装されたスレッドに対して行うべきことはありますか?

4

1 に答える 1

0

Simon Mourier が示唆したように、MTA の代わりに STA を使用すると問題が解決します。

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
于 2013-05-13T09:23:49.623 に答える