
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.246] |
![]() |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Собствено сабж.
Бывает так, что евент создается в системном процессе,а открывается в юзер. Естествено ACCESS DENIED. Я назначал права в системном процессе с помощью SECURITY_ATTRIBUTES и все было ОК. Однако,как выяснилось мне НЕ ЖЕЛАТЕЛЬНО использовать ConvertStringSecurityDescriptorToSecurityDescriptor , так что решил перейти на NATIVE API. Однако так и не увидел соотвестующих аттрибутов в параметрах функции. |
Сообщ.
#2
,
|
|
|
Есенин
Не совсем понятен вопрос. Уточните пожалуйста: 1. Что есть "системный процесс"? Я так понимаю, что служба, работающая от системной учетной записи? 2. Что есть юзер? Процесс работающий от пользовательской учетной записи? 3. Исходник системного процесса доступен? 4. Причем тут NativeAPI и ConvertStringSecurityDescriptorToSecurityDescriptor? Если я правильно понял, то вы создаете событие в системном сервисе, и хотите использовать его в пользовательском приложении? Для этого нужно (Native API не нужен): 1. Поместить событие в глобальное пространство имен - добавить к имени события префикс 'Global\' 2. Установить DACL равный nil, чтобы все пользователи имели к нему доступ, так как по-умолчанию доступ имеет только владелец (создатель) Если же я не прав, то уточните, потому что задавать атрибуты безопасности объекту при создании с помощью NATIVE API можно разумеется, а как иначе то? |
Сообщ.
#3
,
|
|
|
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 ? |
Сообщ.
#4
,
|
|
|
Цитата Вот тут хотелось бы поподробней.Надеюсь функциями kernel32.dll,ntdll.dll ? Конечно, только пример на Delphi, (уж извините я C++ даже синтаксис не знаю) но думаю разберетесь... ![]() ![]() 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'); ... |
Сообщ.
#5
,
|
|
|
Rose
Цитата Rose @ InitializeSecurityDescriptor Advapi32.dll Цитата Rose @ SetSecurityDescriptorDacl Advapi32.dll ![]() |
Сообщ.
#6
,
|
|
|
Хотя только что глянул, это функции advapi.dll, но библиотека стандартная, это проблема или нет? Если проблема, то можно переделать немного...
![]() ![]() 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'); |
Сообщ.
#7
,
|
|
|
Цитата Rose @ Если проблема Незнаю, если в моем тесте прокатит, то не факт, что прокатит в других прогах..Я уже столько раз обламывался, что сил эксперементировать нет. Если можно-подскажите другой выход ![]() |
Сообщ.
#8
,
|
|
|
Цитата Если можно-подскажите другой выход См выше ![]() |
Сообщ.
#9
,
|
|
|
Цитата Rose @ библиотека стандартная Да проблема в том, что инжект глобальный..И есть проги, которые ничего,кроме kernel32.dll не юзают.Или на этапе внедрения еще не загрузили advapi.dll/Вот тогда начинается цирк... Добавлено RtlCreateSecurityDescriptor Хм.. В моей (считаю полной) документации по ntdll такой функции нет ![]() Мнб прототип бы глянуть для получения адреса ![]() |
Сообщ.
#10
,
|
|
|
RtlCreateSecurityDescriptor - прототип такой же, как у InitializeSecurityDescriptor, только возвращает NTSTATUS. InitializeSecurityDescriptor собственно только ее и вызывает и преобразует результат в BOOL. У RtlSetDaclSecurityDescriptor соответственно прототип такой же, как и у SetSecurityDescriptorDacl, только тоже возвращает NTSTATUS.
|
Сообщ.
#11
,
|
|
|
Rose
Ну спасибо, тогда разберусь Последнее уточнение-в вашем коде есть такие строчки комментария Цитата // Настраиваем атрибуты безопасности, передавая туда указатель на // дескриптор безопасности sd и создаем объект-событие Это просто комментарий к ИСПОЛНЯЕМОМУ (приведеному коду) или мне в этом месте нужно что-то городить? ![]() |
Сообщ.
#12
,
|
|
|
Цитата Это просто комментарий к ИСПОЛНЯЕМОМУ (приведеному коду) или мне в этом месте нужно что-то городить? К приведенному. sa - это и есть структура атрибутов безопасности, которую мы будем использовать при создании события. В коде под комментарием мы настраиваем поля этой структуры, а потом - вызываем CreateEvent. |
Сообщ.
#13
,
|
|
|
Я "вопрос решен" пока оставлю открытым.Буду пробывать
![]() ![]() |
Сообщ.
#14
,
|
|
|
![]() Не работает.. Код ошибки 998 Неверная попытка доступа к адресу памяти. ![]() ![]() 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-глобальное; Затем в одной из функций ![]() ![]() w_Event=CreateEvent(&sc,TRUE,FALSE,full_name); //w_Event =NULL; //DWORD err=998; Надо разбираться.. ![]() |
Сообщ.
#15
,
|
|
|
Цитата SECURITY_ATTRIBUTES-глобальное; А sd? Если sd не глобальный, то при выходе sd за область видимости sc.lpSecurityDescriptor - это невалидный указатель. |