2014-09-24 21 views
6

Tôi đang phát triển một phiên bản .NET nguồn mở (WinSCP .NET assembly) để sinh ra ứng dụng gốc (C++) và giao tiếp với nó thông qua các sự kiện và đối tượng ánh xạ tệp.OpenEvent/OpenFileMapping không thành công với ERROR_ACCESS_DENIED

Việc lắp ráp sẽ sinh ra ứng dụng bằng cách sử dụng lớp Process, không có cài đặt đặc biệt. Việc lắp ráp tạo ra vài sự kiện (sử dụng EventWaitHandle) và ánh xạ tệp (bằng cách sử dụng PInvoked CreateFileMapping) và ứng dụng "mở" các sự kiện này bằng cách sử dụng OpenEventOpenFileMapping.

Nó hoạt động tốt trong hầu hết các trường hợp. Nhưng bây giờ tôi đang có một người dùng sử dụng lắp ráp từ một ứng dụng ASPX trên Windows Server 2008 R2 64 bit.

Trong trường hợp của anh ấy cả số OpenEvent và trả lại OpenFileMapping trả lại NULLGetLastError trả lại ERROR_ACCESS_DENIED.

Tôi đã cố gắng cải thiện mã lắp ráp bằng cách cấp phép người dùng hiện tại quyền cần thiết cho đối tượng sự kiện và mã ứng dụng để chỉ yêu cầu quyền truy cập thực sự cần thiết (thay vì EVENT_ALL_ACCESS ban đầu) theo example on MSDN. Nó không giúp được gì. Vì vậy, tôi thậm chí không bận tâm để thử cho cùng một đối tượng lập bản đồ tập tin.

C# mã mà tạo ra sự kiện này là:

EventWaitHandleSecurity security = new EventWaitHandleSecurity(); 

string user = Environment.UserDomainName + "\\" + Environment.UserName; 

EventWaitHandleAccessRule rule; 
rule = 
    new EventWaitHandleAccessRule(
     user, EventWaitHandleRights.Synchronize | EventWaitHandleRights.Modify, 
     AccessControlType.Allow); 
security.AddAccessRule(rule); 
rule = 
    new EventWaitHandleAccessRule(
     user, EventWaitHandleRights.ChangePermissions, AccessControlType.Deny); 
security.AddAccessRule(rule); 

new EventWaitHandle(
    false, EventResetMode.AutoReset, name, out createdNew, security); 

CáC++ mã C rằng "mở" các sự kiện là:

OpenEvent(EVENT_MODIFY_STATE, false, name); 

(Đối với các sự kiện khác các cấp độ truy cập là SYNCHRONIZE, tùy thuộc vào nhu cầu).

Có ai có bất kỳ ý tưởng nào gây ra lỗi "truy cập bị từ chối" trong OpenEvent (hoặc CreateFileMapping) không?

+0

Tên đối tượng có đang là 'Global \\ 'không? –

+0

@HarryJohnston No. Nhưng tình cờ tôi đã gửi một bản dựng mới cho người dùng với tiền tố không gian tên 'Global' gần đây và tôi đang chờ kết quả. Mặc dù tôi không mong đợi nhiều từ đó. Nếu nó là một vấn đề không gian tên đối tượng, tôi sẽ nhận được 'ERROR_FILE_NOT_FOUND' (hoặc tương tự), không phải' ERROR_ACCESS_DENIED', đúng không? –

+0

Nghi ngờ bạn sửa lỗi đó, các ứng dụng ASP.NET chạy theo mặc định với một tài khoản người dùng bị giới hạn. Một số [nền tại đây] (http://www.iis.net/learn/manage/configuring-security/application-pool-identities). –

Trả lời

1

Tôi đoán là sự kiện được tạo bởi người dùng ẩn danh hoặc người dùng đã đăng nhập tùy thuộc vào cách thiết lập trang web. Nhưng quá trình con đang được khởi chạy với người dùng quá trình cơ bản. Điều này có thể được kiểm tra bằng cách sử dụng giám sát quy trình và xem xét ACL cho trình xử lý sự kiện để xem ai là người sáng tạo. Sau đó, xem quy trình phụ để xem ai đang chạy.
Nếu trường hợp này xảy ra, bạn có thể cập nhật ACL trên sự kiện để bao gồm quy trình cơ bản. Thêm vào đó, bạn vẫn có thể cần tiền tố với "toàn cầu" để đảm bảo rằng sự kiện có thể được sử dụng trên các ranh giới người dùng.

+0

Cảm ơn. Sẽ thử nó. –

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