【问题标题】:How to use RegCreateKeyEx?如何使用 RegCreateKeyEx?
【发布时间】:2015-03-18 06:28:45
【问题描述】:

我有一个关于在 C++ 中使用 RegCreateKeyEx 的问题。 当我尝试在 HKLM 下创建密钥时 - 它不起作用, 但在其他情况下(在 HKCU 创建密钥)- 它运行良好(可以创建密钥)。

我的操作系统是 win7 x86 - 使用 RegCreateKeyEx 时是否重要?

我运行的代码如下:

#include<Windows.h>
#include<stdio.h>

int main()
{
    HKEY hKey;
    LONG result = 0;
    char filename[] = "C:\test.jpg";
    char *path = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\test";

    if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, path, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS)
        printf("1. success \n"); // ← doesn`t work 
    else printf("fail\n");

    if (RegCreateKeyEx(HKEY_CURRENT_USER, "Console\papadaks", 0, NULL,       
            REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS)
        printf("2. success \n");  // ← works well 
    else printf("fail\n");

    return 0;
}

谢谢。

【问题讨论】:

  • 这里有几个问题:请使用网络搜索来查找示例代码。 “不起作用”不足以描述问题。代码格式不一致。 "C:\test.jpg" 是一个包含制表符的字符串文字。相应的函数究竟会发出什么错误信号,请查看他们的文档如何确定有关错误的更多信息。
  • 首先,read the documentation 并特别注意访问权限和虚拟化部分。然后,使用FormatMessage 获取失败原因的实际描述。可能是参数不正确,也可能是安全问题,你不检查就不知道。
  • 你也可以阅读这个:stackoverflow.com/questions/3146666/… 它基本上说除非你是一个提升的进程,否则你会遇到写入 HKLM 的问题。
  • 失败时,GetLastError() 返回什么?能否在 winerror.h(定义所有错误代码的 Windows SDK 头文件)中搜索该错误代码?

标签: c++ registrykey


【解决方案1】:

您几乎肯定会收到错误 5(拒绝访问),因为即使您是该计算机的管理员,对于 UAC 下的 NT6 变体,您也需要提升权限。仅仅因为您使用管理员帐户登录并不意味着您拥有实际管理员权限,这要归功于 UAC 的奇迹。这其实是一件的事情。

您可以通过临时修改您在其下创建的 HKLM 注册表项的安全性来测试此假设,以允许每个人都具有写入能力(请记住在之后将其设置回来)。然后你的代码就可以工作了……你的系统会稍微不安全。

适当的方法是为您的应用提供一个清单,将其标记为需要提升,因此用户要么必须承认允许更改(如果他们是管理员),要么去寻找真正的人 管理员输入密码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 2011-12-01
    • 2013-01-13
    • 2021-03-05
    • 1970-01-01
    相关资源
    最近更新 更多