C ++ REG_SZ到char *和读取HKLM没有提升权限

时间:2010-07-04 16:55:45

标签: c++ windows registry uac

所以我一直在尝试从注册表中获取REG_SZ值并将其存储为char *。环顾互联网后,这就是我想到的。问题是我获得的值不是存储在注册表中的值,我得到了一堆随机垃圾。我怎样才能正确获得价值?

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 个答案:

答案 0 :(得分:5)

已更新,因为之前的回答是错误的。)

问题可能是你正在退回value,这是一个堆栈分配的缓冲区。如果您将函数声明为返回char[256],则此操作只能 - 如果您尝试返回char*,则调用者将获取第一个地址value中的字节,现在指向无效的堆栈数据。您应该在堆上分配value作为char*,这将允许您返回指针而不受惩罚。

是否允许您阅读或编辑注册表项取决于您正在阅读的密钥应用了哪些ACL。可以设置密钥的权限,使得未经高速度的用户甚至无法读取密钥,但也可以设置权限,以便所有用户都可以读取和写入。您在上面阅读的密钥应该可供所有用户阅读,但除了管理员之外,它不会被修改。

答案 1 :(得分:1)

如果您的申请没有明显,则可能会或可能不会阅读真正的HKLM。如果它曾试图写入HKLM注册表,虚拟化将启动并转移写入并读取虚拟化的每用户存储。当您不是管理员时,您可以阅读HKLM,因此请务必添加带有asInvoker的清单以防止虚拟化。

答案 2 :(得分:1)

主要问题已经回答,但与您的访问问题有关。如果您希望对注册表具有写入权限,则必须添加清单文件以将进程提升为管理员。

答案 3 :(得分:1)

  1. 您不应该返回非静态本地声明的变量;尝试将变量声明为static char value[256];,这仍然是一种不好的做法,但可以解决您的问题;

  2. 如果你仍然垃圾,也许你正在编译定义UNICODE。如果是这样,您正在调用RegQueryValueExW,并且您获得了一个宽字符串(没有编译时错误,因为参数已转换为(LPBYTE))。尝试禁用UNICODE或将字符串定义为TCHAR