我正在尝试在registry的HKLM部分下编写一些registry项。 我以类似于我见过的一些MSDN示例的方式使用RegCreateKeyEx()和RegSetValueEx()。
但是,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
的应用程序部分移动到一次性操作中,例如安装程序。 或者,您可以将应用程序分为两部分:以普通权限运行的大部分,以及需要提升的小部分。
您可能需要将应用程序拆分成更小的部分的原因是用户令牌在进程启动时被分配,并且在进程生命周期中不能被修改。 因此,如果您希望应用程序的某些部分被提升,而其他应用程序则不需要,则需要有两个不同的进程。