我正在开发一个开源.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