2013-03-15 25 views
5

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?

+0

nếu bạn đặt điểm ngắt tại 'LogException': bạn có đến đó không? –

+0

@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

+0

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 ... –

Trả lời

3

Nếu không nhìn thấy mã của LogException, tôi không thể chắc chắn, nhưng có thể là bạn đang làm gì trong ngữ cảnh người dùng đã đăng nhập/mạo danh và người dùng đó không có người dùng quyền làm bất cứ điều gì bạn đang làm ví dụ ghi vào một tập tin vv và rằng mã sau đó bị treo tại điểm đó. Thực tế là mã của bạn chỉ hoạt động sau khi bạn đã "Hoàn nguyên về bản thân" dường như chịu đựng điều này. Vì vậy, những gì tôi đang cố gắng để nói nó, rất có thể là ngoại lệ của bạn thực sự bị bắt bởi bắt, nhưng LogException là không do nó cố gắng để làm việc trong bối cảnh của một người dùng không chính xác. Các tính năng chính:

Để kiểm tra điều này, bên trong LogException của bạn, hãy thử đưa ngữ cảnh hiện tại của bạn thành "Tự" trước khi thử đăng nhập và xem liệu đoạn mã 1 có bắt đầu hoạt động hay không.

1

Tắt vấn đề là với mã đăng nhập. Tại một số thời điểm, chúng tôi đã thêm mã truy xuất thời gian bắt đầu quy trình hiện tại (Process.StartTime) và mã đó mang lại Access denied khi được gọi từ chuỗi được giả mạo.

Access is denied 
System.ComponentModel.Win32Exception 
at System.Diagnostics.Process.GetProcessHandle(Int32 access, Boolean throwIfExited) 
at System.Diagnostics.Process.GetProcessTimes() 
at System.Diagnostics.Process.get_StartTime() 
//our logging code here 

đang Logging còn gọi là System.Diagnostics.Trace.WriteLine()trước cách gọi mã với Process.StartTime và viết thông qua "dấu vết người nghe" đã thành công, chỉ viết thông qua các mã sau thất bại.

Vì vậy, không có sự khác biệt trong việc bắt ngoại lệ có hoặc không có mạo danh. Thậm chí có thể cài đặt bộ lọc ngoại lệ để nó được gọi trong ngữ cảnh bảo mật của mã mạo danh có thể dẫn đến độ cao đặc quyền. Details for the latter here.

Các vấn đề liên quan