4

Win32 APIがDLLで呼び出されました。これはSYSTEMユーザーによって読み込まれ、そのAPIは現在のユーザーに応じて異なる結果を返すため、現在のユーザーに対応する結果を取得できません。現在のログオンユーザーでそのAPIを呼び出すにはどうすればよいですか。 DLLがSYSTEMコンテキストで実行されている場合のコンテキスト?

4

1 に答える 1

4

私はいくつかの調査を行い、これを結論付けました(私はWin32 APIの専門家ではありませんが、本当に興味があります):

を使用できます。これは、プライマリまたは偽装ImpersonateLoggedOnUserトークンのハンドルを要求します(少なくとも両方で、プライマリトークン、または偽装トークンで)。TOKEN_QUERYTOKEN_DUPLICATETOKEN_IMPERSONATE

現在ログオンしているユーザートークンと適切な権限があれば、非常に簡単です。を使用してImpersonateLoggedOnUser、必要なAPI関数を呼び出してから、呼び出しRevertToSelfて元の所有者トークンに戻ります。

ただし、現在ログオンしているユーザートークンを取得するのはそれほど簡単ではありません。ユーザーの名前とパスワードを指定するかLogonUser(正しくないようです)、電話をかけるのに十分な特権を持つWindowsサービスを所有している必要WTSQueryUserTokenがあります。これは、開発しているプロジェクトの種類とは異なる場合があります。

または、通常のプロセスでこれを実行する場合は、認証機能を調べることもできます。この場合、操作が少し複雑になる可能性のある、新しいWindowsUACおよびセキュリティコンテキストを利用できます。

それが機能するかどうかわからないこの方法もあります:標準ユーザーになりすますOpenProcessToken( onを使用してトークンを取得しますexplorer.exe)。

私が便利だと思ったいくつかのリンク:

先に進む前に、前述のAPI関数を呼び出すときに、ユーザーになりすます必要があることを確認してください。あなたが望むことを達成するための別の道があるかどうかを確認してください。

使用しようとしているAPI関数を指定することもできます。これにより、別のより単純な質問にリダイレクトされる場合があります。

于 2012-11-22T03:31:55.330 に答える