Windowsでのユーザーのなりすましのニュアンスをマスターするための旅では、リモートデータベースへのなりすましに関する問題が最初に発生しましたが(this SO question参照)、私はそれを最後に考え出しました。私の次のハードルは、元に戻す/取り消す/元に戻す(お気に入りの動詞を選ぶ)偽装です。Windowsのなりすまし:軟膏の欠陥
- フィル・ハーディングさんImpersonator
- マット・ジョンソンのSimpleImpersonation
結果は、両方のライブラリと同一である:
は私が私には確かなようですカップル異なる偽装ライブラリを試してみました。ベストプラクティスでは、リモートDB接続にLOGON32_LOGON_NEW_CREDENTIALSログオンタイプ(Windows API LogonUser functionを参照)を使用するよう指示されています。
// SCENARIO A
BEGIN impersonation.
Local user = MyDomain\MyUser
DB reports: MyDomain\ImpersonatedUser
END impersonation.
Local user = MyDomain\MyUser
DB reports: MyDomain\ImpersonatedUser << NOT EXPECTED HERE!!
私が見つけた唯一の回避策はLOGON32_LOGON_INTERACTIVEログオンタイプを使用することですし、私はこの取得:の簡潔な説明から
// SCENARIO B
BEGIN impersonation.
Local user = MyDomain\ImpersonatedUser << EXPECTED, BUT NOT WANTED!
DB reports: MyDomain\ImpersonatedUser
END impersonation.
Local user = MyDomain\MyUser
DB reports: MyDomain\MyUser
を私はここに私のサンプルコードが生成するものであることを行うとWindowsImpersonationContext.Undo方法はシナリオAで動作しているはずです。
LOGON32_LOGON_NEW_CREDENTIALSログオンタイプを使用して元に戻すことはできますか?
データベースへの接続を閉じて再度開きます。偽装レベルを変更すると、データベースは通知を受け取りません。シナリオBでは、データベースクライアントが自動的に新しい接続を確立しているとしか推測できません。 –
コメントありがとうございます、@ハリージョンストン;私は、実際にはSQL接続を閉じて新鮮なものを開始したと述べるべきでした。 –
おそらく、データベースクライアントがSQL接続をキャッシュしているか、または潜在的なネットワーク接続(名前付きパイプ?)がキャッシュされている可能性があります。あなたの最善の選択肢はおそらくあなたのための偽装データベース接続を行うために(新しいトークンのコンテキストで)サブプロセスを起動することです。 –