На главную Наши проекты:
Журнал   ·   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
  
> Доступ к ключу реестра (с НЕПОЛНЫМИ прав
    Исходные данные:
    Доступ к ключу реестра — чтение (полного доступа нет)

    Задача:
    Работа с ключом (чтение, запись, удаление, перечисление)

    Достигнутый результат:

    ExpandedWrap disabled
      ...
          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);
          }
      ...


    Проблема:
    Не знаю что делать дальше...
    Надо

    ExpandedWrap disabled
      RegOpenKeyEx(m_hKey, m_sSubKey.c_str(), 0, KEY_SET_VALUE | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS, &m_hRegKey);


    , или что-то в этом роде.... вообщем для работы.

    Помогите пожалуйста!
      Цитата NiTR0, 15.06.2006, 11:48:49, 1138519
      Доступ к ключу реестра — чтение (полного доступа нет)

      а каким образом получаешь доступ?не понял...
      Цитата NiTR0, 15.06.2006, 11:48:49, 1138519
      Не знаю что делать дальше...

      всмысле? читать? писать?удалить?создать?
      (в МСДНе Registry Functions, там вроде примеры были...)
        Цитата ElcnU @
        а каким образом получаешь доступ?не понял...

        Я хочу его получить.Условие - права не админские(только чтение).В ручную можно получить: в реестре, в разделе "Разрешения", галочку на "Полный доступ" надо поставить.

        Цитата ElcnU @
        всмысле? читать? писать?удалить?создать?

        Да.(+ перечислять)
        RegOpenKeyEx с параметром WRITE_OWNER открывает ключ, но не даёт этого сделать (должно быть KEY_SET_VALUE | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS)
          Цитата NiTR0, 15.06.2006, 12:42:04, 1138637
          Я хочу его получить.Условие - права не админские(только чтение).В ручную можно получить: в реестре, в разделе "Разрешения", галочку на "Полный доступ" надо поставить.

          но это только в редакторе реестра :yes:
          я сам как - то пытылся ручками дрова прописать в enum... :'(
            Выходит, что доступа к ключу нельзя получить?
            Хм... слабо верится.
              Цитата NiTR0 @
              Выходит, что доступа к ключу нельзя получить?

              угадал :)
                Цитата NiTR0 @
                Выходит, что доступа к ключу нельзя получить?
                Хм... слабо верится.

                Насколько я понимаю, нужно сделать следующее:
                1. Открыть ключ реестра с запросом WRITE_OWNER
                2. С помощью SetSecurityInfo установить себя OWNER'ом ключа.
                3. Переоткрыть ключ реестра с запросом WRITE_DAC и с помощью всё той же SetSecurityInfo установить уже требуемые права.
                4. Переоткрыть ключ реестра с KEY_SET_VALUE | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS и чем ещё пожелаешь...
                  Цитата 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 и имееш свое сичастие.

                  ртфм.
                    Hryak, спасибо большое.

                    Сделано было следующее:
                    ExpandedWrap disabled
                      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);
                      }

                    ... работает :D
                      Цитата NiTR0, 16.06.2006, 14:12:01, 1140210
                      ... работает

                      Если работает, то ето решает много моих проблем.СУПЕР!!! :yes:
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0369 ]   [ 16 queries used ]   [ Generated: 29.08.25, 19:35 GMT ]