Windows 如何获得写入注册表项的权限?

Windows 如何获得写入注册表项的权限?,windows,winapi,Windows,Winapi,我正在尝试在注册表的HKLM部分下写入一些注册表项。我使用RegCreateKeyEx()和RegSetValueEx()的方式与我所看到的一些MSDN示例类似 但是,RegSetValueEx()调用失败,出现错误5,FormatMessage()表示“访问被拒绝” 我想我需要请求提升权限,但我不知道这样做需要API调用吗 这是我的密码: HKEY hk; DWORD dwDisp; LONG result = RegCreateKeyEx(HKEY_LOCAL_MACHINE, _T("So

我正在尝试在注册表的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);
}

为了对HKLM具有写访问权,您的进程需要以具有管理员权限的用户身份运行。此外,在包含UAC(Vista和更高版本)的系统上,您的进程将需要运行提升版。要实现此目标,请在您的中指定
requireAdministrator

除非绝对必要,否则不要使用提升的权限运行应用程序,这一点很重要。您可以将应用程序中需要写入
HKLM
的部分移动到一次性操作中,例如安装程序。或者,您可以将应用程序分为两部分:以正常权限运行的大部分和需要提升的小部分

您可能需要将应用程序拆分为更小的部分的原因是,用户令牌是在进程启动时分配的,在进程生命周期内无法修改。因此,如果希望提升应用程序的某些部分,而不提升其他部分,则需要有两个不同的进程