私のC#コードは、P/Invokeを介してWin32関数を呼び出すことによって偽装を使用しています
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;
}
また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
。
何が起こっていますか?偽装されているスレッドは、通常の例外処理を妨げますか?