Win32 APIがDLLで呼び出されました。これはSYSTEMユーザーによって読み込まれ、そのAPIは現在のユーザーに応じて異なる結果を返すため、現在のユーザーに対応する結果を取得できません。現在のログオンユーザーでそのAPIを呼び出すにはどうすればよいですか。 DLLがSYSTEMコンテキストで実行されている場合のコンテキスト?
1 に答える
私はいくつかの調査を行い、これを結論付けました(私はWin32 APIの専門家ではありませんが、本当に興味があります):
を使用できます。これは、プライマリまたは偽装ImpersonateLoggedOnUser
トークンのハンドルを要求します(少なくとも両方で、プライマリトークン、または偽装トークンで)。TOKEN_QUERY
TOKEN_DUPLICATE
TOKEN_IMPERSONATE
現在ログオンしているユーザートークンと適切な権限があれば、非常に簡単です。を使用してImpersonateLoggedOnUser
、必要なAPI関数を呼び出してから、呼び出しRevertToSelf
て元の所有者トークンに戻ります。
ただし、現在ログオンしているユーザートークンを取得するのはそれほど簡単ではありません。ユーザーの名前とパスワードを指定するかLogonUser
(正しくないようです)、電話をかけるのに十分な特権を持つWindowsサービスを所有している必要WTSQueryUserToken
があります。これは、開発しているプロジェクトの種類とは異なる場合があります。
または、通常のプロセスでこれを実行する場合は、認証機能を調べることもできます。この場合、操作が少し複雑になる可能性のある、新しいWindowsUACおよびセキュリティコンテキストを利用できます。
それが機能するかどうかわからないこの方法もあります:標準ユーザーになりすますOpenProcessToken
( onを使用してトークンを取得しますexplorer.exe
)。
私が便利だと思ったいくつかのリンク:
- MSDN-クライアントのなりすまし(Windows)
- MSDN-アクセストークン(Windows)
- MSDN-LsaLogonUser関数(Windows)
- 簡単ななりすましプログラムの例
- CodeProject-ユーザーのなりすまし
- CodeProject-Vista UAC:決定的なガイド
先に進む前に、前述のAPI関数を呼び出すときに、ユーザーになりすます必要があることを確認してください。あなたが望むことを達成するための別の道があるかどうかを確認してください。
使用しようとしているAPI関数を指定することもできます。これにより、別のより単純な質問にリダイレクトされる場合があります。