私のC#コードは、P /呼び出しを経由して偽装されたコードからの例外が検出されないのはなぜですか?
internal class Win32Native
{
[DllImport("advapi32.dll", SetLastError = true)]
public static extern int ImpersonateLoggedOnUser(IntPtr token);
[DllImport("advapi32.dll", SetLastError = true)]
public static extern int RevertToSelf();
}
try {
var token = obtainTokenFromLogonUser();
Win32Native.ImpersonateLoggedOnUser(token);
throw new Exception(); // this is for simulation
Win32Native.RevertToSelf()
} catch(Exception e) {
LogException(e);
throw;
}
をWin32関数を呼び出すことで偽装を使用しても、私はAppDomain.CurrentDomain.UnhandledException
ハンドラはまた、すべての未処理の例外をログに記録することをインストールされています。
例外をログに記録するコードは、なりすましの有無にかかわらず正常に動作することが確信しています。
ここで問題は、上記のコードではcatch
が入力されておらず、UnhandledException
も呼び出されていないということです。例外の唯一のトレースは、イベントビューアのエントリです。
私はこのようなfinally
を追加する場合:
try {
var token = obtainTokenFromLogonUser();
Win32Native.ImpersonateLoggedOnUser(token);
try {
throw new Exception(); // this is for simulation
} finally {
Win32Native.RevertToSelf()
}
} catch(Exception e) {
LogException(e);
throw;
}
は例外がcatch
からとUnhandledException
ハンドラの両方から大丈夫記録されます。
何が起こっているかスレッドが偽装されると、通常の例外処理が妨げられますか?
「LogException」にブレークポイントを設定すると、そこに着きますか? –
@MarcGravell:わかりませんが、これが再現されるデバッガはありません。 'LogException()'自体に何らかの問題があるかもしれませんが、これまでのところ依存しているコードは偽装されていても偽装されていなくても正常に動作しています。 – sharptooth
ここで推測する:.NETは実行コンテキストを追跡しているので、例外処理では、コンテキストが変更されたことを認識し、復帰が最初に実行されない限り例外ハンドラが実行されないようにします。そうしないと、コードが偽装されたユーザーで実行された場合、特権が昇格されます... –