2

そのため、Windows Server 2008 を搭載したサーバーで LoadLibrary と GetProcAddress wtsapi32.dll を使用して WTSQueryUserToken() を呼び出したいと思います。実際にサーバーまで歩いてこのプログラムを実行すると、問題なくファイルを明示的に読み込むことができます。ただし、Mstsc.exe でサーバーにアクセスして同じことを行うと、GetLastError() からのエラー コード 2 で GetProcAddress() が失敗します。wtsapi32.dll はリモート デスクトップ サービス API と関係がありますが、この問題を追跡する方法がわかりません。どんなヒントでも本当に感謝します。前もって感謝します。

編集:

私が本当に困っていることについて、別の考えが出てくることがわかりました。

したがって、wtsapi32.dll は、サーバーで Mstsc.exe を実行した場合でも読み込まれます。

実際の問題は、WTSQueryUserToken() が常に失敗し、サーバーを Mstsc.exe したときにのみFALSE が返されることです。サーバーのオペレーティング システムは Windows Server 2008 です。Windows 7 を使用するデスクトップの WTSQueryUserToken() は正常に動作します。

私のコードはここに行きます。

HANDLE hTokenImperson = nullptr;

HMODULE hModWtsapi32 = LoadLibrary(TEXT("wtsapi32.dll"));
HMODULE hModKernel32 = LoadLibrary(TEXT("kernel32.dll"));
auto lpfnWTSQueryUserToken = reinterpret_cast<bool(*)(ULONG, PHANDLE)>(GetProcAddress(hModWtsapi32, "WTSQueryUserToken"));
auto lpfnWTSGetActiveConsoleSessionId = reinterpret_cast<DWORD(*)(void)>(GetProcAddress(hModKernel32, "WTSGetActiveConsoleSessionId"));

// dwSessionId is not 0.
dwSessionId = lpfnWTSGetActiveConsoleSessionId(); 

// FALSE returns only when I do mstsc.exe.
// Works well when I walk to my server and execute this application.
lpfnWTSQueryUserToken(dwSessionId, &hTokenImperson)

探しているものとは何の関係もなかったので、質問のタイトルを変更しました。

ありがとう。

4

1 に答える 1

4

WTSGetActiveConsoleSessionId物理コンソール ( MSDN ) に現在接続されているセッションを返します。リモート セッションのトークンを取得する必要がある場合は、最初にWTSEnumerateSessionsを呼び出して、アクティブなセッションを探すことができます。

BOOL WTSEnumerateSessions(
  _In_   HANDLE hServer,
  _In_   DWORD Reserved,
  _In_   DWORD Version,
  _Out_  PWTS_SESSION_INFO *ppSessionInfo, // <------
  _Out_  DWORD *pCount
);

構造体の状態を確認してください。PWTS_SESSION_INFO

アクティブなセッションのセッション ID を取得したら、 を呼び出しWTSQueryUserTokenてアクセス トークンを取得します。

于 2013-02-28T05:05:10.460 に答える