2014-09-24 75 views
6

我正在開發一個開源.NET組件(WinSCP .NET assembly),它生成一個本地(C++)應用程序並通過事件和文件映射對象與它進行通信。OpenEvent/OpenFileMapping失敗,並顯示ERROR_ACCESS_DENIED

程序集使用Process類生成應用程序,無需特殊設置。程序集創建少量事件(使用EventWaitHandle)和文件映射(使用PInvoked CreateFileMapping),應用程序使用OpenEvent和「打開」這些事件。

它在大多數情況下工作正常。但是現在我有一個使用Windows Server 2008 R2 64位ASPX應用程序的程序集的用戶。

在他的情況下,無論是OpenEventOpenFileMapping回報NULLGetLastError返回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)中的「拒絕訪問」錯誤?

+0

對象名稱是否與'Global \\'一起使用? – 2014-09-24 22:25:37

+0

@HarryJohnston號但是巧合的是,我最近用'Global'命名空間前綴向用戶發送了一個新的構建,我正在等待結果。雖然我不期望太多。如果它是一個對象命名空間問題,我會得到'ERROR_FILE_NOT_FOUND'(或類似的),而不是'ERROR_ACCESS_DENIED',對嗎? – 2014-09-25 06:41:27

+0

令人懷疑的是,ASP.NET應用程序默認使用有限的用戶帳戶運行。一些[背景](http://www.iis.net/learn/manage/configuring-security/application-pool-identities)。 – 2014-09-25 08:17:24

回答

1

我的猜測是,該事件是由匿名用戶或登錄用戶創建的,具體取決於網站的設置方式。但子進程正在與基本進程用戶一起啓動。這可以通過使用進程監視器並查看事件句柄的acl來查看創建者是誰。然後看看子流程,看看它運行的是誰。
如果是這種情況,那麼您可以更新事件的acl以包含基礎過程。除此之外,您可能仍需要以「全局」作爲前綴,以確保該事件可跨用戶邊界使用。

+0

謝謝。會試試看。 – 2014-10-03 11:04:19

相關問題