【问题标题】:Cannot find named event when created in Windows Service在 Windows 服务中创建时找不到命名事件
【发布时间】:2015-11-06 22:19:44
【问题描述】:

我正在用 C# 开发一个 Windows 服务来集中管理一些应用程序连接。它通常是一种休眠服务,当被外部可执行文件唤醒时会执行一些操作。为此,我使用了命名事件,特别是 .NET EventWaitHandle。我的代码归结为,在服务端:

        EventWaitHandleSecurity sec = new EventWaitHandleSecurity();
        sec.AddAccessRule(new EventWaitHandleAccessRule(
                  new SecurityIdentifier(WellKnownSidType.WorldSid, null),
                  EventWaitHandleRights.FullControl,
                  AccessControlType.Allow));
        evh = new EventWaitHandle(false, EventResetMode.AutoReset, EVENT_NAME, 
                                  out created, sec);

        Log(created ? "Event created" : "Event already existed?");

由于它是受信任服务器上的内部应用程序,我不介意将“完全控制”授予“世界”一般来说并不明智。

在客户端我有:

EventWaitHandle.TryOpenExisting(EVENT_NAME, EventWaitHandleRights.Modify, out evh)

当我在基于控制台的交互模式下运行我的服务时,上面的代码可以完美运行。两端发现事件,客户端可以设置,服务开始工作。大家都很开心。

安装服务时它不起作用。日志记录仍然报告该事件是重新创建的,但客户端找不到该事件。因为我认为它与安全相关,所以我添加了 World Full Control Allow 访问规则,但它并没有改变任何东西。我将服务更改为以本地管理员身份运行,即使是作为我自己的用户帐户,但什么也没有 - 即使日志显示服务正在愉快地轮询它,客户端也找不到该事件。如果我将 TryOpenExisting 更改为 OpenExisting 我会得到一个明确的异常:

System.Threading.WaitHandleCannotBeOpenedException: No handle of the given name exists.

我错过了什么?

【问题讨论】:

    标签: c# .net winapi synchronization inter-process-communicat


    【解决方案1】:

    从 Windows Vista 开始,服务被隔离并在会话 0 中运行(请参阅Service Changes for Windows Vista)。当调用CreateEventEventWaitHandle)时,默认在本地命名空间中创建事件对象,也称为会话命名空间。由会话 0 中的服务创建且名称在会话命名空间中的事件对象仅在会话 0 中可见。它对于在交互式用户会话中运行的应用程序是不可见的。

    要通过应用程序代码(在交互式用户会话中运行)发现的服务(在会话 0 中运行)创建事件对象,您必须将其创建到全局命名空间中。这是通过在事件名称前加上 "Global\" 来完成的,如CreateEvent 中所述。


    Sysinternal's WinObj 是跟踪内核对象相关错误的有用工具。

    【讨论】:

    • 你是对的,我什至在阅读你的答案之前就发现了这一点,我(我感到羞耻)actually answered a nearly identical question elsewhere myself nearly 2 years ago。然而,我并不完全意识到这是 6.x 内核中服务模型的根本变化。它在全球名称空间中运行良好。谢谢!
    • @NielsKeurentjes:如果不出意外,由于重复问题的答案存在缺陷,我按照您的请愿重新打开该问题。它确实是不完整的,充其量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    相关资源
    最近更新 更多