На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> CreateEvent и NtCreateEvent , А где SECURITY_ATTRIBUTES задается в NtCreateEvent?
    Собствено сабж.
    Бывает так, что евент создается в системном процессе,а открывается в юзер. Естествено ACCESS DENIED. Я назначал права в системном процессе с помощью SECURITY_ATTRIBUTES и все было ОК. Однако,как выяснилось мне НЕ ЖЕЛАТЕЛЬНО использовать ConvertStringSecurityDescriptorToSecurityDescriptor , так что решил перейти на NATIVE API. Однако так и не увидел соотвестующих аттрибутов в параметрах функции.
      Есенин

      Не совсем понятен вопрос. Уточните пожалуйста:
      1. Что есть "системный процесс"? Я так понимаю, что служба, работающая от системной учетной записи?
      2. Что есть юзер? Процесс работающий от пользовательской учетной записи?
      3. Исходник системного процесса доступен?
      4. Причем тут NativeAPI и ConvertStringSecurityDescriptorToSecurityDescriptor?

      Если я правильно понял, то вы создаете событие в системном сервисе, и хотите использовать его в пользовательском приложении? Для этого нужно (Native API не нужен):
      1. Поместить событие в глобальное пространство имен - добавить к имени события префикс 'Global\'
      2. Установить DACL равный nil, чтобы все пользователи имели к нему доступ, так как по-умолчанию доступ имеет только владелец (создатель)

      Если же я не прав, то уточните, потому что задавать атрибуты безопасности объекту при создании с помощью NATIVE API можно разумеется, а как иначе то?
        Rose
        Сорри за непонятность и неуместный жаргон. :) Торопился. Итак-требуется создавать евенты ИНОГДА и в системных процессАХ.Это связано с внедрением :)
        Если сделать CreateEvent (NULL...) в процессе,работающем по SYSTEM аккуаунтом, то OpenEvent обломится в процессе,работающем под учетной записью. ACCESS DENIED. Для того,что б этого не происходило, я поступаю следующим образом.Я ,через ConvertStringSecurityDescriptorToSecurityDescriptor устанавливаю разрешение для данного обьекта на открытие из процесса,запущеного под учетной записью :)
        Все хорошо. Только вот нельзя мне использовать ничего, кроме kernel32.dll,ntdll.dll
        Вот и хотел переметнуться на NATIVE API :)
        Думаю теперь ясно :)
        Цитата Rose @
        1. Поместить событие в глобальное пространство имен - добавить к имени события префикс 'Global\'

        Да это я знаю и делаю :)
        Цитата Rose @
        2. Установить DACL равный nil, чтобы все пользователи имели к нему доступ, так как по-умолчанию доступ имеет только владелец (создатель)

        Вот тут хотелось бы поподробней.Надеюсь функциями kernel32.dll,ntdll.dll ?
          Цитата
          Вот тут хотелось бы поподробней.Надеюсь функциями kernel32.dll,ntdll.dll ?

          Конечно, только пример на Delphi, (уж извините я C++ даже синтаксис не знаю) но думаю разберетесь...

          ExpandedWrap disabled
            var
              sa: SECURITY_ATTRIBUTES;
              sd: SECURITY_DESCRIPTOR;
              hEvent: THandle;
            begin
              // Создаем дескриптор безопасности
              InitializeSecurityDescriptor(@sd,SECURITY_DESCRIPTOR_REVISION);
              // DACL не установлен - объект незащищен
              SetSecurityDescriptorDacl(@sd,true,nil,false);
              // Настраиваем атрибуты безопасности, передавая туда указатель на
              // дескриптор безопасности sd и создаем объект-событие
              sa.nLength:=SizeOf(SECURITY_ATTRIBUTES);
              sa.lpSecurityDescriptor:=@sd;
              sa.bInheritHandle:=false;
              hEvent:=CreateEvent(@sa,true,false,'Global\evMyObject');
            ...
            Rose
            Цитата Rose @
            InitializeSecurityDescriptor

            Advapi32.dll
            Цитата Rose @
            SetSecurityDescriptorDacl

            Advapi32.dll
            :(
              Хотя только что глянул, это функции advapi.dll, но библиотека стандартная, это проблема или нет? Если проблема, то можно переделать немного...

              ExpandedWrap disabled
                var
                  sa: SECURITY_ATTRIBUTES;
                  sd: SECURITY_DESCRIPTOR;
                  hEvent: THandle;
                begin
                  // Создаем дескриптор безопасности
                  RtlCreateSecurityDescriptor(@sd,SECURITY_DESCRIPTOR_REVISION); // ntdll.dll
                  // DACL не установлен - объект незащищен
                  RtlSetDaclSecurityDescriptor(@sd,true,nil,false); //ntdll.dll
                  // Настраиваем атрибуты безопасности, передавая туда указатель на
                  // дескриптор безопасности sd и создаем объект-событие
                  sa.nLength:=SizeOf(SECURITY_ATTRIBUTES);
                  sa.lpSecurityDescriptor:=@sd;
                  sa.bInheritHandle:=false;
                  hEvent:=CreateEvent(@sa,true,false,'Global\evMyObject');
                Цитата Rose @
                Если проблема

                Незнаю, если в моем тесте прокатит, то не факт, что прокатит в других прогах..Я уже столько раз обламывался, что сил эксперементировать нет. Если можно-подскажите другой выход :)
                  Цитата
                  Если можно-подскажите другой выход


                  См выше :)
                    Цитата Rose @
                    библиотека стандартная

                    Да проблема в том, что инжект глобальный..И есть проги, которые ничего,кроме kernel32.dll не юзают.Или на этапе внедрения еще не загрузили advapi.dll/Вот тогда начинается цирк...

                    Добавлено
                    RtlCreateSecurityDescriptor
                    Хм.. В моей (считаю полной) документации по ntdll такой функции нет :)
                    Мнб прототип бы глянуть для получения адреса :)
                      RtlCreateSecurityDescriptor - прототип такой же, как у InitializeSecurityDescriptor, только возвращает NTSTATUS. InitializeSecurityDescriptor собственно только ее и вызывает и преобразует результат в BOOL. У RtlSetDaclSecurityDescriptor соответственно прототип такой же, как и у SetSecurityDescriptorDacl, только тоже возвращает NTSTATUS.
                        Rose
                        Ну спасибо, тогда разберусь
                        Последнее уточнение-в вашем коде есть такие строчки комментария
                        Цитата
                        // Настраиваем атрибуты безопасности, передавая туда указатель на
                        // дескриптор безопасности sd и создаем объект-событие

                        Это просто комментарий к ИСПОЛНЯЕМОМУ (приведеному коду) или мне в этом месте нужно что-то городить? :)
                          Цитата
                          Это просто комментарий к ИСПОЛНЯЕМОМУ (приведеному коду) или мне в этом месте нужно что-то городить?


                          К приведенному. sa - это и есть структура атрибутов безопасности, которую мы будем использовать при создании события. В коде под комментарием мы настраиваем поля этой структуры, а потом - вызываем CreateEvent.
                            Я "вопрос решен" пока оставлю открытым.Буду пробывать :) Спасибо я уже сказал :)
                              <_<
                              Не работает.. Код ошибки 998 Неверная попытка доступа к адресу памяти.

                              ExpandedWrap disabled
                                         SECURITY_DESCRIPTOR sd;
                                       ZeroMemory (&sd,sizeof(SECURITY_DESCRIPTOR));
                                       pRtlCreateSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION);
                                       pRtlSetDaclSecurityDescriptor(&sd,TRUE,NULL,FALSE);
                                       ZeroMemory (&sc,sizeof(SECURITY_ATTRIBUTES));
                                       sc.nLength=sizeof(SECURITY_ATTRIBUTES);
                                       sc.lpSecurityDescriptor=&sd;
                                       sc.bInheritHandle=FALSE;


                              Это делаю в DllMain
                              SECURITY_ATTRIBUTES-глобальное;

                              Затем в одной из функций
                              ExpandedWrap disabled
                                w_Event=CreateEvent(&sc,TRUE,FALSE,full_name);
                                //w_Event =NULL;
                                //DWORD err=998;

                              Надо разбираться.. :)
                                Цитата
                                SECURITY_ATTRIBUTES-глобальное;


                                А sd? Если sd не глобальный, то при выходе sd за область видимости sc.lpSecurityDescriptor - это невалидный указатель.
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0375 ]   [ 15 queries used ]   [ Generated: 14.07.25, 10:47 GMT ]