Moje kod C# używa personifikacji poprzez wywołanie funkcji Win32 poprzez P/InvokeDlaczego wyjątek od nieotrzymanego kodu nie został złapany?
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;
}
też mam AppDomain.CurrentDomain.UnhandledException
obsługi zainstalowane że również rejestruje wszystkie nieobsługiwany wyjątek.
Jestem pewien, że kod, który rejestruje wyjątki, działa dobrze zarówno z podszywaniem jak i bez niego.
Problem polega na tym, że w powyższym kodzie wygląda na to, że catch
nie jest wpisany, a UnhandledException
również nie jest wywoływany. Jedynym śladem wyjątku jest wpis w przeglądarce zdarzeń.
Jeśli dodać finally
takiego:
try {
var token = obtainTokenFromLogonUser();
Win32Native.ImpersonateLoggedOnUser(token);
try {
throw new Exception(); // this is for simulation
} finally {
Win32Native.RevertToSelf()
}
} catch(Exception e) {
LogException(e);
throw;
}
następnie wyjątek jest zalogowany w porządku zarówno z catch
iz UnhandledException
obsługi.
Co się dzieje? Czy podszywanie się pod wątek zapobiega zwykłemu traktowaniu wyjątków?
jeśli umieścisz punkt przerwania w 'LogException': dostaniesz się tam? –
@MarcGravell: Nie wiem, nie ma debuggera tam, gdzie jest on odtwarzany. Zdaję sobie sprawę, że może wystąpić problem z samym 'LogException()', ale do tej pory kod, na którym się opiera, działał dobrze zarówno podszyty, jak i podszywany. – sharptooth
Odgadnij tutaj: ponieważ .NET śledzi kontekst wykonania, obsługa wyjątków może świadczyć o tym, że kontekst się zmienił i uniemożliwia wykonanie procedury obsługi wyjątku, o ile nie zostanie najpierw wykonane odwrócenie. Niewykonanie tego spowodowałoby podniesienie uprawnień, gdyby kod był uruchamiany z podszukanym użytkownikiem ... –