创建跨进程EventWaitHandle

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

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); } 

我用两个示例控制台应用程序尝试了相同的代码,它工作正常。

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

 // 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 \”)。 如果使用“快速用户切换”function,则还必须在Windows XP上执行此操作。

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

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