RegSetValueEx 静默无法写入 HKLM

RegSetValueEx silently fails to write to HKLM

我正在尝试从我的 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" ;
}

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

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

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

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