我正在開發一個開源.NET組件(WinSCP .NET assembly),它生成一個本地(C++)應用程序並通過事件和文件映射對象與它進行通信。OpenEvent/OpenFileMapping失敗,並顯示ERROR_ACCESS_DENIED
程序集使用Process
類生成應用程序,無需特殊設置。程序集創建少量事件(使用EventWaitHandle
)和文件映射(使用PInvoked CreateFileMapping
),應用程序使用OpenEvent
和「打開」這些事件。
它在大多數情況下工作正常。但是現在我有一個使用Windows Server 2008 R2 64位ASPX應用程序的程序集的用戶。
在他的情況下,無論是OpenEvent
和OpenFileMapping
回報NULL
和GetLastError
返回ERROR_ACCESS_DENIED
。
我試圖通過顯式授予當前用戶對事件對象和應用程序代碼的必要權限以僅需要根據example on MSDN確實需要的訪問權限(而不是原始EVENT_ALL_ACCESS
)來改進彙編代碼。它沒有幫助。所以我甚至懶得爲文件映射對象嘗試相同的操作。
創建事件的C#代碼是:
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++代碼, 「打開」 的事件是:
OpenEvent(EVENT_MODIFY_STATE, false, name);
(對於其他事件的訪問級別是SYNCHRONIZE
,取決於需要)。
有沒有人知道是什麼原因導致OpenEvent
(或CreateFileMapping
)中的「拒絕訪問」錯誤?
對象名稱是否與'Global \\'一起使用? – 2014-09-24 22:25:37
@HarryJohnston號但是巧合的是,我最近用'Global'命名空間前綴向用戶發送了一個新的構建,我正在等待結果。雖然我不期望太多。如果它是一個對象命名空間問題,我會得到'ERROR_FILE_NOT_FOUND'(或類似的),而不是'ERROR_ACCESS_DENIED',對嗎? – 2014-09-25 06:41:27
令人懷疑的是,ASP.NET應用程序默認使用有限的用戶帳戶運行。一些[背景](http://www.iis.net/learn/manage/configuring-security/application-pool-identities)。 – 2014-09-25 08:17:24