Trong khi thử nghiệm một ứng dụng, tôi đã chạy vào một hành vi lạ. Một số thử nghiệm sử dụng mạo danh để chạy mã với tư cách người dùng khác, nhưng họ sẽ luôn treo, không bao giờ hoàn thành.Tạo Mutex bị treo trong khi sử dụng mạo danh
Sau khi điều tra, vấn đề đã được thu hẹp lại khi sử dụng mutexes. Ban đầu, chúng tôi đã sử dụng mã mạo danh của riêng mình dựa trên MSDN documentation, nhưng ngay cả khi sử dụng SimpleImpersonation library sự cố vẫn còn. Dưới đây là một ví dụ nhỏ để tạo lại vấn đề:
using (Impersonation.LogonUser(DOMAIN, USER, PASSWORD, LogonType.Interactive))
{
Console.WriteLine("Impersonated");
bool mine;
using (new Mutex(true, "Mutex", out mine))
{
if (!mine)
throw new Exception("Couldn't get mutex");
Console.WriteLine("Got mutex");
}
}
Console.WriteLine("Finished");
này không bao giờ kết thúc, nó bị kẹt trên phù hợp với việc tạo ra mutex. Các documentation nói rằng nó hoặc là nên ném một ngoại lệ hoặc trả lại một cái gì đó, nhưng không đề cập đến chặn.
Một số quan sát khác, mà có thể hoặc không có thể liên quan:
- nếu chúng ta "mạo danh" người sử dụng hiện tại, nó sẽ trả về ngay lập tức
- nếu chúng ta chạy các ứng dụng thực tế và bắt đầu dụ khác như một người dùng khác, mọi thứ hoạt động như dự định
Có thể có điều gì đó đang xảy ra với tài nguyên hệ thống cơ bản, nhưng chúng tôi không thể tìm ra. Làm thế nào để thực hiện công việc này?
CẬP NHẬT: Theo nhận xét của Hans, tôi đã thử vô hiệu hóa Windows Defender, nó không giúp ích gì. Dưới đây là một stacktrace của nơi mà nó treo:
[email protected]()
[email protected]()
mscorlib.ni.dll!719c1867()
[Frames below may be incorrect and/or missing, native debugger attempting to walk managed call stack]
mscorlib.ni.dll!719c1852()
[Managed to Native Transition]
mscorlib.dll!System.Threading.Mutex.CreateMutexHandle(bool initiallyOwned, string name, Microsoft.Win32.Win32Native.SECURITY_ATTRIBUTES securityAttribute, out Microsoft.Win32.SafeHandles.SafeWaitHandle mutexHandle)
mscorlib.dll!System.Threading.Mutex.MutexTryCodeHelper.MutexTryCode(object userData)
[Native to Managed Transition]
[Managed to Native Transition]
mscorlib.dll!System.Threading.Mutex.CreateMutexWithGuaranteedCleanup(bool initiallyOwned, string name, out bool createdNew, Microsoft.Win32.Win32Native.SECURITY_ATTRIBUTES secAttrs)
mscorlib.dll!System.Threading.Mutex.Mutex(bool initiallyOwned, string name, out bool createdNew, System.Security.AccessControl.MutexSecurity mutexSecurity)
mscorlib.dll!System.Threading.Mutex.Mutex(bool initiallyOwned, string name, out bool createdNew)
MutexImpersonationTest.exe!MutexImpersonationTest.Program.Main(string[] args) Line 16
Rất lạ. FWIW, nếu bạn không nhận được câu trả lời hay, giải pháp cuối cùng sẽ là quên các lớp .net và sử dụng P/Invoke để gọi trực tiếp Win32 API. –