gpt4 book ai didi

c# - OpenEvent/OpenFileMapping 失败并显示 ERROR_ACCESS_DENIED

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:39 26 4
gpt4 key购买 nike

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

程序集使用 Process 类生成应用程序,没有特殊设置。程序集创建一些事件(使用 EventWaitHandle)和文件映射(使用 PInvoked CreateFileMapping),应用程序使用 OpenEvent“打开”这些和 OpenFileMapping

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

在他的例子中,OpenEventOpenFileMapping 都返回 NULLGetLastError 返回 ERROR_ACCESS_DENIED

我已尝试通过显式授予当前用户对事件对象和应用程序代码的必要权限来改进汇编代码,使其仅需要真正需要的访问权限(而不是原始的 EVENT_ALL_ACCESS) Microsoft Docs example .它没有帮助。所以我什至懒得为文件映射对象尝试相同的方法。

创建事件的 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,具体取决于需要)。

我还尝试将 Global\ 前缀添加到对象名称。正如预期的那样,这并没有解决问题。

有谁知道是什么导致了 OpenEvent(或 CreateFileMapping)中的“拒绝访问”错误?

最佳答案

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

关于c# - OpenEvent/OpenFileMapping 失败并显示 ERROR_ACCESS_DENIED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26019150/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com