Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705

Как вызвать функцию RegGetKeySecurity чтобы получить данные о security descriptor раздела реестра?

15.04.2017, 11:27. Показов 1988. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Друзья! Это всё связано с правами на раздел реестра и его владельцами и всем таким прочим.

Есть раздел "HKEY_CLASSES_ROOT\)))))"

Я работаю под учётной записью admin, являюсь естестенно владельцем этого раздела и имею на него все права, что видно на рисунке ниже

И я хочу программно получить security descriptor. А RegGetKeySecurity вызвать не могу.

Код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <windows.h>
#include <stdio.h>
 
///////////////////////////////////////////////////
///////////////////////////////////////////////////
///////////////////////////////////////////////////
 
int main(void)
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
   
    HKEY hKey;
    
    //Эта функция вызывается без ошибок
    if(RegOpenKeyEx(HKEY_CLASSES_ROOT, ")))))",0, KEY_READ || KEY_EXECUTE, &hKey)!= ERROR_SUCCESS)
        printf ("всё плохо RegOpenKeyEx\n");
 
 
    //Это структура, указатель на неё передаётся в RegGetKeySecurity
    SECURITY_DESCRIPTOR SecurityDescriptor; 
    DWORD x = sizeof (SecurityDescriptor);
 
    
    //второй параметр- сведения, которые я хочу получить. Они, кстати говоря, МИНИМАЛЬНЫ.
    if(RegGetKeySecurity(hKey,  OWNER_SECURITY_INFORMATION ||GROUP_SECURITY_INFORMATION, &SecurityDescriptor,&x) != ERROR_SUCCESS)
        printf ("всё плохо RegGetKeySecurity\n");
 
    RegCloseKey(hKey);
}

Компилить:
Windows Batch file
1
>g++ main.cpp -o main.exe
Вывод:

Windows Batch file
1
2
3
>main.exe
всё плохо RegGetKeySecurity
>
Это что же я за админ такой, что не могу получить дескриптор безопасности даже? ЧЯДНТ? Спасибо, кто откликнется.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.04.2017, 11:27
Ответы с готовыми решениями:

Как правильно установить security descriptor?
Прошлая тема: https://www.cyberforum.ru/win-api/thread1436545.html Цель: создать desktop таким образом, чтобы нельзя было...

Как получить имя максимальной длины параметров раздела реестра?
Друзья! Ну то есть в каком-нибудь ключе есть куча строковых параметров. &quot;a&quot;, &quot;ab&quot;, &quot;cafebabe&quot; и прочее. То есть нужно получить...

Получить список всех значений раздела реестра
1.Получить список всех значений раздела реестра: Раздел HKCU\Software\Microsoft\Windows\CurrentVersion\run 2.Создать запись в системном...

5
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
15.04.2017, 12:01
Во-первых, для комбинирования флагов надо использовать побитовое "или"
(|), а не логическое "или" (||), т.е. не так:
C
1
2
KEY_READ || KEY_EXECUTE
OWNER_SECURITY_INFORMATION || GROUP_SECURITY_INFORMATION
а вот так:
C
1
2
KEY_READ | KEY_EXECUTE
OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION
Во-вторых, у функций RegOpenKeyEx и RegGetKeySecurity есть возвращаемые значения,
т.е. коды ошибок. По коду ошибки можно понять, почему функция дала сбой.

Ну и в-третьих, дескриптор безопасности может не поместиться в структуру SECURITY_DESCRIPTOR,
т.е. под выходной буфер нужно выделить больше места.
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
15.04.2017, 13:07  [ТС]
Убежденный, ваша правда, была ошибка ERROR_INSUFFICIENT_BUFFER, что указывает на маленький буфер. Тот редкий, да что там редкий- редчайший случай, когда можно какую-то полезную информацию из кода ошибки почерпнуть.

Но дело-то не в этом.

С одной стороны, требуется указатель на структуру SecurityDescriptor ОПРЕДЕЛЁННОГО размера. Не поленился, пробежал по полям этой структуры, нашёл размер каждого поля. 20 байт.

C++
1
2
3
4
5
6
7
8
9
typedef struct _SECURITY_DESCRIPTOR {
    BYTE Revision;
    BYTE Sbz1;
    SECURITY_DESCRIPTOR_CONTROL Control;
    PSID Owner;
    PSID Group;
    PACL Sacl;
    PACL Dacl;
} SECURITY_DESCRIPTOR, *PSECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR;
После правильной обработки ошибки оказалось, что нужно не 20 байт, а 48 (значение вернулось в параметре lpcbSecurityDescriptor)

Но 48 байт это уже НЕ структура SecurityDescriptor. Это не понять что, массив байт.
А в прототипе функции прописана структура. А сруктура это определённый поля, каждое с именем и размером. Я теперь вздумаю обрабатывать это структуру, как мне надо, обращаться к её полям, а уже всё сбилось к чёртовой матери. И общий размер не тот и, следовательно, непонятна внутренняя структура структуры, где какое поле, извините за тафтологию.

Зачем они вообще придумали структуру SecurityDescriptorс её полями и ещё обнадёжили людей- что вот мол, передадите нам на неё указатель и всё будет круто! Писали бы сразу такой прототип (см. четвёртый параметр):

C++
1
2
3
4
5
6
LONG WINAPI RegGetKeySecurity(
  _In_      HKEY                 hKey,
  _In_      SECURITY_INFORMATION SecurityInformation,
  _Out_opt_ PSECURITY_DESCRIPTOR pSecurityDescriptor,
  char* p
);
И какая разница, на массив какого размера будет указывать четвёртый параметр, если всё равно количество нужных байт всякий раз пересчитывается по новой? Разве что угадаю- ну так это же не наш метод...
0
58 / 14 / 5
Регистрация: 07.04.2017
Сообщений: 58
15.04.2017, 13:32
Цитата Сообщение от kravam Посмотреть сообщение
Не поленился, пробежал по полям этой структуры, нашёл размер каждого поля
молодец, зачем же sizeof
Цитата Сообщение от kravam Посмотреть сообщение
Но 48 байт это уже НЕ структура SecurityDescriptor.
Legacy, наверное. Тем не менее есть последний параметр, указывающий и принимающий кол-во байт, и в Remarks четко написано
If the buffer specified by the pSecurityDescriptor parameter is too small, the function returns ERROR_INSUFFICIENT_BUFFER and the lpcbSecurityDescriptor parameter contains the number of bytes required for the requested security descriptor.
ну неясный тип параметра, не убиваться же теперь
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
15.04.2017, 14:09  [ТС]
Цитата Сообщение от Saqr Посмотреть сообщение
молодец, зачем же sizeof
если бы ты внимательно читал тему, ты бы увидел что я именно что sizeof использую в первом сообщении. А вручную я подсчитал размер структуры для подстраховки, ибо ситуация непонятна. и к написанию сообщений я подхожу ответственно.

Цитата Сообщение от Saqr Посмотреть сообщение
ну неясный тип параметра, не убиваться же теперь
если и тебе всё равно, зачем об этом писать?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
16.04.2017, 09:09
Цитата Сообщение от kravam Посмотреть сообщение
А в прототипе функции прописана структура. А сруктура это определённый поля, каждое с именем и размером. Я теперь вздумаю обрабатывать это структуру, как мне надо, обращаться к её полям, а уже всё сбилось к чёртовой матери. И общий размер не тот и, следовательно, непонятна внутренняя структура структуры, где какое поле, извините за тафтологию.
Ничего не сбилось. У тебя по-прежнему есть структура SECURITY_DESCRIPTOR и следующие
за ней байты в памяти, хранящие дополнительную информацию. В WinAPI много таких структур.

Я обычно выделяю байтовый буфер, а затем, после успеха функции, делаю его каст к нужному типу структуры и
работаю с ним как обычно:
C
1
2
3
4
5
6
LONG const Status = RegGetKeySecurity(hKey, DACL_SECURITY_INFORMATION, &Buffer[0], &BuffSize);
if (ERROR_SUCCESS == Status)
{
    SECURITY_DESCRIPTOR const * pSecDesc = reinterpret_cast<SECURITY_DESCRIPTOR const *>(&Buffer[0]);
    // Работаем с pSecDesc "нормальным" образом.
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.04.2017, 09:09
Помогаю со студенческими работами здесь

Как проверить наличие раздела реестра?
Как? :)

Получить данные из реестра
Всем привет! Скажите пожалуйста, что я делаю не так RegistryKey key = Registry.LocalMachine; key =...

Получить данные из реестра
Имеются данные в реестре в разделе секции автозагрузки. Необходимо получить значение ключей и данных оттуда, не зная самих имен ключей. ...

Как осуществить переименование/копирование раздела реестра
Хотел просто переименовать раздел реестра, но понял что это не возможно. Поэтому решил создать новый раздел и скопировать данные из старого...

Получить Бинарные данные с реестра wmi
const long HKLM = 0x80000002;//HKEY_LOCAL_MACHINE String strKey = @&quot;Software\Microsoft\Windows\CurrentVersion\Uninstall&quot;; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 11.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru