C ++ REG_SZ на char * и чтение HKLM без повышенных разрешений - PullRequest
2 голосов
/ 04 июля 2010

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

HKEY hKey;
char value[256];
// Open the key
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0\\", 0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS)
{
    return "";
}

// Read the value
DWORD dwType = REG_SZ;
DWORD dwCount = sizeof(value);
if(RegQueryValueEx(hKey, "ProcessorNameString", NULL, &dwType, (LPBYTE)&value, &dwCount) != ERROR_SUCCESS)
{
    RegCloseKey(hKey);
    return "";
}
// Cleanup and return
RegCloseKey(hKey);
return value;

Также другой быстрый вопрос.Я помню, что если мой инстанс программы работает как администратор Vista / 7, он не может редактировать HKLM, но может ли он его прочитать?

Ответы [ 4 ]

5 голосов
/ 04 июля 2010

( Обновлено , поскольку предыдущий ответ был неверным.)

Возможно, проблема в том, что вы получаете ретушь value, которая является буфером, выделенным стеком.Это будет работать только , если вы объявили свою функцию как возвращающую char[256] - если вы пытаетесь вернуть char*, то вызывающая сторона получает адрес первого байта в value, который теперь указывает на неверные данные стека.Вы должны выделить value как char* в куче, что позволит вам безнаказанно возвращать указатель.

То, разрешено ли вам читать или редактировать раздел реестра, зависит от того, какие списки ACL являютсяприменяется к ключу, который вы читаете.Можно установить разрешения для ключа таким образом, чтобы не имеющий прав пользователь не мог даже прочитать ключ, но также можно установить разрешения таким образом, чтобы все пользователи могли как читать, так и писать.Ключ, который вы читаете выше , должен быть доступен для чтения всем пользователям, но он не может быть изменен, кроме как администраторами.

1 голос
/ 04 июля 2010
  1. Вы не должны возвращать нестатическую локально объявленную переменную; попытайтесь объявить переменную как static char value[256];, это все еще плохая практика, но может решить вашу проблему;

  2. Если вы все еще получаете мусор, возможно, вы компилируете с определением UNICODE. Если это так, вы звоните RegQueryValueExW и получаете широкую строку символов (нет ошибки времени компиляции, поскольку параметр приведен к (LPBYTE)). Попробуйте отключить UNICODE или определить вашу строку как TCHAR.

1 голос
/ 04 июля 2010

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

1 голос
/ 04 июля 2010

Если ваше приложение не имеет манифеста, оно может или не может прочитать настоящий HKLM. Если он когда-либо попытается выполнить запись в реестр HKLM, виртуализация включит и перенаправит записи, а также выполнит чтение в виртуализованное хранилище для каждого пользователя. Вам разрешено читать HKLM, когда вы не являетесь администратором, поэтому обязательно добавьте манифест с asInvoker для предотвращения виртуализации.

...