仅在需要时才使Inno Setup安装程序请求特权提升

马丁·普里克里(Martin Prikryl)

启动安装程序时,如果需要特权提升,则Inno Setup安装程序具有可用于控制PrivilegesRequired指令我希望我的安装程序即使对于非管理员用户也可以使用(将我的应用安装到用户文件夹而不是上没有问题Program Files)。因此,我将设置PrivilegesRequirednone(未记录的值)。这使得UAC提示仅针对管理员用户弹出,因此他们甚至可以安装到Program Files非管理员用户没有UAC提示,因此即使他们也可以将应用程序安装(到用户文件夹)。

但是,这有一些缺点:

  • 某些人在其计算机上使用不同的管理员帐户和非管理员帐户,通常使用非管理员帐户。通常,使用非管理员帐户启动安装时,当他们收到UAC提示时,会输入管理员帐户的凭据以继续进行操作。但这不适用于我的安装程序,因为没有UAC提示。
  • (过于可疑)具有管理员帐户的用户,想要安装到用户文件夹,如果没有(不需要)管理员权限,则无法启动我的安装程序。

有什么方法可以仅在需要时(当用户选择仅管理员帐户可写的安装文件夹时)使Inno Setup请求特权提升吗?

我认为Inno Setup中对此没有任何设置。但是可能有一个程序化的解决方案(Inno Setup Pascal脚本)或某种插件/ DLL。


请注意,Inno Setup 6内置了对非管理安装模式的支持

马丁·普里克里(Martin Prikryl)

Inno Setup 6内置了对非管理安装模式的支持

基本上,您可以简单地设置PrivilegesRequiredOverridesAllowed

[Setup]
PrivilegesRequiredOverridesAllowed=commandline dialog

在此处输入图片说明


以下是基于@TLama的答案,我(现在已经过时)的Inno Setup 5解决方案

当安装程序非高程启动时,它将请求高程,但有一些例外:

  • 仅适用于Windows Vista和更高版本(尽管它也适用于Windows XP)
  • 升级时,安装程​​序将检查当前用户是否对先前的安装位置具有写权限。如果用户具有写访问权,则安装程序将不会请求提升权限。因此,如果用户先前已将应用程序安装到用户文件夹,则在升级时将不会要求提升高度。

如果用户拒绝新安装的提升,安装程序将自动回退到“本地应用程序数据”文件夹。C:\Users\standard\AppData\Local\AppName

其他改进:

  • 高架实例不再要求语言
  • 通过使用PrivilegesRequired=none,安装程序将HKLM在提升权限将卸载信息写入,而不是HKCU
#define AppId "myapp"
#define AppName "MyApp"

#define InnoSetupReg \
  "Software\Microsoft\Windows\CurrentVersion\Uninstall\" + AppId + "_is1"
#define InnoSetupAppPathReg "Inno Setup: App Path"

[Setup]
AppId={#AppId}
PrivilegesRequired=none
...

[Code]

function IsWinVista: Boolean;
begin
  Result := (GetWindowsVersion >= $06000000);
end;

function HaveWriteAccessToApp: Boolean;
var
  FileName: string;
begin
  FileName := AddBackslash(WizardDirValue) + 'writetest.tmp';
  Result := SaveStringToFile(FileName, 'test', False);
  if Result then
  begin
    Log(Format(
      'Have write access to the last installation path [%s]', [WizardDirValue]));
    DeleteFile(FileName);
  end
    else
  begin
    Log(Format('Does not have write access to the last installation path [%s]', [
      WizardDirValue]));
  end;
end;

procedure ExitProcess(uExitCode: UINT);
  external '[email protected] stdcall';
function ShellExecute(hwnd: HWND; lpOperation: string; lpFile: string;
  lpParameters: string; lpDirectory: string; nShowCmd: Integer): THandle;
  external '[email protected] stdcall';

function Elevate: Boolean;
var
  I: Integer;
  RetVal: Integer;
  Params: string;
  S: string;
begin
  { Collect current instance parameters }
  for I := 1 to ParamCount do
  begin
    S := ParamStr(I);
    { Unique log file name for the elevated instance }
    if CompareText(Copy(S, 1, 5), '/LOG=') = 0 then
    begin
      S := S + '-elevated';
    end;
    { Do not pass our /SL5 switch }
    if CompareText(Copy(S, 1, 5), '/SL5=') <> 0 then
    begin
      Params := Params + AddQuotes(S) + ' ';
    end;
  end;

  { ... and add selected language }
  Params := Params + '/LANG=' + ActiveLanguage;

  Log(Format('Elevating setup with parameters [%s]', [Params]));
  RetVal := ShellExecute(0, 'runas', ExpandConstant('{srcexe}'), Params, '', SW_SHOW);
  Log(Format('Running elevated setup returned [%d]', [RetVal]));
  Result := (RetVal > 32);
  { if elevated executing of this setup succeeded, then... }
  if Result then
  begin
    Log('Elevation succeeded');
    { exit this non-elevated setup instance }
    ExitProcess(0);
  end
    else
  begin
    Log(Format('Elevation failed [%s]', [SysErrorMessage(RetVal)]));
  end;
end;

procedure InitializeWizard;
var
  S: string;
  Upgrade: Boolean;
begin
  Upgrade :=
    RegQueryStringValue(HKLM, '{#InnoSetupReg}', '{#InnoSetupAppPathReg}', S) or
    RegQueryStringValue(HKCU, '{#InnoSetupReg}', '{#InnoSetupAppPathReg}', S);

  { elevate }

  if not IsWinVista then
  begin
    Log(Format('This version of Windows [%x] does not support elevation', [
      GetWindowsVersion]));
  end
    else
  if IsAdminLoggedOn then
  begin
    Log('Running elevated');
  end
    else
  begin
    Log('Running non-elevated');
    if Upgrade then
    begin
      if not HaveWriteAccessToApp then
      begin
        Elevate;
      end;
    end
      else
    begin
      if not Elevate then
      begin
        WizardForm.DirEdit.Text := ExpandConstant('{localappdata}\{#AppName}');
        Log(Format('Falling back to local application user folder [%s]', [
          WizardForm.DirEdit.Text]));
      end;
    end;
  end;
end;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Inno Setup:仅在非常安静时安装

来自分类Dev

仅在安装了模块时才需要

来自分类Dev

仅在需要时才使Inno Setup安装程序请求特权提升

来自分类Dev

Python-仅在不满足依赖性的情况下才需要安装Pip

来自分类Dev

Inno Setup-用于多个安装程序的安装程序

来自分类Dev

仅在需要卸载时才处理此卸载程序代码吗?

来自分类Dev

如何实现仅在需要时才修改原始模块的插件?

来自分类Dev

当Inno Setup安装失败时(在安装程序本身内),如何调用exe?

来自分类Dev

仅在需要时才注入模块依赖项(如插件)

来自分类Dev

Inno Setup:仅在检查其组件后才运行外部驱动程序安装程序

来自分类Dev

仅在水疗中心需要时才如何包括Vue组件?

来自分类Dev

如何仅在需要时才询问SSH密钥密码?

来自分类Dev

节点:PORT 443需要提升的特权错误

来自分类Dev

设置Inno Setup卸载程序的外观时,为什么需要使用uninsneveruninstall标志?

来自分类Dev

仅在使用Echo的Laravel-Vue js应用程序中需要时才与Pusher建立连接

来自分类Dev

仅在用户输入需要时才创建变量?

来自分类Dev

Inno Setup:仅在不静音时安装

来自分类Dev

仅在安装了模块的情况下才需要

来自分类Dev

$ http仅在发出简单的ajax请求时才调用错误?

来自分类Dev

npm更新-仅在未安装模块/已安装最新版本时才更新

来自分类Dev

Inno Setup-用于多个安装程序的安装程序

来自分类Dev

仅在运行repl时安装了必需的库时,才不会发生导入错误

来自分类Dev

R /发光:仅在闪亮的应用程序中需要时才渲染图的元素

来自分类Dev

使用MSI / WiX安装升级Inno Setup安装时,已安装程序中的重复条目

来自分类Dev

Inno Setup:仅在检查其组件后才运行外部驱动程序安装程序

来自分类Dev

Inno Setup:仅在需要时创建卸载注册表项

来自分类Dev

使用Inno Setup创建透明的安装程序?

来自分类Dev

MongoDB 仅在请求中存在不同字段时才查询不同的字段

来自分类Dev

如何执行python Web API请求仅在存在时才返回值

Related 相关文章

  1. 1

    Inno Setup:仅在非常安静时安装

  2. 2

    仅在安装了模块时才需要

  3. 3

    仅在需要时才使Inno Setup安装程序请求特权提升

  4. 4

    Python-仅在不满足依赖性的情况下才需要安装Pip

  5. 5

    Inno Setup-用于多个安装程序的安装程序

  6. 6

    仅在需要卸载时才处理此卸载程序代码吗?

  7. 7

    如何实现仅在需要时才修改原始模块的插件?

  8. 8

    当Inno Setup安装失败时(在安装程序本身内),如何调用exe?

  9. 9

    仅在需要时才注入模块依赖项(如插件)

  10. 10

    Inno Setup:仅在检查其组件后才运行外部驱动程序安装程序

  11. 11

    仅在水疗中心需要时才如何包括Vue组件?

  12. 12

    如何仅在需要时才询问SSH密钥密码?

  13. 13

    节点:PORT 443需要提升的特权错误

  14. 14

    设置Inno Setup卸载程序的外观时,为什么需要使用uninsneveruninstall标志?

  15. 15

    仅在使用Echo的Laravel-Vue js应用程序中需要时才与Pusher建立连接

  16. 16

    仅在用户输入需要时才创建变量?

  17. 17

    Inno Setup:仅在不静音时安装

  18. 18

    仅在安装了模块的情况下才需要

  19. 19

    $ http仅在发出简单的ajax请求时才调用错误?

  20. 20

    npm更新-仅在未安装模块/已安装最新版本时才更新

  21. 21

    Inno Setup-用于多个安装程序的安装程序

  22. 22

    仅在运行repl时安装了必需的库时,才不会发生导入错误

  23. 23

    R /发光:仅在闪亮的应用程序中需要时才渲染图的元素

  24. 24

    使用MSI / WiX安装升级Inno Setup安装时,已安装程序中的重复条目

  25. 25

    Inno Setup:仅在检查其组件后才运行外部驱动程序安装程序

  26. 26

    Inno Setup:仅在需要时创建卸载注册表项

  27. 27

    使用Inno Setup创建透明的安装程序?

  28. 28

    MongoDB 仅在请求中存在不同字段时才查询不同的字段

  29. 29

    如何执行python Web API请求仅在存在时才返回值

热门标签

归档