Подтвердить что ты не робот

Создание перекрестного события EventWaitHandle

У меня есть приложение для Windows, одно из которых - это сервис Windows, который создает EventWaitHandle и ждет его. Второе приложение - это windows gui, который открывает его, вызывая EventWaitHandle.OpenExisting() и пытается установить событие. Но я получаю исключение в OpenExisting. Исключение: "Доступ к пути запрещен".

Окно Код службы

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

Код графического интерфейса Windows

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

Я попробовал тот же код с двумя примерами консольного приложения, он работал нормально.

4b9b3361

Ответ 1

Вам нужно использовать версию конструктор EventWaitHandle, который принимает EventWaitHandleSecurity. Например, следующий код должен работать (он не тестировался, но, надеюсь, вас запустит):

// 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 или более поздней версии, вам нужно создать событие в глобальном пространстве имен (то есть префикс имени с именем "Глобальный" ). Вы также должны сделать это в Windows XP, если используете функцию "Быстрое переключение пользователей".

Ответ 2

Это может быть вызвано тем, что процесс обслуживания работает на повышенном уровне привилегий, но процесс графического интерфейса отсутствует. Если вы поместите тот же код в два консольных приложения, они оба будут работать на уровне пользователя и не будут иметь проблем с доступом друг к другу с общими объектами.

Попробуйте запустить приложение GUI с флагом "Запуск от имени администратора" в меню "Пуск" Windows. Если это решает проблему, вам необходимо прочитать, как запросить повышение в вашем коде. (Я этого не делал)