OpenEvent / OpenFileMapping因ERROR_ACCESS_DENIED而失败

时间:2014-09-24 14:13:28

标签: c# c++ winapi synchronization memory-mapped-files

我正在开发一个开源.NET程序集(WinSCP .NET assembly),它产生一个本机(C ++)应用程序并通过事件和文件映射对象与它通信。

程序集使用Process类生成应用程序,没有特殊设置。程序集创建很少的事件(使用EventWaitHandle)和文件映射(使用PInvoked CreateFileMapping)和应用程序"打开"这些使用OpenEventOpenFileMapping

在大多数情况下都可以正常工作。但是现在我有一个用户在Windows Server 2008 R2 64位上使用ASPX应用程序中的程序集。

在他的情况下,OpenEventOpenFileMapping返回NULLGetLastError返回ERROR_ACCESS_DENIED

我尝试通过显式授予当前用户对事件对象和应用程序代码的必要权限来改进汇编代码,以便仅按{{3}要求真正需要的访问权限(而不是原始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)中的错误?

1 个答案:

答案 0 :(得分:1)

我的猜测是,该事件是由匿名用户或登录用户创建的,具体取决于网站的设置方式。但是正在与基础流程用户一起启动子流程。这可以通过使用进程监视器并查看事件句柄的acl来查看创建者是谁。然后查看子流程以查看它的运行方式。
如果是这种情况,那么您可以更新事件上的acl以包含基本进程。除此之外,您可能仍需要使用" global"前缀。确保可以跨用户边界使用该事件。