C++ REG_SZ 到 char* 并在没有提升权限的情况下读取 HKLM

标签 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 但它仍然可以读取它吗?

最佳答案

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

问题可能是您正在返回 value,这是一个堆栈分配的缓冲区。如果您将函数声明为返回 char[256],这将起作用——如果您试图返回 char*,然后调用者获取 value 中第一个字节的地址,它现在指向无效的堆栈数据。您应该在堆上将 value 分配为 char*,这样您就可以不受惩罚地返回指针。

是否允许您读取或编辑注册表项取决于将哪些 ACL 应用于您正在阅读的注册表项。可以将 key 的权限设置为未提升权限的用户甚至无法读取 key ,但也可以将权限设置为所有用户都可以读取和写入.您在上面阅读的 key 应该对所有用户都是可读的,但除了管理员外,它是不可修改的。

关于C++ REG_SZ 到 char* 并在没有提升权限的情况下读取 HKLM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3175449/

相关文章:

c++ - 修改指向另一个指针的指针

c++ - opencv - 图像乘法

windows - 超时 = 0 的 WaitForSingleObjects

c++ - 如何在 Windows 上构建 git?

windows - 如何允许在 Delphi 中为特定控件拖动文件

php - 使用 PHP 和 DOTNET 类访问 Windows 注册表

c++ - Visual Studio错误C2027

c++ - 每次循环时都会创建相同的随机数。

powershell - 使用 powershell 从多台计算机中提取注册表值

c# - 是否有类似 Environment.SpecialFolder 的内容,但用于注册表路径