创建注册表项 - 访问被拒绝

时间:2012-10-25 14:29:30

标签: c++ winapi

您好我正在尝试在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;

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

继承人怎么做;在Solution Explorer中右键单击您的解决方案,然后选择Properties;转到配置属性 - >链接器 - >清单文件;将UAC执行级别设置为“requireAdministrator”。

下次点击运行时,它会提示您以管理员身份打开它,然后它会允许您更改密钥。我不知道如何与其他编译器一起使用,但它应该是相对相同的。但是,它总是会要求您提供管理员权限,即使在发布时也是如此,对大多数程序来说并不理想。如果这是一个安装程序或其他什么,那么我说这没关系,但如果这是一个会运行很多的应用程序,我建议使用HKEY_LOCAL_USER,它不需要管理员权限。我最近经历了所有那些malarkey并且注册表是一个蠢货,所以我建议尽可能避免它!

希望有所帮助!