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 OpenEvent
và OpenFileMapping
.
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 NULL
và GetLastError
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?
Tên đối tượng có đang là 'Global \\ 'không? –
@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? –
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). –