日志含义RegSetValueEx写HKLM静默失败

RegSetValueEx silently fails to write to HKLM

本文关键字:HKLM 静默 失败 RegSetValueEx 日志      更新时间:2023-10-16

我正试图从我的c++应用程序中编写HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun:

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注册表虚拟化。因为您没有在应用程序中包含清单,所以系统会进入XP(!)兼容模式。当你在HKLM下写入注册表的受限部分时,系统会将它们重定向到HKCU下的虚拟商店。

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

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