Inno Setup为登录用户创建注册表项(不是管理员用户)

时间:2015-03-03 05:33:16

标签: registry inno-setup regedit

当我遇到此问题时,我尝试使用Inno设置创建安装程序,其他所有内容都已安装,但是当前用户未安装注册表项,我无法在其中找到它HKEY_CURRENT_USER。但是当我尝试以管理员身份运行Regedit时,就会在那里安装注册表。我已启用UAC并使用管理员帐户验证要运行的安装,为什么会发生这种情况?

这是我的Registry部分

[Registry]
Root: HKCU; Subkey:Software; Flags: uninsdeletekey; ValueName:ABS; ValueType:string; ValueData:ABS;
Root: HKCU; Subkey:Software\Microsoft\Office\Word\Addins\ABS.ScriptManager; Flags: uninsdeletekey;
Root: HKCU; Subkey:Software\Microsoft\Office\Word\Addins\ABS.ScriptManager; ValueName:Description; ValueType:string; ValueData:Script Manager; Flags: uninsdeletekey;

注意:我正在运行32位Windows 7

3 个答案:

答案 0 :(得分:1)

我认为您不能从Inno Setup明确写入登录用户的注册表项。您可以写入仅运行安装程序的用户的注册表项。

您可以通过HKEY_USERS写入任何(或所有)用户的注册表项,但我不知道,如果您知道,哪位用户已登录。


但您可以使用runasoriginaluser标志或ExecAsOriginalUser函数执行一个外部应用程序,该应用程序将注册表项作为安装的一部分进行编写。

您可以使用reg.exe

[Run]
Filename: reg.exe; Parameters: "ADD HKCU\Software\MyProgram /v Foo /t REG_SZ /d Bar"; \
    Flags: runasoriginaluser runhidden

procedure CurStepChanged(CurStep: TSetupStep);
var
  Params: string;
  ResultCode: Integer;
begin
  if CurStep = ssPostInstall then
  begin
    Log('Adding registry key for original user');
    Params := 'ADD HKCU\Software\xxxx /v Foo /t REG_SZ /d Bar';
    if ExecAsOriginalUser(
         'reg.exe', Params, '', SW_HIDE, ewWaitUntilTerminated, ResultCode) and
       (ResultCode = 0) then
    begin
      Log('Added registry key for original user');
    end
      else
    begin
      Log('Error adding registry key for original user');
    end;
  end;
end;

该想法的致谢:@Markus

答案 1 :(得分:0)

根据您问题的措辞,听起来这是因为您“正在使用管理员帐户验证要运行的安装”。如果是这种情况,并且您在UAC提示符下输入了另一个帐户(来自您登录的帐户),则当前用户实际上将成为您刚刚在UAC提示下输入的管理员帐户,而不是您记录的帐户在...您可能需要做的是使用runasoriginaluser函数,该函数将使用登录的用户凭据而不是您在UAC提示符下输入的帐户。

答案 2 :(得分:-1)

部分中的

: 文件名:reg.exe;参数:“IMPORT ...”和flag:runascurrentuser!