【问题标题】:RegSetValueEx silently fails to write to HKLMRegSetValueEx 静默无法写入 HKLM
【发布时间】:2015-07-07 10:23:25
【问题描述】:

我正在尝试从我的 C++ 应用程序中写入 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run,如下所示:

HKEY key;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"), NULL, KEY_ALL_ACCESS, &key) == ERROR_SUCCESS){
    if (RegSetValueEx(key, TEXT("lcr"), 0, REG_SZ, (const BYTE*)runcmd.c_str(), (runcmd.size()+1)*sizeof(wchar_t)) != ERROR_SUCCESS){
        cout << "ERROR" ;
    }else{
        cout << "OK" << endl;
    }
    RegCloseKey(key);
}else{
    cout << "ERROR" ;
}

但它默默地失败了,什么也没有发生!
我尝试以普通用户身份运行和以管理员身份运行。
有什么问题?

【问题讨论】:

  • 捕获返回码并检查它们。
  • @AlexK。 : 我是!没有错误代码! HKCU 炒锅,但 HKLM 无声无息地失败了
  • “静默失败”是指存在您的问题中未包含的错误代码?

标签: c++ windows winapi registry


【解决方案1】:

问题是您的应用程序受制于 UAC registry virtualization。因为您没有在应用程序中包含清单,所以系统会进入 XP (!) 兼容模式。当您在 HKLM 下写入注册表的受限部分时,系统会将它们重定向到 HKCU 下的所谓虚拟存储。

您应该向您的应用程序添加一个清单,以便您不再被虚拟化。如果您确实需要写信给 HKLM,那么您需要在清单中指定 requireAdministrator 选项,以便以提升的权限执行您的应用程序。

您的下一步可能是花一些时间阅读我在上面链接到的文档,并确保您完全理解 UAC 的所有含义。

【讨论】:

  • per the documentation 除外:“注册表虚拟化已为以下各项禁用:...HKEY_LOCAL_MACHINE\Software\ClassesHKEY_LOCAL_MACHINE\Software\Microsoft\Windows 和 @ 的键和子键987654326@." 因此,由于存在问题的 特定 键,应用程序是否显示并不重要(但应该是一般显示)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
  • 2014-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多