7

C# .NET Windows サービスを開発しています。

私たちのサービスはシステム アカウントで実行されており、ログインしているユーザー USER になりすまそうとしています。偽装は正常に機能します。つまり、偽装後に呼び出すとSystem.Security.Principal.WindowsIdentity.GetCurrent()、正しいユーザー「USER」が取得されます。

問題は、ユーザー プロファイルにアクセスしようとしても、期待した結果が得られないことです。1 つの例は、レジストリ CURRENT_USER へのアクセスです。アクセス拒否エラーが発生します。部分的にレジストリを使用すると想定しているサードパーティ機能を使用する場合、「本物の」(なりすまし前の) ユーザーの詳細を取得します。また、呼び出し時Environment.ExpandEnvironmentVariables("%TEMP%")に、ログインしているユーザー プロファイルの代わりにシステム プロファイルを取得します。

完全に別のユーザーになりすます方法はありますか? LoadUserProfile を使用して特定のユーザー プロファイルを取得できることはわかっていますが、現在のユーザー プロファイルを使用するサード パーティの dll を実行しているため、これは適切ではありません。

私たちの偽装コードはこれに基づいています

4

2 に答える 2

3

HKEY_CURRENT_USERあなたが発見したように、なりすましは環境をセットアップしません。

これは、偽装トークンがスレッドごとであり、HKCU と環境がプロセスごとであるためです。

ユーザーの通常の環境にアクセスする必要がある場合は、HKEY_USERS\SIDたとえば、偽装ユーザーの SIDを使用する必要がありますHKEY_USERS\S-1-5-21-12345678-12345678-12345678-1234LoadUserProfileキーがロードされていることを確認するために呼び出します。(現在ログオンしているユーザーであると想定されている場合は、既に読み込まれているはずなので、おそらくそれを行うべきではありませんが、存在することを確認し、存在しない場合はエラーを返します)。

これは HKCU 内のキー「環境」の下にあるため、通常の環境がどうなるかを調べることもできます。それをシステム環境と組み合わせるだけです。

サード パーティの DLL が実際に HKCU と環境を正しくセットアップする必要がある場合は、ユーザーのログオン セッション内にプロセスを作成して DLL をホストし、なんらかの操作の結果を何らかの方法で送り返す必要があります。環境のみが必要な場合は、子プロセスを作成して環境を手動で設定できます。

ただし、なぜこれをやりたいのかは述べていません。より大きな問題に対する解決策の一部として、これに落ち着いたようですね。可能であれば、ユーザーの環境や HKCU をまったく取得せずに必要なことを行う方法があるかどうかを確認することをお勧めします。

ユーザー自身のセッションで DLL を直接実行できないのはなぜですか? なぜサービスが必要なのですか?ソリューションを再設計して、ログオン セッションで実行され、サード パーティの DLL をホストするユーザー モード部分があり、それがサービスと通信して、サービスが絶対に必要なことだけを実行するようにすることはできますか?

于 2013-01-08T14:45:56.367 に答える
2

コードが を呼び出さないことに気付きましたLoadUserProfile。そのため、ユーザー プロファイルが読み込まれていません。

その関数の備考に注意してくださいHKEY_CURRENT_USER。ただし、まだ置き換えられていません。

を呼び出すことで、(サードパーティの DLL を呼び出す前に) この問題を解決できると思いRegOverridePredefKeyます。

これをすべて正しく機能させるには、多くのブードゥー教が関与している可能性があることに注意してください-サードパーティの呼び出しの前にオーバーライドができるだけ遅く発生し、その後できるだけ早く元に戻されるようにします(これがすべてであることを願っています)ライブラリへの単一の呼び出し)。

別の方法として、この面倒な作業をすべて必要としない別のサードパーティ製品を真剣に探してみます。

于 2013-01-08T14:37:37.773 に答える