2014-09-24 142 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

相关问题