не может запрашивать значения из реестра Windows

0

Я пишу программу для реестра Windows и пытаюсь запросить значения из нее, но даже если я запускаю свою собственную программу с разрешениями администратора, я не могу прочитать все параметры и получить код ошибки 5 - Access Denied для некоторых значений. Но в то же время стандартный реджит мог показать мне эту ценность. Что я делал неправильно?

У меня есть класс для реестра RegistryClass

RegistryClass.h:

class RegistryClass
{
    HKEY hKey;
    public:
        int GetCountOfKeys();
        bool OpenKey(HKEY key, std::string path);
        void EnumKeys(char ** result, int * count);
        ...
}

RegistryClass.cpp

#include "RegistryClass.h"
...
bool RegistryClass::OpenKey(HKEY key, std::string path)
{
    if(RegOpenKeyExA(key,path.c_str(),NULL,KEY_ALL_ACCESS,&hKey) == ERROR_SUCCESS)
    {
        return true;
    }
    hKey = NULL;
    return false;
}

int RegistryClass::GetCountOfKeys()
{
    DWORD count  = 0;
    char keyName [256];
    DWORD len = 255;
    while(1)
    {
        if(RegEnumKeyExA(hKey,count,keyName,&len,NULL,NULL,NULL,NULL) != ERROR_SUCCESS)
            break;

        count++;
        len = 255;
    }
    return count;
}

void RegistryClass::EnumKeys(char ** result, int * count)
{
    if(hKey == NULL)
        return;
    *count = 0;
    DWORD dwIndex = 0;          // current key
    char keyName [255];         // current key name
    DWORD lpcchName = 255;      // name length
    int error;
    do
    {
        error = RegEnumKeyExA(hKey,dwIndex,keyName,&lpcchName,NULL,NULL,NULL,NULL);
        if(error == ERROR_SUCCESS)
        {
            memcpy(result[(*count)],keyName,lpcchName);
            (*count)++;
        }
        dwIndex++;
        lpcchName = 255;
    }while(error == ERROR_SUCCESS);
}

в основной программе я пытаюсь извлечь ключи

void MainWindow::InitializeFirstState()
{
    item_HKEY_CLASSES_ROOT = new QTreeWidgetItem();
    item_HKEY_CLASSES_ROOT->setText(0,"HKEY_CLASSES_ROOT");
    // and other keys
    ...
    tree->addTopLevelItem(item_HKEY_CLASSES_ROOT);
    ...
    AddInternalKeys(item_HKEY_CLASSES_ROOT,true);
    ...
}

...

void AddInternalKeys(QTreeWidgetItem * item, bool rec)
{
    std::string currentPath = GetFullPathKey(item);
    // first key name
    std::string keyName = GetParentKeyName(item);

    RegistryClass * regC = new RegistryClass();
    HKEY key;

    if(strcmp(keyName.c_str(),"HKEY_CLASSES_ROOT") == 0)
    {
        key = HKEY_CLASSES_ROOT;
    }
    else if(strcmp(keyName.c_str(),"HKEY_CURRENT_USER") == 0)
    {
        key = HKEY_CURRENT_USER;
    }
    else if(strcmp(keyName.c_str(),"HKEY_LOCAL_MACHINE") == 0)
    {
        key = HKEY_LOCAL_MACHINE;
    }
    else if(strcmp(keyName.c_str(),"HKEY_USERS") == 0)
    {
        key = HKEY_USERS;
    }
    else // HKEY_CURRENT_CONFIG
    {
        key = HKEY_CURRENT_CONFIG;
    }

    if(regC->OpenKey(key,currentPath) == true)
    {
         internalLog->print("key opened succesfully\n");
    }
    else internalLog->print("key was not opened\n");

    int count = regC->GetCountOfKeys();

    char ** keys = (char **) malloc(sizeof(char *) * count);
    for(int i=0;i<count;i++)
    {
        keys[i] = (char *) malloc(sizeof(char) * 256);
        memset(keys[i],0,sizeof(char) * 256);
    }
    regC->EnumKeys(keys,&count);

    regC->CloseKey();
    delete regC;
    QTreeWidgetItem * newItem;
    count--;
    while(count >= 0)
    {
        newItem = new QTreeWidgetItem();
        newItem->setText(0,keys[count]);
        item->addChild(newItem);
        std::string str = keys[count];
        AddKeyNames(newItem,str);
        free(keys[count]);
        if(rec == true)
            AddInternalKeys(newItem,false);
        count--;
    }
    free(keys);
}
  • 0
    Вы можете опубликовать свой код, который вы сделали до сих пор :-)
  • 0
    Это также помогло бы узнать, какие ключи у вас возникают трудности при чтении.
Показать ещё 4 комментария
Теги:
winapi

1 ответ

2
Лучший ответ

Вы запрашиваете слишком большой доступ. Вы запрашиваете KEY_ALL_ACCESS когда все, что вам действительно нужно, это KEY_READ. У вас нет всех прав доступа, но у вас есть разрешение на чтение.

  • 0
    большое Вам спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню