Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: SECURITY_DESCRIPTOR для Eventa  (Прочитано 7724 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Download
Гость
« : 22-12-2005 15:25 » 

Вводная: ОС - WinXP. Есть 2 учетные записи с правами админа S1 и S2 .
  User S1  запускает свою  прогу ,которая создает Еvent  "ReadyS2"  и ждет сброса этого Еventa:
 
  ...
  // создаем объект синхронизации "событие готовности  userа S2"
  hEvtReadyS2 = CreateEvent(&sa, FALSE, FALSE,"ReadyS2");

  // Ждем сигнала готовности  от S2
  WaitForSingleObject(hEvtReadyS2, INFINITE);
  ...
Затем User S1   прерывает сеанс (используя быстрое переключение пользователей ,т.е. S1.EXE продолжает выполняться,ожидая сброса Eventa "ReadyS2") .
   Далее логиниться  user S2 . S2  запускает свою  прогу S2.EXE ,которая должна открыть  Еvent "ReadyS2" и  установить его:
   ...
   // открываем объект синхронизации "событие готовности S2" 
   hEvtReadyS2 = OpenEvent(MAXIMUM_ALLOWED, FALSE,"ReadyS2");
   PulseEvent(hEvtReadyS2);
   ...
Проблема: S2.exe не может открыть Event  "ReadyS2". Возвращает ошибку INVALID_FUNCTION(errorcode 2) , хотя в крайнем
               случае      должна вернуть   ошибку о том,что доступ запрещен,- т.е.  S2.exe вообще не видит этого Eventa, хотя   
               объекты  ядра на локальной машине     однозначно идентифицируются именем.
Вопрос:   атрибуты защиты для Eventa "ReadyS2" в S1.exe формируются  след. образом:
              SECURITY_ATTRIBUTES sa;
              sa.nLength = sizeof(sa);
              sa.bInheritHandle = FALSE;
              sa.lpSecurityDescriptor = malloc(sizeof(SECURITY_DESCRIPTOR));
             InitializeSecurityDescriptor(sa.lpSecurityDescriptor, SECURITY_DESCRIPTOR_REVISION);
             SetSecurityDescriptorDacl(sa.lpSecurityDescriptor,
             TRUE, // Мы хотим установить параметры доступа
             NULL, // NULL означает, что доступно для всех
             FALSE // FALSE означает, что это не дефолтное значение));
             Может я неправильно формирую   SecurityDescriptor или дело в другом?Подскажите пожалуйста ,как правильно   
             сформировать  SecurityDescriptor с полным доступом для всех(Everyone)   для объекта ядра,чтобы заработало? Пробовал     
             много вариантов  инициализации SecurityDescriptora --- не работает! Жаль
« Последнее редактирование: 23-12-2005 09:22 от Download » Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #1 : 22-12-2005 15:33 » 

sa.bInheritHandle = FALSE;
Параметр означает возможность разделяемости ресурса между процессами.
Ставь TRUE
Записан

А птичку нашу прошу не обижать!!!
Download
Гость
« Ответ #2 : 23-12-2005 09:59 » 

Поставил  sa.bInheritHandle = TRUE;   - то же самое: S2.EXE не видит Eventа.

Даже если в S2.exe вместо OpenEvent(...) CreateEvent(...) с ТЕМ ЖЕ именем :
  ...   
  hEvtReadyS2 = CreateEvent(NULL, FALSE, FALSE,"ReadyS2");
  ... 
  - событие успешно СОЗДАЕТСЯ : 
    GetLastError() возвращает  0(успешно),хотя должна вернуть код ,свидетельствующий о том ,что
    объект уже   существует и просто вернуть HANDLE  этого Eventa.
Записан
Download
Гость
« Ответ #3 : 23-12-2005 10:02 » 

И еще вот: надо ли использовать  специальные функции для  работы с защитой объектов ядра ,
             типа  SetKernelObjectSecurity() ? (у меня сними ничего не получилось,возвращает ошибку - 1305 -INVALID_REVESION -х.з). Вопрос возник,т.к. везде(рунете) используют стандартные функции ,используемые обычно  с   файлами.
Зачем тогда в MSDNe сказано,что для объектов ядря надо юзать именно эти спецю функции--Просто так?
« Последнее редактирование: 23-12-2005 10:15 от Download » Записан
Download
Гость
« Ответ #4 : 23-12-2005 14:41 » 

Знающие челы  объяснили - короче,придется юзать NTCreateEvent и смотреть полные имена создаваемого события с помощью ObjectViewerа от Руссиновича.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines