Mã của tôi C# sử dụng mạo danh bằng cách gọi chức năng Win32 qua P/InvokeTại sao ngoại lệ từ mã mạo danh không bị bắt?
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;
}
cũng Tôi có AppDomain.CurrentDomain.UnhandledException
xử lý được cài đặt mà cũng ghi nhận mọi sự ngoại lệ unhandled.
Tôi chắc chắn rằng mã ghi nhật ký ngoại lệ hoạt động tốt cả khi có và không có mạo danh.
Bây giờ vấn đề là ở mã trên có vẻ như catch
không được nhập và UnhandledException
cũng không được gọi. Dấu vết duy nhất của ngoại lệ là một mục trong Trình xem sự kiện.
Nếu tôi thêm một finally
như thế này:
try {
var token = obtainTokenFromLogonUser();
Win32Native.ImpersonateLoggedOnUser(token);
try {
throw new Exception(); // this is for simulation
} finally {
Win32Native.RevertToSelf()
}
} catch(Exception e) {
LogException(e);
throw;
}
thì ngoại lệ được đăng nhập ổn cả từ catch
và từ UnhandledException
xử lý.
Điều gì đang xảy ra? Liệu luồng được mạo danh có ngăn chặn việc xử lý ngoại lệ thông thường không?
nếu bạn đặt điểm ngắt tại 'LogException': bạn có đến đó không? –
@MarcGravell: Tôi không biết, không có trình sửa lỗi nào được sao chép lại. Tôi nhận ra rằng có thể có một số vấn đề với chính 'LogException()', nhưng cho đến nay mã nó dựa vào việc làm tốt cả mạo danh và không mạo danh. – sharptooth
Hãy đoán tại đây: vì .NET theo dõi ngữ cảnh thực thi, việc xử lý ngoại lệ có thể nhận ra rằng ngữ cảnh đã thay đổi và ngăn cản trình xử lý ngoại lệ thực hiện trừ khi hoàn nguyên được thực hiện trước. Không làm như vậy sẽ dẫn đến độ cao đặc quyền nếu mã được chạy với người dùng bị mạo danh ... –