1

嗨,我正在尝试在 C++ 中创建一个注册表项,但我不断收到错误 5,谷歌搜索告诉我访问被拒绝,但我不知道要获得正确的权限。我正在使用 Windows 7,这是我的代码。谢谢

HRESULT hr = S_OK;
UINT er = ERROR_SUCCESS;
LPWSTR szValueBuf = NULL;
char szProductName[MAX_PATH];
LPSECURITY_ATTRIBUTES lpsa;
HKEY hOrchKey;
DWORD dwOpenStatus,
      dwType;
char szProuductKey[MAX_PATH];

hr = WcaInitialize(hInstall, "CreateProductKey");
ExitOnFailure(hr, "Failed to initialize");

WcaLog(LOGMSG_STANDARD, "Initialized.");


if (!(lpsa = default_sa()))
    return FALSE;

hr = WcaGetProperty(L"PRODUCTNAME",&szValueBuf);
ExitOnFailure(hr, "failed to get Product Name");

wcstombs(szProductName, szValueBuf, 260);

sprintf(szProuductKey,"SOFTWARE\\Company\\%s",szProductName);

// Open the registery Orchestrator key
if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,
                szProuductKey,
                0,
                "",
                REG_OPTION_NON_VOLATILE,
                KEY_QUERY_VALUE,
                lpsa,
                &hOrchKey,
                &dwOpenStatus) != ERROR_SUCCESS )
    return FALSE;   

OS_RegCloseKey(hOrchKey);
return TRUE;
4

2 回答 2

3

以管理员身份运行以提升访问权限运行它。

于 2012-10-25T15:07:12.937 回答
2

您必须以管理员身份访问注册表项 HKEY_LOCAL_MACHINE 才能编辑值。(例如,如果您想通过注册表编辑器应用程序编辑密钥,则必须右键单击并选择“以管理员身份运行”)由于您想在代码中编写值,因此您需要将编译器设置为具有管理员权限运行时的权利。在 Visual Studio 2008 中,这可以在解决方案的属性页中完成,您将其设置为以管理员身份运行。

这是怎么做的;在解决方案资源管理器中右键单击您的解决方案,然后选择属性;转到配置属性->链接器->清单文件;将 UAC 执行级别设置为“requireAdministrator”。

下次你点击运行时,它应该会提示你以管理员身份打开它,然后它会允许你更改密钥。我不确定如何使用其他编译器执行此操作,但它应该是相对相同的。但是,即使在发行版中,它也会始终要求您提供管理员权限,这对于大多数程序来说并不理想。如果这是一个安装程序或其他东西,那么我会说这很好,但如果这是一个会经常运行的应用程序,我建议使用 HKEY_LOCAL_USER,它不需要管理员权限。我最近经历了所有这些问题,而注册表是一个正确的婊子,所以我建议尽可能避免它!

希望有帮助!

于 2012-10-25T15:23:29.940 回答