
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.9] |
![]() |
|
![]() |
|
|
Исходные данные:
Доступ к ключу реестра — чтение (полного доступа нет) Задача: Работа с ключом (чтение, запись, удаление, перечисление) Достигнутый результат: ![]() ![]() ... HANDLE hToken; TOKEN_PRIVILEGES tkp; // Получаем маркер текущего процесса. if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) return false; // Получаем LUID для соответствующей привелегии. if (LookupPrivilegeValue(NULL, SE_TAKE_OWNERSHIP_NAME , &tkp.Privileges[0].Luid)) { tkp.PrivilegeCount = 1; // будет установлена одна привелегия tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; // Получаем привелегию завершения работы для этого процесса. AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0); RegOpenKeyEx(m_hKey, m_sSubKey.c_str(), 0, WRITE_OWNER, &m_hRegKey); } ... Проблема: Не знаю что делать дальше... Надо ![]() ![]() RegOpenKeyEx(m_hKey, m_sSubKey.c_str(), 0, KEY_SET_VALUE | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS, &m_hRegKey); , или что-то в этом роде.... вообщем для работы. Помогите пожалуйста! |
![]() |
Сообщ.
#2
,
|
|
Цитата NiTR0, 15.06.2006, 11:48:49, 1138519 Доступ к ключу реестра — чтение (полного доступа нет) а каким образом получаешь доступ?не понял... Цитата NiTR0, 15.06.2006, 11:48:49, 1138519 Не знаю что делать дальше... всмысле? читать? писать?удалить?создать? (в МСДНе Registry Functions, там вроде примеры были...) |
Сообщ.
#3
,
|
|
|
Цитата ElcnU @ а каким образом получаешь доступ?не понял... Я хочу его получить.Условие - права не админские(только чтение).В ручную можно получить: в реестре, в разделе "Разрешения", галочку на "Полный доступ" надо поставить. Цитата ElcnU @ всмысле? читать? писать?удалить?создать? Да.(+ перечислять) RegOpenKeyEx с параметром WRITE_OWNER открывает ключ, но не даёт этого сделать (должно быть KEY_SET_VALUE | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS) |
![]() |
Сообщ.
#4
,
|
|
Цитата NiTR0, 15.06.2006, 12:42:04, 1138637 Я хочу его получить.Условие - права не админские(только чтение).В ручную можно получить: в реестре, в разделе "Разрешения", галочку на "Полный доступ" надо поставить. но это только в редакторе реестра ![]() я сам как - то пытылся ручками дрова прописать в enum... ![]() |
Сообщ.
#5
,
|
|
|
Выходит, что доступа к ключу нельзя получить?
Хм... слабо верится. |
Сообщ.
#6
,
|
|
|
Цитата NiTR0 @ Выходит, что доступа к ключу нельзя получить? угадал ![]() |
Сообщ.
#7
,
|
|
|
Цитата NiTR0 @ Выходит, что доступа к ключу нельзя получить? Хм... слабо верится. Насколько я понимаю, нужно сделать следующее: 1. Открыть ключ реестра с запросом WRITE_OWNER 2. С помощью SetSecurityInfo установить себя OWNER'ом ключа. 3. Переоткрыть ключ реестра с запросом WRITE_DAC и с помощью всё той же SetSecurityInfo установить уже требуемые права. 4. Переоткрыть ключ реестра с KEY_SET_VALUE | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS и чем ещё пожелаешь... |
Сообщ.
#8
,
|
|
|
Цитата NiTR0 @ Выходит, что доступа к ключу нельзя получить? Хм... слабо верится. Открываеш мсдн. Ищеш там ф-цию RegOpenKeyEx. Читаеш вот это Цитата samDesired [in] Access mask that specifies the desired access rights to the key. The function fails if the security descriptor of the key does not permit the requested access for the calling process. For more information, see Registry Key Security and Access Rights. Клацаеш сюда Registry Key Security and Access Rights и имееш свое сичастие. ртфм. |
Сообщ.
#9
,
|
|
|
Hryak, спасибо большое.
Сделано было следующее: ![]() ![]() bool CRegEdit::Open(const std::string & sSubKey, HKEY hKey) { Close(); m_sSubKey = sSubKey; m_hKey = ((hKey == 0) ? s_hDefaultHKEY : hKey); LONG nRegOpenRez = RegOpenKeyEx(m_hKey, m_sSubKey.c_str(), 0, KEY_SET_VALUE | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS, &m_hRegKey); if (nRegOpenRez != ERROR_SUCCESS) { HANDLE hToken; TOKEN_PRIVILEGES tkp; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) return false; if (LookupPrivilegeValue(NULL, SE_TAKE_OWNERSHIP_NAME , &tkp.Privileges[0].Luid)) { tkp.PrivilegeCount = 1; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0); RegOpenKeyEx(m_hKey, m_sSubKey.c_str(), 0, WRITE_OWNER, &m_hRegKey); PSID pSid; PSECURITY_DESCRIPTOR pSD; std::string sName = "MACHINE\\SYSTEM\\ControlSet001\\Enum"; // ...например GetNamedSecurityInfo((LPTSTR) sName.c_str(), SE_REGISTRY_KEY, OWNER_SECURITY_INFORMATION, &pSid, 0, 0, 0, &pSD); SetSecurityInfo(m_hRegKey, SE_REGISTRY_KEY, OWNER_SECURITY_INFORMATION, pSid, NULL, NULL, NULL); RegOpenKeyEx(m_hKey, m_sSubKey.c_str(), 0, WRITE_DAC, &m_hRegKey); //LocalFree(pSD); //? по идее нужно освобождать, но тогда всё вроде выполняется, но в доступе к ключу - отказ PACL pDacl; GetNamedSecurityInfo((LPTSTR) sName.c_str(), SE_REGISTRY_KEY, DACL_SECURITY_INFORMATION, 0, 0, &pDacl, 0, &pSD); ACL_SIZE_INFORMATION asi; GetAclInformation(pDacl, &asi, sizeof(asi), AclSizeInformation); ACL_REVISION_INFORMATION ari; GetAclInformation(pDacl, &ari, sizeof(ari), AclRevisionInformation); BYTE NewDaclBuf[64000]; PACL pNewDacl = (PACL)NewDaclBuf; InitializeAcl(pNewDacl, 64000, ari.AclRevision); AddAccessAllowedAceEx(pNewDacl, ACL_REVISION_DS, CONTAINER_INHERIT_ACE, GENERIC_ALL, pSid); for (DWORD i = 0; i < asi.AceCount; i++) { void* pAce; GetAce(pDacl, i, &pAce); ACE_HEADER* pAceHeader = (ACE_HEADER*)pAce; AddAce(pNewDacl, ari.AclRevision, MAXDWORD, pAce, pAceHeader->AceSize); } SetSecurityInfo(m_hRegKey, SE_REGISTRY_KEY, DACL_SECURITY_INFORMATION, NULL, NULL, pNewDacl, NULL); RegCloseKey(m_hRegKey); nRegOpenRez = RegOpenKeyEx(m_hKey, m_sSubKey.c_str(), 0, KEY_SET_VALUE | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS, &m_hRegKey); LocalFree(pSD); } } return (nRegOpenRez == ERROR_SUCCESS); } ... работает ![]() |
![]() |
Сообщ.
#10
,
|
|
Цитата NiTR0, 16.06.2006, 14:12:01, 1140210 ... работает Если работает, то ето решает много моих проблем.СУПЕР!!! ![]() |