我正在尝试在注册表的HKLM部分下编写一些注册表项。我使用RegCreateKeyEx()和RegSetValueEx()的方式类似于我见过的一些MSDN示例。
但是,RegSetValueEx()调用失败,错误5,FormatMessage()表示“访问被拒绝”
我认为我需要提升权限,但我不知道执行此操作所需的API调用?
这是我的代码:
HKEY hk;
DWORD dwDisp;
LONG result = RegCreateKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\MyApp"), 0, NULL,
REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hk, &dwDisp);
if(result == ERROR_SUCCESS)
{
BYTE value[] = "Hello world!";
result = RegSetValueEx(hk, _T("MyValue"), 0, REG_EXPAND_SZ, value, strlen((char*)value)+1);
if(result != ERROR_SUCCESS)
{
DBG_PRINT2("RegSetValueEx failed with code: %d\n", result);
}
RegCloseKey(hk);
}
答案 0 :(得分:6)
为了拥有对HKLM的写入权限,您的流程需要以具有管理员权限的用户身份运行。此外,在包含UAC(Vista和更高版本)的系统上,您的流程需要提升。为此,请在application manifest中指定requireAdministrator
。
除非绝对必要,否则不要使用提升的权限运行应用程序。您可以将需要写入HKLM
的应用程序部分移动到仅一次操作,例如你的安装程序。或者,您可以将应用程序分为两部分:以正常权限运行的大部分和需要提升的小部分。
您可能需要将应用程序拆分为较小的部分的原因是用户令牌在进程启动时分配,并且在进程的生命周期内无法修改。因此,如果您希望提升应用程序的某些部分而不提升其他部分,则需要有两个不同的流程。