【问题标题】:Creating a Cross-Process EventWaitHandle创建跨进程 EventWaitHandle
【发布时间】:2010-04-07 14:39:01
【问题描述】:

我有两个 Windows 应用程序,一个是创建 EventWaitHandle 并等待它的 Windows 服务。第二个应用程序是一个 Windows gui,它通过调用 EventWaitHandle.OpenExisting() 打开它并尝试设置事件。但是我在 OpenExisting 中遇到了一个例外。例外是“访问路径被拒绝”。

windows 服务代码

EventWaitHandle wh = new EventWaitHandle(false, EventResetMode.AutoReset, "MyEventName");
wh.WaitOne();

Windows GUI 代码

try
{
    EventWaitHandle wh = EventWaitHandle.OpenExisting("MyEventName");
    wh.Set();
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

我用两个示例控制台应用程序尝试了相同的代码,它运行良好。

【问题讨论】:

    标签: c# events synchronization process


    【解决方案1】:

    您需要使用带有EventWaitHandleSecurity 实例的EventWaitHandle constructor 版本。例如,下面的代码应该可以工作(它没有经过测试,但希望能让你开始):

    // create a rule that allows anybody in the "Users" group to synchronise with us
    var users = new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null);
    var rule = new EventWaitHandleAccessRule(users, EventWaitHandleRights.Synchronize | EventWaitHandleRights.Modify,
                              AccessControlType.Allow);
    var security = new EventWaitHandleSecurity();
    security.AddAccessRule(rule);
    
    bool created;
    var wh = new EventWaitHandle(false, EventResetMode.AutoReset, "MyEventName", out created, security);
    ...
    

    此外,如果您在 Vista 或更高版本上运行,则需要在全局命名空间中创建事件(即,在名称前加上“Global\”)。如果您使用“快速用户切换”功能,您还必须在 Windows XP 上执行此操作。

    【讨论】:

    • ahhh ...全局前缀。我总是忘记它。
    • 从服务创建时访问权限必须EventWaitHandleRights.FullControl
    【解决方案2】:

    这可能是由以提升的特权级别运行的服务进程引起的,但 GUI 进程不是。如果您将相同的代码放入两个控制台应用程序中,它们都将在用户级别运行,并且访问彼此的命名共享对象不会有任何问题。

    尝试使用 Windows 开始菜单中的“以管理员身份运行”标志运行 GUI 应用程序。如果这样可以解决问题,您需要阅读如何在代码中请求提升。 (我没有这样做)

    【讨论】:

    • 我仅以管理员身份登录,我使用的是 windows XP
    • 好主意,但我认为以管理员身份运行不会有帮助,因为其他进程正在隔离会话中运行。例如,我不相信互斥锁可以在“会话 0”中的服务和登录的交互式会话之间共享。但是,我不是这方面的专家。
    • 刚刚找到以下描述会话 0 对 Vista 的影响的文档。正如 Codeka 所提到的,如果您明确使用 Global\ 范围,您可以通过这种方式共享事件。这是网址:microsoft.com/whdc/system/sysinternals/Session0Changes.mspx
    • Navaneeth:好的,XP 取消了进程提升的资格。这只存在于Vista和Win7中。 (在 Vista 和 Win7 中,您可以作为管理员用户登录,但您的 GUI 应用程序仍然无法以完全管理员权限运行,除非您通过提升确认安全问题)
    猜你喜欢
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多